11 Feb, 2020

1 commit

  • [ Upstream commit 5273a191dca65a675dc0bcf3909e59c6933e2831 ]

    When a call is disconnected, the connection pointer from the call is
    cleared to make sure it isn't used again and to prevent further attempted
    transmission for the call. Unfortunately, there might be a daemon trying
    to use it at the same time to transmit a packet.

    Fix this by keeping call->conn set, but setting a flag on the call to
    indicate disconnection instead.

    Remove also the bits in the transmission functions where the conn pointer is
    checked and a ref taken under spinlock as this is now redundant.

    Fixes: 8d94aa381dab ("rxrpc: Calls shouldn't hold socket refs")
    Signed-off-by: David Howells
    Signed-off-by: Greg Kroah-Hartman

    David Howells
     

07 Oct, 2019

2 commits

  • Fix the cleanup of the crypto state on a call after the call has been
    disconnected. As the call has been disconnected, its connection ref has
    been discarded and so we can't go through that to get to the security ops
    table.

    Fix this by caching the security ops pointer in the rxrpc_call struct and
    using that when freeing the call security state. Also use this in other
    places we're dealing with call-specific security.

    The symptoms look like:

    BUG: KASAN: use-after-free in rxrpc_release_call+0xb2d/0xb60
    net/rxrpc/call_object.c:481
    Read of size 8 at addr ffff888062ffeb50 by task syz-executor.5/4764

    Fixes: 1db88c534371 ("rxrpc: Fix -Wframe-larger-than= warnings from on-stack crypto")
    Reported-by: syzbot+eed305768ece6682bb7f@syzkaller.appspotmail.com
    Signed-off-by: David Howells

    David Howells
     
  • rxrpc_put_*conn() calls trace_rxrpc_conn() after they have done the
    decrement of the refcount - which looks at the debug_id in the connection
    record. But unless the refcount was reduced to zero, we no longer have the
    right to look in the record and, indeed, it may be deleted by some other
    thread.

    Fix this by getting the debug_id out before decrementing the refcount and
    then passing that into the tracepoint.

    Fixes: 363deeab6d0f ("rxrpc: Add connection tracepoint and client conn state tracepoint")
    Signed-off-by: David Howells

    David Howells
     

31 Aug, 2019

1 commit

  • When a local endpoint is ceases to be in use, such as when the kafs module
    is unloaded, the kernel will emit an assertion failure if there are any
    outstanding client connections:

    rxrpc: Assertion failed
    ------------[ cut here ]------------
    kernel BUG at net/rxrpc/local_object.c:433!

    and even beyond that, will evince other oopses if there are service
    connections still present.

    Fix this by:

    (1) Removing the triggering of connection reaping when an rxrpc socket is
    released. These don't actually clean up the connections anyway - and
    further, the local endpoint may still be in use through another
    socket.

    (2) Mark the local endpoint as dead when we start the process of tearing
    it down.

    (3) When destroying a local endpoint, strip all of its client connections
    from the idle list and discard the ref on each that the list was
    holding.

    (4) When destroying a local endpoint, call the service connection reaper
    directly (rather than through a workqueue) to immediately kill off all
    outstanding service connections.

    (5) Make the service connection reaper reap connections for which the
    local endpoint is marked dead.

    Only after destroying the connections can we close the socket lest we get
    an oops in a workqueue that's looking at a connection or a peer.

    Fixes: 3d18cbb7fd0c ("rxrpc: Fix conn expiry timers")
    Signed-off-by: David Howells
    Tested-by: Marc Dionne
    Signed-off-by: David S. Miller

    David Howells
     

24 May, 2019

1 commit

  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public licence as published by
    the free software foundation either version 2 of the licence or at
    your option any later version

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-or-later

    has been chosen to replace the boilerplate/reference in 114 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Reviewed-by: Kate Stewart
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190520170857.552531963@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

16 May, 2019

1 commit

  • Allow kernel services using AF_RXRPC to indicate that a call should be
    non-interruptible. This allows kafs to make things like lock-extension and
    writeback data storage calls non-interruptible.

    If this is set, signals will be ignored for operations on that call where
    possible - such as waiting to get a call channel on an rxrpc connection.

    It doesn't prevent UDP sendmsg from being interrupted, but that will be
    handled by packet retransmission.

    rxrpc_kernel_recv_data() isn't affected by this since that never waits,
    preferring instead to return -EAGAIN and leave the waiting to the caller.

    Userspace initiated calls can't be set to be uninterruptible at this time.

    Signed-off-by: David Howells

    David Howells
     

