Message ID | 155209139894.21860.5649266453556857318.stgit@warthog.procyon.org.uk |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [net] rxrpc: Fix client call queueing, waiting for channel | expand |
From: David Howells <dhowells@redhat.com> Date: Sat, 09 Mar 2019 00:29:58 +0000 > rxrpc_get_client_conn() adds a new call to the front of the waiting_calls > queue if the connection it's going to use already exists. This is bad as > it allows calls to get starved out. > > Fix this by adding to the tail instead. > > Also change the other enqueue point in the same function to put it on the > front (ie. when we have a new connection). This makes the point that in > the case of a new connection the new call goes at the front (though it > doesn't actually matter since the queue should be unoccupied). > > Fixes: 45025bceef17 ("rxrpc: Improve management and caching of client connection objects") > Signed-off-by: David Howells <dhowells@redhat.com> > Reviewed-by: Marc Dionne <marc.dionne@auristor.com> Applied and queued up for -stable, thanks David.
diff --git a/net/rxrpc/conn_client.c b/net/rxrpc/conn_client.c index 505690dbd0be..04e62afea063 100644 --- a/net/rxrpc/conn_client.c +++ b/net/rxrpc/conn_client.c @@ -354,7 +354,7 @@ static int rxrpc_get_client_conn(struct rxrpc_sock *rx, * normally have to take channel_lock but we do this before anyone else * can see the connection. */ - list_add_tail(&call->chan_wait_link, &candidate->waiting_calls); + list_add(&call->chan_wait_link, &candidate->waiting_calls); if (cp->exclusive) { call->conn = candidate; @@ -433,7 +433,7 @@ static int rxrpc_get_client_conn(struct rxrpc_sock *rx, call->conn = conn; call->security_ix = conn->security_ix; call->service_id = conn->service_id; - list_add(&call->chan_wait_link, &conn->waiting_calls); + list_add_tail(&call->chan_wait_link, &conn->waiting_calls); spin_unlock(&conn->channel_lock); _leave(" = 0 [extant %d]", conn->debug_id); return 0;