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
|
* 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)
|
static struct tipc_sock *tipc_sk_lock_next(u32 *ref)
|
||||||
{
|
{
|
||||||
struct tipc_port *port = (struct tipc_port *)tipc_ref_lock_next(ref);
|
return (struct tipc_sock *)tipc_ref_lock_next(ref);
|
||||||
|
|
||||||
if (!port)
|
|
||||||
return NULL;
|
|
||||||
return tipc_port_to_sock(port);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -204,7 +200,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock,
|
||||||
|
|
||||||
tsk = tipc_sk(sk);
|
tsk = tipc_sk(sk);
|
||||||
port = &tsk->port;
|
port = &tsk->port;
|
||||||
ref = tipc_ref_acquire(port, &port->lock);
|
ref = tipc_ref_acquire(tsk, &port->lock);
|
||||||
if (!ref) {
|
if (!ref) {
|
||||||
pr_warn("Socket create failed; reference table exhausted\n");
|
pr_warn("Socket create failed; reference table exhausted\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -1655,13 +1651,12 @@ int tipc_sk_rcv(struct sk_buff *buf)
|
||||||
u32 dnode;
|
u32 dnode;
|
||||||
|
|
||||||
/* Validate destination and message */
|
/* Validate destination and message */
|
||||||
port = tipc_port_lock(dport);
|
tsk = tipc_port_lock(dport);
|
||||||
if (unlikely(!port)) {
|
if (unlikely(!tsk)) {
|
||||||
rc = tipc_msg_eval(buf, &dnode);
|
rc = tipc_msg_eval(buf, &dnode);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
port = &tsk->port;
|
||||||
tsk = tipc_port_to_sock(port);
|
|
||||||
sk = &tsk->sk;
|
sk = &tsk->sk;
|
||||||
|
|
||||||
/* Queue message */
|
/* Queue message */
|
||||||
|
@ -2002,21 +1997,21 @@ restart:
|
||||||
|
|
||||||
static void tipc_sk_timeout(unsigned long ref)
|
static void tipc_sk_timeout(unsigned long ref)
|
||||||
{
|
{
|
||||||
struct tipc_port *port = tipc_port_lock(ref);
|
struct tipc_sock *tsk = tipc_port_lock(ref);
|
||||||
struct tipc_sock *tsk;
|
struct tipc_port *port;
|
||||||
struct sock *sk;
|
struct sock *sk;
|
||||||
struct sk_buff *buf = NULL;
|
struct sk_buff *buf = NULL;
|
||||||
struct tipc_msg *msg = NULL;
|
struct tipc_msg *msg = NULL;
|
||||||
u32 peer_port, peer_node;
|
u32 peer_port, peer_node;
|
||||||
|
|
||||||
if (!port)
|
if (!tsk)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
port = &tsk->port;
|
||||||
if (!port->connected) {
|
if (!port->connected) {
|
||||||
tipc_port_unlock(port);
|
tipc_port_unlock(port);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tsk = tipc_port_to_sock(port);
|
|
||||||
sk = &tsk->sk;
|
sk = &tsk->sk;
|
||||||
bh_lock_sock(sk);
|
bh_lock_sock(sk);
|
||||||
peer_port = tipc_port_peerport(port);
|
peer_port = tipc_port_peerport(port);
|
||||||
|
|
Loading…
Reference in a new issue