09 Mar, 2019

2 commits

  • 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
    Reviewed-by: Marc Dionne
    Signed-off-by: David S. Miller

    David Howells
     
  • rxrpc_disconnect_client_call() reads the call's connection ID protocol
    value (call->cid) as part of that function's variable declarations. This
    is bad because it's not inside the locked section and so may race with
    someone granting use of the channel to the call.

    This manifests as an assertion failure (see below) where the call in the
    presumed channel (0 because call->cid wasn't set when we read it) doesn't
    match the call attached to the channel we were actually granted (if 1, 2 or
    3).

    Fix this by moving the read and dependent calculations inside of the
    channel_lock section. Also, only set the channel number and pointer
    variables if cid is not zero (ie. unset).

    This problem can be induced by injecting an occasional error in
    rxrpc_wait_for_channel() before the call to schedule().

    Make two further changes also:

    (1) Add a trace for wait failure in rxrpc_connect_call().

    (2) Drop channel_lock before BUG'ing in the case of the assertion failure.

    The failure causes a trace akin to the following:

    rxrpc: Assertion failed - 18446612685268945920(0xffff8880beab8c00) == 18446612685268621312(0xffff8880bea69800) is false
    ------------[ cut here ]------------
    kernel BUG at net/rxrpc/conn_client.c:824!
    ...
    RIP: 0010:rxrpc_disconnect_client_call+0x2bf/0x99d
    ...
    Call Trace:
    rxrpc_connect_call+0x902/0x9b3
    ? wake_up_q+0x54/0x54
    rxrpc_new_client_call+0x3a0/0x751
    ? rxrpc_kernel_begin_call+0x141/0x1bc
    ? afs_alloc_call+0x1b5/0x1b5
    rxrpc_kernel_begin_call+0x141/0x1bc
    afs_make_call+0x20c/0x525
    ? afs_alloc_call+0x1b5/0x1b5
    ? __lock_is_held+0x40/0x71
    ? lockdep_init_map+0xaf/0x193
    ? lockdep_init_map+0xaf/0x193
    ? __lock_is_held+0x40/0x71
    ? yfs_fs_fetch_data+0x33b/0x34a
    yfs_fs_fetch_data+0x33b/0x34a
    afs_fetch_data+0xdc/0x3b7
    afs_read_dir+0x52d/0x97f
    afs_dir_iterate+0xa0/0x661
    ? iterate_dir+0x63/0x141
    iterate_dir+0xa2/0x141
    ksys_getdents64+0x9f/0x11b
    ? filldir+0x111/0x111
    ? do_syscall_64+0x3e/0x1a0
    __x64_sys_getdents64+0x16/0x19
    do_syscall_64+0x7d/0x1a0
    entry_SYSCALL_64_after_hwframe+0x49/0xbe

    Fixes: 45025bceef17 ("rxrpc: Improve management and caching of client connection objects")
    Signed-off-by: David Howells
    Reviewed-by: Marc Dionne
    Signed-off-by: David S. Miller

    David Howells
     

16 Jan, 2019

1 commit

  • The changes introduced to allow rxrpc calls to be retried creates an issue
    when it comes to refcounting afs_call structs. The problem is that when
    rxrpc_send_data() queues the last packet for an asynchronous call, the
    following sequence can occur:

    (1) The notify_end_tx callback is invoked which causes the state in the
    afs_call to be changed from AFS_CALL_CL_REQUESTING or
    AFS_CALL_SV_REPLYING.

    (2) afs_deliver_to_call() can then process event notifications from rxrpc
    on the async_work queue.

    (3) Delivery of events, such as an abort from the server, can cause the
    afs_call state to be changed to AFS_CALL_COMPLETE on async_work.

    (4) For an asynchronous call, afs_process_async_call() notes that the call
    is complete and tried to clean up all the refs on async_work.

    (5) rxrpc_send_data() might return the amount of data transferred
    (success) or an error - which could in turn reflect a local error or a
    received error.

    Synchronising the clean up after rxrpc_kernel_send_data() returns an error
    with the asynchronous cleanup is then tricky to get right.

    Mostly revert commit c038a58ccfd6704d4d7d60ed3d6a0fca13cf13a4. The two API
    functions the original commit added aren't currently used. This makes
    rxrpc_kernel_send_data() always return successfully if it queued the data
    it was given.

    Note that this doesn't affect synchronous calls since their Rx notification
    function merely pokes a wait queue and does not refcounting. The
    asynchronous call notification function *has* to do refcounting and pass a
    ref over the work item to avoid the need to sync the workqueue in call
    cleanup.

    Signed-off-by: David Howells
    Signed-off-by: David S. Miller

    David Howells
     

05 Oct, 2018

1 commit


28 Sep, 2018

1 commit

  • Fix error distribution by immediately delivering the errors to all the
    affected calls rather than deferring them to a worker thread. The problem
    with the latter is that retries and things can happen in the meantime when we
    want to stop that sooner.

    To this end:

    (1) Stop the error distributor from removing calls from the error_targets
    list so that peer->lock isn't needed to synchronise against other adds
    and removals.

    (2) Require the peer's error_targets list to be accessed with RCU, thereby
    avoiding the need to take peer->lock over distribution.

    (3) Don't attempt to affect a call's state if it is already marked complete.

    Signed-off-by: David Howells

    David Howells
     

01 Aug, 2018

2 commits

  • Trace successful packet transmission (kernel_sendmsg() succeeded, that is)
    in AF_RXRPC. We can share the enum that defines the transmission points
    with the trace_rxrpc_tx_fail() tracepoint, so rename its constants to be
    applicable to both.

    Also, save the internal call->debug_id in the rxrpc_channel struct so that
    it can be used in retransmission trace lines.

    Signed-off-by: David Howells

    David Howells
     
  • Variables 'sp' and 'did_discard' are being assigned,
    but are never used, hence they are redundant and can be removed.

    fix following warning:

    net/rxrpc/call_event.c:165:25: warning: variable 'sp' set but not used [-Wunused-but-set-variable]
    net/rxrpc/conn_client.c:1054:7: warning: variable 'did_discard' set but not used [-Wunused-but-set-variable]

    Signed-off-by: YueHaibing
    Signed-off-by: David Howells

    YueHaibing
     

31 Mar, 2018

2 commits

  • rxrpc_local objects cannot be disposed of until all the connections that
    point to them have been RCU'd as a connection object holds refcount on the
    local endpoint it is communicating through. Currently, this can cause an
    assertion failure to occur when a network namespace is destroyed as there's
    no check that the RCU destructors for the connections have been run before
    we start trying to destroy local endpoints.

    The kernel reports:

    rxrpc: AF_RXRPC: Leaked local 0000000036a41bc1 {5}
    ------------[ cut here ]------------
    kernel BUG at ../net/rxrpc/local_object.c:439!

    Fix this by keeping a count of the live connections and waiting for it to
    go to zero at the end of rxrpc_destroy_all_connections().

    Fixes: dee46364ce6f ("rxrpc: Add RCU destruction for connections and calls")
    Signed-off-by: David Howells

    David Howells
     
  • Fix various issues detected by checker.

    Errors:

    (*) rxrpc_discard_prealloc() should be using rcu_assign_pointer to set
    call->socket.

    Warnings:

    (*) rxrpc_service_connection_reaper() should be passing NULL rather than 0 to
    trace_rxrpc_conn() as the where argument.

    (*) rxrpc_disconnect_client_call() should get its net pointer via the
    call->conn rather than call->sock to avoid a warning about accessing
    an RCU pointer without protection.

    (*) Proc seq start/stop functions need annotation as they pass locks
    between the functions.

    False positives:

    (*) Checker doesn't correctly handle of seq-retry lock context balance in
    rxrpc_find_service_conn_rcu().

    (*) Checker thinks execution may proceed past the BUG() in
    rxrpc_publish_service_conn().

    (*) Variable length array warnings from SKCIPHER_REQUEST_ON_STACK() in
    rxkad.c.

    Signed-off-by: David Howells

    David Howells
     

08 Feb, 2018

1 commit

  • AF_RXRPC is incorrectly sending back to the server any abort it receives
    for a client connection. This is due to the final-ACK offload to the
    connection event processor patch. The abort code is copied into the
    last-call information on the connection channel and then the event
    processor is set.

    Instead, the following should be done:

    (1) In the case of a final-ACK for a successful call, the ACK should be
    scheduled as before.

    (2) In the case of a locally generated ABORT, the ABORT details should be
    cached for sending in response to further packets related to that
    call and no further action scheduled at call disconnect time.

    (3) In the case of an ACK received from the peer, the call should be
    considered dead, no ABORT should be transmitted at this time. In
    response to further non-ABORT packets from the peer relating to this
    call, an RX_USER_ABORT ABORT should be transmitted.

    (4) In the case of a call killed due to network error, an RX_USER_ABORT
    ABORT should be cached for transmission in response to further
    packets, but no ABORT should be sent at this time.

    Fixes: 3136ef49a14c ("rxrpc: Delay terminal ACK transmission on a client call")
    Signed-off-by: David Howells
    Signed-off-by: David S. Miller

    David Howells
     

24 Nov, 2017

4 commits

  • Fix the rxrpc connection expiry timers so that connections for closed
    AF_RXRPC sockets get deleted in a more timely fashion, freeing up the
    transport UDP port much more quickly.

    (1) Replace the delayed work items with work items plus timers so that
    timer_reduce() can be used to shorten them and so that the timer
    doesn't requeue the work item if the net namespace is dead.

    (2) Don't use queue_delayed_work() as that won't alter the timeout if the
    timer is already running.

    (3) Don't rearm the timers if the network namespace is dead.

    Signed-off-by: David Howells

    David Howells
     
  • RxRPC service endpoints expire like they're supposed to by the following
    means:

    (1) Mark dead rxrpc_net structs (with ->live) rather than twiddling the
    global service conn timeout, otherwise the first rxrpc_net struct to
    die will cause connections on all others to expire immediately from
    then on.

    (2) Mark local service endpoints for which the socket has been closed
    (->service_closed) so that the expiration timeout can be much
    shortened for service and client connections going through that
    endpoint.

    (3) rxrpc_put_service_conn() needs to schedule the reaper when the usage
    count reaches 1, not 0, as idle conns have a 1 count.

    (4) The accumulator for the earliest time we might want to schedule for
    should be initialised to jiffies + MAX_JIFFY_OFFSET, not ULONG_MAX as
    the comparison functions use signed arithmetic.

    (5) Simplify the expiration handling, adding the expiration value to the
    idle timestamp each time rather than keeping track of the time in the
    past before which the idle timestamp must go to be expired. This is
    much easier to read.

    (6) Ignore the timeouts if the net namespace is dead.

    (7) Restart the service reaper work item rather the client reaper.

    Signed-off-by: David Howells

    David Howells
     
  • Fix the rxrpc call expiration timeouts and make them settable from
    userspace. By analogy with other rx implementations, there should be three
    timeouts:

    (1) "Normal timeout"

    This is set for all calls and is triggered if we haven't received any
    packets from the peer in a while. It is measured from the last time
    we received any packet on that call. This is not reset by any
    connection packets (such as CHALLENGE/RESPONSE packets).

    If a service operation takes a long time, the server should generate
    PING ACKs at a duration that's substantially less than the normal
    timeout so is to keep both sides alive. This is set at 1/6 of normal
    timeout.

    (2) "Idle timeout"

    This is set only for a service call and is triggered if we stop
    receiving the DATA packets that comprise the request data. It is
    measured from the last time we received a DATA packet.

    (3) "Hard timeout"

    This can be set for a call and specified the maximum lifetime of that
    call. It should not be specified by default. Some operations (such
    as volume transfer) take a long time.

    Allow userspace to set/change the timeouts on a call with sendmsg, using a
    control message:

    RXRPC_SET_CALL_TIMEOUTS

    The data to the message is a number of 32-bit words, not all of which need
    be given:

    u32 hard_timeout; /* sec from first packet */
    u32 idle_timeout; /* msec from packet Rx */
    u32 normal_timeout; /* msec from data Rx */

    This can be set in combination with any other sendmsg() that affects a
    call.

    Signed-off-by: David Howells

    David Howells
     
  • Delay terminal ACK transmission on a client call by deferring it to the
    connection processor. This allows it to be skipped if we can send the next
    call instead, the first DATA packet of which will implicitly ack this call.

    Signed-off-by: David Howells

    David Howells
     

29 Aug, 2017

1 commit

  • Allow a client call that failed on network error to be retried, provided
    that the Tx queue still holds DATA packet 1. This allows an operation to
    be submitted to another server or another address for the same server
    without having to repackage and re-encrypt the data so far processed.

    Two new functions are provided:

    (1) rxrpc_kernel_check_call() - This is used to find out the completion
    state of a call to guess whether it can be retried and whether it
    should be retried.

    (2) rxrpc_kernel_retry_call() - Disconnect the call from its current
    connection, reset the state and submit it as a new client call to a
    new address. The new address need not match the previous address.

    A call may be retried even if all the data hasn't been loaded into it yet;
    a partially constructed will be retained at the same point it was at when
    an error condition was detected. msg_data_left() can be used to find out
    how much data was packaged before the error occurred.

    Signed-off-by: David Howells

    David Howells
     

15 Jun, 2017

1 commit

  • Cache the congestion window setting that was determined during a call's
    transmission phase when it finishes so that it can be used by the next call
    to the same peer, thereby shortcutting the slow-start algorithm.

    The value is stored in the rxrpc_peer struct and is accessed without
    locking. Each call takes the value that happens to be there when it starts
    and just overwrites the value when it finishes.

    Signed-off-by: David Howells
    Signed-off-by: David S. Miller

    David Howells
     

05 Jun, 2017

2 commits

  • Make it possible for a client to use AuriStor's service upgrade facility.

    The client does this by adding an RXRPC_UPGRADE_SERVICE control message to
    the first sendmsg() of a call. This takes no parameters.

    When recvmsg() starts returning data from the call, the service ID field in
    the returned msg_name will reflect the result of the upgrade attempt. If
    the upgrade was ignored, srx_service will match what was set in the
    sendmsg(); if the upgrade happened the srx_service will be altered to
    indicate the service the server upgraded to.

    Note that:

    (1) The choice of upgrade service is up to the server

    (2) Further client calls to the same server that would share a connection
    are blocked if an upgrade probe is in progress.

    (3) This should only be used to probe the service. Clients should then
    use the returned service ID in all subsequent communications with that
    server (and not set the upgrade). Note that the kernel will not
    retain this information should the connection expire from its cache.

    (4) If a server that supports upgrading is replaced by one that doesn't,
    whilst a connection is live, and if the replacement is running, say,
    OpenAFS 1.6.4 or older or an older IBM AFS, then the replacement
    server will not respond to packets sent to the upgraded connection.

    At this point, calls will time out and the server must be reprobed.

    Signed-off-by: David Howells

    David Howells
     
  • Keep the rxrpc_connection struct's idea of the service ID that is exposed
    in the protocol separate from the service ID that's used as a lookup key.

    This allows the protocol service ID on a client connection to get upgraded
    without making the connection unfindable for other client calls that also
    would like to use the upgraded connection.

    The connection's actual service ID is then returned through recvmsg() by
    way of msg_name.

    Whilst we're at it, we get rid of the last_service_id field from each
    channel. The service ID is per-connection, not per-call and an entire
    connection is upgraded in one go.

    Signed-off-by: David Howells

    David Howells
     

26 May, 2017

1 commit

  • Support network namespacing in AF_RXRPC with the following changes:

    (1) All the local endpoint, peer and call lists, locks, counters, etc. are
    moved into the per-namespace record.

    (2) All the connection tracking is moved into the per-namespace record
    with the exception of the client connection ID tree, which is kept
    global so that connection IDs are kept unique per-machine.

    (3) Each namespace gets its own epoch. This allows each network namespace
    to pretend to be a separate client machine.

    (4) The /proc/net/rxrpc_xxx files are now called /proc/net/rxrpc/xxx and
    the contents reflect the namespace.

    fs/afs/ should be okay with this patch as it explicitly requires the current
    net namespace to be init_net to permit a mount to proceed at the moment. It
    will, however, need updating so that cells, IP addresses and DNS records are
    per-namespace also.

    Signed-off-by: David Howells
    Signed-off-by: David S. Miller

    David Howells
     

06 Apr, 2017

1 commit

  • Add a tracepoint (rxrpc_connect_call) to log the combination of rxrpc_call
    pointer, afs_call pointer/user data and wire call parameters to make it
    easier to match the tracebuffer contents to captured network packets.

    Signed-off-by: David Howells

    David Howells
     

02 Mar, 2017

1 commit


05 Jan, 2017

1 commit

  • Fix the way enum values are translated into strings in AF_RXRPC
    tracepoints. The problem with just doing a lookup in a normal flat array
    of strings or chars is that external tracing infrastructure can't find it.
    Rather, TRACE_DEFINE_ENUM must be used.

    Also sort the enums and string tables to make it easier to keep them in
    order so that a future patch to __print_symbolic() can be optimised to try
    a direct lookup into the table first before iterating over it.

    A couple of _proto() macro calls are removed because they refered to tables
    that got moved to the tracing infrastructure. The relevant data can be
    found by way of tracing.

    Signed-off-by: David Howells

    David Howells
     

15 Dec, 2016

1 commit

  • Add idr_get_cursor() / idr_set_cursor() APIs, and remove the reference
    to IDR_SIZE.

    Link: http://lkml.kernel.org/r/1480369871-5271-65-git-send-email-mawilcox@linuxonhyperv.com
    Signed-off-by: Matthew Wilcox
    Reviewed-by: David Howells
    Tested-by: Kirill A. Shutemov
    Cc: Konstantin Khlebnikov
    Cc: Ross Zwisler
    Cc: Matthew Wilcox
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Matthew Wilcox
     

30 Sep, 2016

2 commits

  • In rxrpc_activate_channels(), the connection cache state is checked outside
    of the lock, which means it can change whilst we're waking calls up,
    thereby changing whether or not we're allowed to wake calls up.

    Fix this by moving the check inside the locked region. The check to see if
    all the channels are currently busy can stay outside of the locked region.

    Whilst we're at it:

    (1) Split the locked section out into its own function so that we can call
    it from other places in a later patch.

    (2) Determine the mask of channels dependent on the state as we're going
    to add another state in a later patch that will restrict the number of
    simultaneous calls to 1 on a connection.

    Signed-off-by: David Howells

    David Howells
     
  • Exclusive connections are currently reusable (which they shouldn't be)
    because rxrpc_alloc_client_connection() checks the exclusive flag in the
    rxrpc_connection struct before it's initialised from the function
    parameters. This means that the DONT_REUSE flag doesn't get set.

    Fix this by checking the function parameters for the exclusive flag.

    Signed-off-by: David Howells

    David Howells
     

17 Sep, 2016

3 commits

  • Add a pair of tracepoints, one to track rxrpc_connection struct ref
    counting and the other to track the client connection cache state.

    Signed-off-by: David Howells

    David Howells
     
  • If the last call on a client connection is release after the connection has
    had a bunch of calls allocated but before any DATA packets are sent (so
    that it's not yet marked RXRPC_CONN_EXPOSED), an assertion will happen in
    rxrpc_disconnect_client_call().

    af_rxrpc: Assertion failed - 1(0x1) >= 2(0x2) is false
    ------------[ cut here ]------------
    kernel BUG at ../net/rxrpc/conn_client.c:753!

    This is because it's expecting the conn to have been exposed and to have 2
    or more refs - but this isn't necessarily the case.

    Simply remove the assertion. This allows the conn to be moved into the
    inactive state and deleted if it isn't resurrected before the final put is
    called.

    Signed-off-by: David Howells

    David Howells
     
  • In rxrpc_put_one_client_conn(), if a connection has RXRPC_CONN_COUNTED set
    on it, then it's accounted for in rxrpc_nr_client_conns and may be on
    various lists - and this is cleaned up correctly.

    However, if the connection doesn't have RXRPC_CONN_COUNTED set on it, then
    the put routine returns rather than just skipping the extra bit of cleanup.

    Fix this by making the extra bit of clean up conditional instead and always
    killing off the connection.

    This manifests itself as connections with a zero usage count hanging around
    in /proc/net/rxrpc_conns because the connection allocated, but discarded,
    due to a race with another process that set up a parallel connection, which
    was then shared instead.

    Signed-off-by: David Howells

    David Howells
     

07 Sep, 2016

1 commit


05 Sep, 2016

1 commit


04 Sep, 2016

1 commit


30 Aug, 2016

2 commits


24 Aug, 2016

1 commit

  • Improve the management and caching of client rxrpc connection objects.
    From this point, client connections will be managed separately from service
    connections because AF_RXRPC controls the creation and re-use of client
    connections but doesn't have that luxury with service connections.

    Further, there will be limits on the numbers of client connections that may
    be live on a machine. No direct restriction will be placed on the number
    of client calls, excepting that each client connection can support a
    maximum of four concurrent calls.

    Note that, for a number of reasons, we don't want to simply discard a
    client connection as soon as the last call is apparently finished:

    (1) Security is negotiated per-connection and the context is then shared
    between all calls on that connection. The context can be negotiated
    again if the connection lapses, but that involves holding up calls
    whilst at least two packets are exchanged and various crypto bits are
    performed - so we'd ideally like to cache it for a little while at
    least.

    (2) If a packet goes astray, we will need to retransmit a final ACK or
    ABORT packet. To make this work, we need to keep around the
    connection details for a little while.

    (3) The locally held structures represent some amount of setup time, to be
    weighed against their occupation of memory when idle.

    To this end, the client connection cache is managed by a state machine on
    each connection. There are five states:

    (1) INACTIVE - The connection is not held in any list and may not have
    been exposed to the world. If it has been previously exposed, it was
    discarded from the idle list after expiring.

    (2) WAITING - The connection is waiting for the number of client conns to
    drop below the maximum capacity. Calls may be in progress upon it
    from when it was active and got culled.

    The connection is on the rxrpc_waiting_client_conns list which is kept
    in to-be-granted order. Culled conns with waiters go to the back of
    the queue just like new conns.

    (3) ACTIVE - The connection has at least one call in progress upon it, it
    may freely grant available channels to new calls and calls may be
    waiting on it for channels to become available.

    The connection is on the rxrpc_active_client_conns list which is kept
    in activation order for culling purposes.

    (4) CULLED - The connection got summarily culled to try and free up
    capacity. Calls currently in progress on the connection are allowed
    to continue, but new calls will have to wait. There can be no waiters
    in this state - the conn would have to go to the WAITING state
    instead.

    (5) IDLE - The connection has no calls in progress upon it and must have
    been exposed to the world (ie. the EXPOSED flag must be set). When it
    expires, the EXPOSED flag is cleared and the connection transitions to
    the INACTIVE state.

    The connection is on the rxrpc_idle_client_conns list which is kept in
    order of how soon they'll expire.

    A connection in the ACTIVE or CULLED state must have at least one active
    call upon it; if in the WAITING state it may have active calls upon it;
    other states may not have active calls.

    As long as a connection remains active and doesn't get culled, it may
    continue to process calls - even if there are connections on the wait
    queue. This simplifies things a bit and reduces the amount of checking we
    need do.

    There are a couple flags of relevance to the cache:

    (1) EXPOSED - The connection ID got exposed to the world. If this flag is
    set, an extra ref is added to the connection preventing it from being
    reaped when it has no calls outstanding. This flag is cleared and the
    ref dropped when a conn is discarded from the idle list.

    (2) DONT_REUSE - The connection should be discarded as soon as possible and
    should not be reused.

    This commit also provides a number of new settings:

    (*) /proc/net/rxrpc/max_client_conns

    The maximum number of live client connections. Above this number, new
    connections get added to the wait list and must wait for an active
    conn to be culled. Culled connections can be reused, but they will go
    to the back of the wait list and have to wait.

    (*) /proc/net/rxrpc/reap_client_conns

    If the number of desired connections exceeds the maximum above, the
    active connection list will be culled until there are only this many
    left in it.

    (*) /proc/net/rxrpc/idle_conn_expiry

    The normal expiry time for a client connection, provided there are
    fewer than reap_client_conns of them around.

    (*) /proc/net/rxrpc/idle_conn_fast_expiry

    The expedited expiry time, used when there are more than
    reap_client_conns of them around.

    Note that I combined the Tx wait queue with the channel grant wait queue to
    save space as only one of these should be in use at once.

    Note also that, for the moment, the service connection cache still uses the
    old connection management code.

    Signed-off-by: David Howells

    David Howells