Commit de8d6c74 authored by David Howells's avatar David Howells

rxrpc: Convert rxrpc_local::services to an hlist

Convert the rxrpc_local::services list to an hlist so that it can be
accessed under RCU conditions more readily.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 18f1387c
...@@ -156,13 +156,13 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len) ...@@ -156,13 +156,13 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len)
if (rx->srx.srx_service) { if (rx->srx.srx_service) {
write_lock_bh(&local->services_lock); write_lock_bh(&local->services_lock);
list_for_each_entry(prx, &local->services, listen_link) { hlist_for_each_entry(prx, &local->services, listen_link) {
if (prx->srx.srx_service == rx->srx.srx_service) if (prx->srx.srx_service == rx->srx.srx_service)
goto service_in_use; goto service_in_use;
} }
rx->local = local; rx->local = local;
list_add_tail(&rx->listen_link, &local->services); hlist_add_head_rcu(&rx->listen_link, &local->services);
write_unlock_bh(&local->services_lock); write_unlock_bh(&local->services_lock);
rx->sk.sk_state = RXRPC_SERVER_BOUND; rx->sk.sk_state = RXRPC_SERVER_BOUND;
...@@ -567,7 +567,7 @@ static int rxrpc_create(struct net *net, struct socket *sock, int protocol, ...@@ -567,7 +567,7 @@ static int rxrpc_create(struct net *net, struct socket *sock, int protocol,
rx->family = protocol; rx->family = protocol;
rx->calls = RB_ROOT; rx->calls = RB_ROOT;
INIT_LIST_HEAD(&rx->listen_link); INIT_HLIST_NODE(&rx->listen_link);
INIT_LIST_HEAD(&rx->secureq); INIT_LIST_HEAD(&rx->secureq);
INIT_LIST_HEAD(&rx->acceptq); INIT_LIST_HEAD(&rx->acceptq);
rwlock_init(&rx->call_lock); rwlock_init(&rx->call_lock);
...@@ -615,9 +615,9 @@ static int rxrpc_release_sock(struct sock *sk) ...@@ -615,9 +615,9 @@ static int rxrpc_release_sock(struct sock *sk)
ASSERTCMP(rx->listen_link.next, !=, LIST_POISON1); ASSERTCMP(rx->listen_link.next, !=, LIST_POISON1);
if (!list_empty(&rx->listen_link)) { if (!hlist_unhashed(&rx->listen_link)) {
write_lock_bh(&rx->local->services_lock); write_lock_bh(&rx->local->services_lock);
list_del(&rx->listen_link); hlist_del_rcu(&rx->listen_link);
write_unlock_bh(&rx->local->services_lock); write_unlock_bh(&rx->local->services_lock);
} }
......
...@@ -71,7 +71,7 @@ struct rxrpc_sock { ...@@ -71,7 +71,7 @@ struct rxrpc_sock {
struct sock sk; struct sock sk;
rxrpc_notify_new_call_t notify_new_call; /* Func to notify of new call */ rxrpc_notify_new_call_t notify_new_call; /* Func to notify of new call */
struct rxrpc_local *local; /* local endpoint */ struct rxrpc_local *local; /* local endpoint */
struct list_head listen_link; /* link in the local endpoint's listen list */ struct hlist_node listen_link; /* link in the local endpoint's listen list */
struct list_head secureq; /* calls awaiting connection security clearance */ struct list_head secureq; /* calls awaiting connection security clearance */
struct list_head acceptq; /* calls awaiting acceptance */ struct list_head acceptq; /* calls awaiting acceptance */
struct key *key; /* security for this socket */ struct key *key; /* security for this socket */
...@@ -186,7 +186,7 @@ struct rxrpc_local { ...@@ -186,7 +186,7 @@ struct rxrpc_local {
struct list_head link; struct list_head link;
struct socket *socket; /* my UDP socket */ struct socket *socket; /* my UDP socket */
struct work_struct processor; struct work_struct processor;
struct list_head services; /* services listening on this endpoint */ struct hlist_head services; /* services listening on this endpoint */
struct rw_semaphore defrag_sem; /* control re-enablement of IP DF bit */ struct rw_semaphore defrag_sem; /* control re-enablement of IP DF bit */
struct sk_buff_head accept_queue; /* incoming calls awaiting acceptance */ struct sk_buff_head accept_queue; /* incoming calls awaiting acceptance */
struct sk_buff_head reject_queue; /* packets awaiting rejection */ struct sk_buff_head reject_queue; /* packets awaiting rejection */
......
...@@ -217,7 +217,7 @@ void rxrpc_accept_incoming_calls(struct rxrpc_local *local) ...@@ -217,7 +217,7 @@ void rxrpc_accept_incoming_calls(struct rxrpc_local *local)
/* get the socket providing the service */ /* get the socket providing the service */
read_lock_bh(&local->services_lock); read_lock_bh(&local->services_lock);
list_for_each_entry(rx, &local->services, listen_link) { hlist_for_each_entry(rx, &local->services, listen_link) {
if (rx->srx.srx_service == sp->hdr.serviceId && if (rx->srx.srx_service == sp->hdr.serviceId &&
rx->sk.sk_state != RXRPC_CLOSE) rx->sk.sk_state != RXRPC_CLOSE)
goto found_service; goto found_service;
......
...@@ -75,7 +75,7 @@ static struct rxrpc_local *rxrpc_alloc_local(const struct sockaddr_rxrpc *srx) ...@@ -75,7 +75,7 @@ static struct rxrpc_local *rxrpc_alloc_local(const struct sockaddr_rxrpc *srx)
atomic_set(&local->usage, 1); atomic_set(&local->usage, 1);
INIT_LIST_HEAD(&local->link); INIT_LIST_HEAD(&local->link);
INIT_WORK(&local->processor, rxrpc_local_processor); INIT_WORK(&local->processor, rxrpc_local_processor);
INIT_LIST_HEAD(&local->services); INIT_HLIST_HEAD(&local->services);
init_rwsem(&local->defrag_sem); init_rwsem(&local->defrag_sem);
skb_queue_head_init(&local->accept_queue); skb_queue_head_init(&local->accept_queue);
skb_queue_head_init(&local->reject_queue); skb_queue_head_init(&local->reject_queue);
...@@ -296,7 +296,7 @@ static void rxrpc_local_destroyer(struct rxrpc_local *local) ...@@ -296,7 +296,7 @@ static void rxrpc_local_destroyer(struct rxrpc_local *local)
mutex_unlock(&rxrpc_local_mutex); mutex_unlock(&rxrpc_local_mutex);
ASSERT(RB_EMPTY_ROOT(&local->client_conns)); ASSERT(RB_EMPTY_ROOT(&local->client_conns));
ASSERT(list_empty(&local->services)); ASSERT(hlist_empty(&local->services));
if (socket) { if (socket) {
local->socket = NULL; local->socket = NULL;
......
...@@ -131,7 +131,7 @@ int rxrpc_init_server_conn_security(struct rxrpc_connection *conn) ...@@ -131,7 +131,7 @@ int rxrpc_init_server_conn_security(struct rxrpc_connection *conn)
/* find the service */ /* find the service */
read_lock_bh(&local->services_lock); read_lock_bh(&local->services_lock);
list_for_each_entry(rx, &local->services, listen_link) { hlist_for_each_entry(rx, &local->services, listen_link) {
if (rx->srx.srx_service == conn->params.service_id) if (rx->srx.srx_service == conn->params.service_id)
goto found_service; goto found_service;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment