lkml.org 
[lkml]   [2019]   [Mar]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 14/34] rxrpc: Fix client call queueing, waiting for channel
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    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
    @@ -351,7 +351,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:
    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;

    \
     
     \ /
      Last update: 2019-03-18 10:41    [W:5.327 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site