tipc: replace port pointer with socket pointer in registry
In order to make tipc_sock the only entity referencable from other parts of the stack, we add a tipc_sock pointer instead of a tipc_port pointer to the registry. As a consequence, we also let the function tipc_port_lock() return a pointer to a tipc_sock instead of a tipc_port. We keep the function's name for now, since the lock still is owned by the port. This is another step in the direction of eliminating port_lock, replacing its usage with lock_sock() and bh_lock_sock(). Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Reviewed-by: Erik Hugne <erik.hugne@ericsson.com> Reviewed-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5a9ee0be33
commit
9b50fd087a
|
@ -101,9 +101,9 @@ void tipc_port_reinit(void);
|
|||
/**
|
||||
* tipc_port_lock - lock port instance referred to and return its pointer
|
||||
*/
|
||||
static inline struct tipc_port *tipc_port_lock(u32 ref)
|
||||
static inline struct tipc_sock *tipc_port_lock(u32 ref)
|
||||
{
|
||||
return (struct tipc_port *)tipc_ref_lock(ref);
|
||||
return (struct tipc_sock *)tipc_ref_lock(ref);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -115,11 +115,7 @@ static struct proto tipc_proto_kern;
|
|||
*/
|
||||
static struct tipc_sock *tipc_sk_lock_next(u32 *ref)
|
||||
{
|
||||
struct tipc_port *port = (struct tipc_port *)tipc_ref_lock_next(ref);
|
||||
|
||||
if (!port)
|
||||
return NULL;
|
||||
return tipc_port_to_sock(port);
|
||||
return (struct tipc_sock *)tipc_ref_lock_next(ref);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -204,7 +200,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock,
|
|||
|
||||
tsk = tipc_sk(sk);
|
||||
port = &tsk->port;
|
||||
ref = tipc_ref_acquire(port, &port->lock);
|
||||
ref = tipc_ref_acquire(tsk, &port->lock);
|
||||
if (!ref) {
|
||||
pr_warn("Socket create failed; reference table exhausted\n");
|
||||
return -ENOMEM;
|
||||
|
@ -1655,13 +1651,12 @@ int tipc_sk_rcv(struct sk_buff *buf)
|
|||
u32 dnode;
|
||||
|
||||
/* Validate destination and message */
|
||||
port = tipc_port_lock(dport);
|
||||
if (unlikely(!port)) {
|
||||
tsk = tipc_port_lock(dport);
|
||||
if (unlikely(!tsk)) {
|
||||
rc = tipc_msg_eval(buf, &dnode);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
tsk = tipc_port_to_sock(port);
|
||||
port = &tsk->port;
|
||||
sk = &tsk->sk;
|
||||
|
||||
/* Queue message */
|
||||
|
@ -2002,21 +1997,21 @@ restart:
|
|||
|
||||
static void tipc_sk_timeout(unsigned long ref)
|
||||
{
|
||||
struct tipc_port *port = tipc_port_lock(ref);
|
||||
struct tipc_sock *tsk;
|
||||
struct tipc_sock *tsk = tipc_port_lock(ref);
|
||||
struct tipc_port *port;
|
||||
struct sock *sk;
|
||||
struct sk_buff *buf = NULL;
|
||||
struct tipc_msg *msg = NULL;
|
||||
u32 peer_port, peer_node;
|
||||
|
||||
if (!port)
|
||||
if (!tsk)
|
||||
return;
|
||||
|
||||
port = &tsk->port;
|
||||
if (!port->connected) {
|
||||
tipc_port_unlock(port);
|
||||
return;
|
||||
}
|
||||
tsk = tipc_port_to_sock(port);
|
||||
sk = &tsk->sk;
|
||||
bh_lock_sock(sk);
|
||||
peer_port = tipc_port_peerport(port);
|
||||
|
|
Loading…
Reference in New Issue