提交 3b4f302d 编写于 作者: J Jon Paul Maloy 提交者: David S. Miller

tipc: eliminate redundant locking

The three functions tipc_portimportance(), tipc_portunreliable() and
tipc_portunreturnable() and their corresponding tipc_set* functions,
are all grabbing port_lock when accessing the targeted port. This is
unnecessary in the current code, since these calls only are made from
within socket downcalls, already protected by sock_lock.

We remove the redundant locking. Also, since the functions now become
trivial one-liners, we move them to port.h and make them inline.
Signed-off-by: NJon Maloy <jon.maloy@ericsson.com>
Reviewed-by: NYing Xue <ying.xue@windriver.com>
Reviewed-by: NErik Hugne <erik.hugne@ericsson.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 24be34b5
...@@ -258,64 +258,6 @@ void tipc_port_destroy(struct tipc_port *p_ptr) ...@@ -258,64 +258,6 @@ void tipc_port_destroy(struct tipc_port *p_ptr)
tipc_net_route_msg(buf); tipc_net_route_msg(buf);
} }
static int port_unreliable(struct tipc_port *p_ptr)
{
return msg_src_droppable(&p_ptr->phdr);
}
int tipc_portunreliable(u32 ref, unsigned int *isunreliable)
{
struct tipc_port *p_ptr;
p_ptr = tipc_port_lock(ref);
if (!p_ptr)
return -EINVAL;
*isunreliable = port_unreliable(p_ptr);
tipc_port_unlock(p_ptr);
return 0;
}
int tipc_set_portunreliable(u32 ref, unsigned int isunreliable)
{
struct tipc_port *p_ptr;
p_ptr = tipc_port_lock(ref);
if (!p_ptr)
return -EINVAL;
msg_set_src_droppable(&p_ptr->phdr, (isunreliable != 0));
tipc_port_unlock(p_ptr);
return 0;
}
static int port_unreturnable(struct tipc_port *p_ptr)
{
return msg_dest_droppable(&p_ptr->phdr);
}
int tipc_portunreturnable(u32 ref, unsigned int *isunrejectable)
{
struct tipc_port *p_ptr;
p_ptr = tipc_port_lock(ref);
if (!p_ptr)
return -EINVAL;
*isunrejectable = port_unreturnable(p_ptr);
tipc_port_unlock(p_ptr);
return 0;
}
int tipc_set_portunreturnable(u32 ref, unsigned int isunrejectable)
{
struct tipc_port *p_ptr;
p_ptr = tipc_port_lock(ref);
if (!p_ptr)
return -EINVAL;
msg_set_dest_droppable(&p_ptr->phdr, (isunrejectable != 0));
tipc_port_unlock(p_ptr);
return 0;
}
/* /*
* port_build_proto_msg(): create connection protocol message for port * port_build_proto_msg(): create connection protocol message for port
* *
...@@ -653,34 +595,6 @@ void tipc_acknowledge(u32 ref, u32 ack) ...@@ -653,34 +595,6 @@ void tipc_acknowledge(u32 ref, u32 ack)
tipc_net_route_msg(buf); tipc_net_route_msg(buf);
} }
int tipc_portimportance(u32 ref, unsigned int *importance)
{
struct tipc_port *p_ptr;
p_ptr = tipc_port_lock(ref);
if (!p_ptr)
return -EINVAL;
*importance = (unsigned int)msg_importance(&p_ptr->phdr);
tipc_port_unlock(p_ptr);
return 0;
}
int tipc_set_portimportance(u32 ref, unsigned int imp)
{
struct tipc_port *p_ptr;
if (imp > TIPC_CRITICAL_IMPORTANCE)
return -EINVAL;
p_ptr = tipc_port_lock(ref);
if (!p_ptr)
return -EINVAL;
msg_set_importance(&p_ptr->phdr, (u32)imp);
tipc_port_unlock(p_ptr);
return 0;
}
int tipc_publish(struct tipc_port *p_ptr, unsigned int scope, int tipc_publish(struct tipc_port *p_ptr, unsigned int scope,
struct tipc_name_seq const *seq) struct tipc_name_seq const *seq)
{ {
...@@ -919,7 +833,7 @@ int tipc_send(u32 ref, struct iovec const *msg_sect, unsigned int len) ...@@ -919,7 +833,7 @@ int tipc_send(u32 ref, struct iovec const *msg_sect, unsigned int len)
return res; return res;
} }
} }
if (port_unreliable(p_ptr)) { if (tipc_port_unreliable(p_ptr)) {
p_ptr->congested = 0; p_ptr->congested = 0;
return len; return len;
} }
...@@ -966,9 +880,9 @@ int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain, ...@@ -966,9 +880,9 @@ int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain,
p_ptr->sent++; p_ptr->sent++;
return res; return res;
} }
if (port_unreliable(p_ptr)) { if (tipc_port_unreliable(p_ptr))
return len; return len;
}
return -ELINKCONG; return -ELINKCONG;
} }
return tipc_port_iovec_reject(p_ptr, msg, msg_sect, len, return tipc_port_iovec_reject(p_ptr, msg, msg_sect, len,
...@@ -1009,8 +923,8 @@ int tipc_send2port(u32 ref, struct tipc_portid const *dest, ...@@ -1009,8 +923,8 @@ int tipc_send2port(u32 ref, struct tipc_portid const *dest,
p_ptr->sent++; p_ptr->sent++;
return res; return res;
} }
if (port_unreliable(p_ptr)) { if (tipc_port_unreliable(p_ptr))
return len; return len;
}
return -ELINKCONG; return -ELINKCONG;
} }
...@@ -109,15 +109,6 @@ void tipc_acknowledge(u32 port_ref, u32 ack); ...@@ -109,15 +109,6 @@ void tipc_acknowledge(u32 port_ref, u32 ack);
void tipc_port_destroy(struct tipc_port *p_ptr); void tipc_port_destroy(struct tipc_port *p_ptr);
int tipc_portimportance(u32 portref, unsigned int *importance);
int tipc_set_portimportance(u32 portref, unsigned int importance);
int tipc_portunreliable(u32 portref, unsigned int *isunreliable);
int tipc_set_portunreliable(u32 portref, unsigned int isunreliable);
int tipc_portunreturnable(u32 portref, unsigned int *isunreturnable);
int tipc_set_portunreturnable(u32 portref, unsigned int isunreturnable);
int tipc_publish(struct tipc_port *p_ptr, unsigned int scope, int tipc_publish(struct tipc_port *p_ptr, unsigned int scope,
struct tipc_name_seq const *name_seq); struct tipc_name_seq const *name_seq);
int tipc_withdraw(struct tipc_port *p_ptr, unsigned int scope, int tipc_withdraw(struct tipc_port *p_ptr, unsigned int scope,
...@@ -201,4 +192,37 @@ static inline u32 tipc_port_peerport(struct tipc_port *p_ptr) ...@@ -201,4 +192,37 @@ static inline u32 tipc_port_peerport(struct tipc_port *p_ptr)
return msg_destport(&p_ptr->phdr); return msg_destport(&p_ptr->phdr);
} }
static inline bool tipc_port_unreliable(struct tipc_port *port)
{
return msg_src_droppable(&port->phdr) != 0;
}
static inline void tipc_port_set_unreliable(struct tipc_port *port,
bool unreliable)
{
msg_set_src_droppable(&port->phdr, unreliable ? 1 : 0);
}
static inline bool tipc_port_unreturnable(struct tipc_port *port)
{
return msg_dest_droppable(&port->phdr) != 0;
}
static inline void tipc_port_set_unreturnable(struct tipc_port *port,
bool unreturnable)
{
msg_set_dest_droppable(&port->phdr, unreturnable ? 1 : 0);
}
static inline int tipc_port_importance(struct tipc_port *port)
{
return msg_importance(&port->phdr);
}
static inline void tipc_port_set_importance(struct tipc_port *port, int imp)
{
msg_set_importance(&port->phdr, (u32)imp);
}
#endif #endif
...@@ -197,9 +197,9 @@ static int tipc_sk_create(struct net *net, struct socket *sock, int protocol, ...@@ -197,9 +197,9 @@ static int tipc_sk_create(struct net *net, struct socket *sock, int protocol,
spin_unlock_bh(tp_ptr->lock); spin_unlock_bh(tp_ptr->lock);
if (sock->state == SS_READY) { if (sock->state == SS_READY) {
tipc_set_portunreturnable(tp_ptr->ref, 1); tipc_port_set_unreturnable(tp_ptr, true);
if (sock->type == SOCK_DGRAM) if (sock->type == SOCK_DGRAM)
tipc_set_portunreliable(tp_ptr->ref, 1); tipc_port_set_unreliable(tp_ptr, true);
} }
return 0; return 0;
} }
...@@ -1675,7 +1675,7 @@ static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags) ...@@ -1675,7 +1675,7 @@ static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags)
tipc_port_connect(new_ref, &peer); tipc_port_connect(new_ref, &peer);
new_sock->state = SS_CONNECTED; new_sock->state = SS_CONNECTED;
tipc_set_portimportance(new_ref, msg_importance(msg)); tipc_port_set_importance(new_port, msg_importance(msg));
if (msg_named(msg)) { if (msg_named(msg)) {
new_port->conn_type = msg_nametype(msg); new_port->conn_type = msg_nametype(msg);
new_port->conn_instance = msg_nameinst(msg); new_port->conn_instance = msg_nameinst(msg);
...@@ -1797,16 +1797,16 @@ static int tipc_setsockopt(struct socket *sock, int lvl, int opt, ...@@ -1797,16 +1797,16 @@ static int tipc_setsockopt(struct socket *sock, int lvl, int opt,
switch (opt) { switch (opt) {
case TIPC_IMPORTANCE: case TIPC_IMPORTANCE:
res = tipc_set_portimportance(tport->ref, value); tipc_port_set_importance(tport, value);
break; break;
case TIPC_SRC_DROPPABLE: case TIPC_SRC_DROPPABLE:
if (sock->type != SOCK_STREAM) if (sock->type != SOCK_STREAM)
res = tipc_set_portunreliable(tport->ref, value); tipc_port_set_unreliable(tport, value);
else else
res = -ENOPROTOOPT; res = -ENOPROTOOPT;
break; break;
case TIPC_DEST_DROPPABLE: case TIPC_DEST_DROPPABLE:
res = tipc_set_portunreturnable(tport->ref, value); tipc_port_set_unreturnable(tport, value);
break; break;
case TIPC_CONN_TIMEOUT: case TIPC_CONN_TIMEOUT:
tipc_sk(sk)->conn_timeout = value; tipc_sk(sk)->conn_timeout = value;
...@@ -1855,13 +1855,13 @@ static int tipc_getsockopt(struct socket *sock, int lvl, int opt, ...@@ -1855,13 +1855,13 @@ static int tipc_getsockopt(struct socket *sock, int lvl, int opt,
switch (opt) { switch (opt) {
case TIPC_IMPORTANCE: case TIPC_IMPORTANCE:
res = tipc_portimportance(tport->ref, &value); value = tipc_port_importance(tport);
break; break;
case TIPC_SRC_DROPPABLE: case TIPC_SRC_DROPPABLE:
res = tipc_portunreliable(tport->ref, &value); value = tipc_port_unreliable(tport);
break; break;
case TIPC_DEST_DROPPABLE: case TIPC_DEST_DROPPABLE:
res = tipc_portunreturnable(tport->ref, &value); value = tipc_port_unreturnable(tport);
break; break;
case TIPC_CONN_TIMEOUT: case TIPC_CONN_TIMEOUT:
value = tipc_sk(sk)->conn_timeout; value = tipc_sk(sk)->conn_timeout;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册