| From foo@baz Fri Mar 15 21:00:09 PDT 2019 |
| From: David Howells <dhowells@redhat.com> |
| Date: Sat, 9 Mar 2019 00:29:58 +0000 |
| Subject: rxrpc: Fix client call queueing, waiting for channel |
| |
| From: David Howells <dhowells@redhat.com> |
| |
| [ Upstream commit 69ffaebb90369ce08657b5aea4896777b9d6e8fc ] |
| |
| 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> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/rxrpc/conn_client.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/net/rxrpc/conn_client.c |
| +++ b/net/rxrpc/conn_client.c |
| @@ -355,7 +355,7 @@ static int rxrpc_get_client_conn(struct |
| * 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; |
| @@ -430,7 +430,7 @@ found_extant_conn: |
| spin_lock(&conn->channel_lock); |
| call->conn = conn; |
| call->security_ix = conn->security_ix; |
| - 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; |