Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de8d6c74 authored by David Howells's avatar David Howells
Browse files

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
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -156,13 +156,13 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len)

	if (rx->srx.srx_service) {
		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)
				goto service_in_use;
		}

		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);

		rx->sk.sk_state = RXRPC_SERVER_BOUND;
@@ -567,7 +567,7 @@ static int rxrpc_create(struct net *net, struct socket *sock, int protocol,
	rx->family = protocol;
	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->acceptq);
	rwlock_init(&rx->call_lock);
@@ -615,9 +615,9 @@ static int rxrpc_release_sock(struct sock *sk)

	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);
		list_del(&rx->listen_link);
		hlist_del_rcu(&rx->listen_link);
		write_unlock_bh(&rx->local->services_lock);
	}

+2 −2
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ struct rxrpc_sock {
	struct sock		sk;
	rxrpc_notify_new_call_t	notify_new_call; /* Func to notify of new call */
	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	acceptq;	/* calls awaiting acceptance */
	struct key		*key;		/* security for this socket */
@@ -186,7 +186,7 @@ struct rxrpc_local {
	struct list_head	link;
	struct socket		*socket;	/* my UDP socket */
	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 sk_buff_head	accept_queue;	/* incoming calls awaiting acceptance */
	struct sk_buff_head	reject_queue;	/* packets awaiting rejection */
+1 −1
Original line number Diff line number Diff line
@@ -217,7 +217,7 @@ void rxrpc_accept_incoming_calls(struct rxrpc_local *local)

	/* get the socket providing the service */
	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 &&
		    rx->sk.sk_state != RXRPC_CLOSE)
			goto found_service;
+2 −2
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ static struct rxrpc_local *rxrpc_alloc_local(const struct sockaddr_rxrpc *srx)
		atomic_set(&local->usage, 1);
		INIT_LIST_HEAD(&local->link);
		INIT_WORK(&local->processor, rxrpc_local_processor);
		INIT_LIST_HEAD(&local->services);
		INIT_HLIST_HEAD(&local->services);
		init_rwsem(&local->defrag_sem);
		skb_queue_head_init(&local->accept_queue);
		skb_queue_head_init(&local->reject_queue);
@@ -296,7 +296,7 @@ static void rxrpc_local_destroyer(struct rxrpc_local *local)
	mutex_unlock(&rxrpc_local_mutex);

	ASSERT(RB_EMPTY_ROOT(&local->client_conns));
	ASSERT(list_empty(&local->services));
	ASSERT(hlist_empty(&local->services));

	if (socket) {
		local->socket = NULL;
+1 −1
Original line number Diff line number Diff line
@@ -131,7 +131,7 @@ int rxrpc_init_server_conn_security(struct rxrpc_connection *conn)

	/* find the service */
	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)
			goto found_service;
	}