[SCTP]: Convert bind_addr_list locking to RCU
Since the sctp_sockaddr_entry is now RCU enabled as part of the patch to synchronize sctp_localaddr_list, it makes sense to change all handling of these entries to RCU. This includes the sctp_bind_addrs structure and it's list of bound addresses. This list is currently protected by an external rw_lock and that looks like an overkill. There are only 2 writers to the list: bind()/bindx() calls, and BH processing of ASCONF-ACK chunks. These are already seriealized via the socket lock, so they will not step on each other. These are also relatively rare, so we should be good with RCU. The readers are varied and they are easily converted to RCU. Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com> Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Acked-by: Sridhar Samdurala <sri@us.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
2930354799
commit
559cf710b0
@@ -302,9 +302,7 @@ static void sctp_v6_get_saddr(struct sctp_association *asoc,
|
||||
union sctp_addr *saddr)
|
||||
{
|
||||
struct sctp_bind_addr *bp;
|
||||
rwlock_t *addr_lock;
|
||||
struct sctp_sockaddr_entry *laddr;
|
||||
struct list_head *pos;
|
||||
sctp_scope_t scope;
|
||||
union sctp_addr *baddr = NULL;
|
||||
__u8 matchlen = 0;
|
||||
@@ -324,14 +322,14 @@ static void sctp_v6_get_saddr(struct sctp_association *asoc,
|
||||
scope = sctp_scope(daddr);
|
||||
|
||||
bp = &asoc->base.bind_addr;
|
||||
addr_lock = &asoc->base.addr_lock;
|
||||
|
||||
/* Go through the bind address list and find the best source address
|
||||
* that matches the scope of the destination address.
|
||||
*/
|
||||
sctp_read_lock(addr_lock);
|
||||
list_for_each(pos, &bp->address_list) {
|
||||
laddr = list_entry(pos, struct sctp_sockaddr_entry, list);
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(laddr, &bp->address_list, list) {
|
||||
if (!laddr->valid)
|
||||
continue;
|
||||
if ((laddr->use_as_src) &&
|
||||
(laddr->a.sa.sa_family == AF_INET6) &&
|
||||
(scope <= sctp_scope(&laddr->a))) {
|
||||
@@ -353,7 +351,7 @@ static void sctp_v6_get_saddr(struct sctp_association *asoc,
|
||||
__FUNCTION__, asoc, NIP6(daddr->v6.sin6_addr));
|
||||
}
|
||||
|
||||
sctp_read_unlock(addr_lock);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
/* Make a copy of all potential local addresses. */
|
||||
|
Reference in New Issue
Block a user