• David Howells's avatar
    rxrpc: Don't use a ring buffer for call Tx queue · a4ea4c47
    David Howells authored
    Change the way the Tx queueing works to make the following ends easier to
    achieve:
    
     (1) The filling of packets, the encryption of packets and the transmission
         of packets can be handled in parallel by separate threads, rather than
         rxrpc_sendmsg() allocating, filling, encrypting and transmitting each
         packet before moving onto the next one.
    
     (2) Get rid of the fixed-size ring which sets a hard limit on the number
         of packets that can be retained in the ring.  This allows the number
         of packets to increase without having to allocate a very large ring or
         having variable-sized rings.
    
         [Note: the downside of this is that it's then less efficient to locate
         a packet for retransmission as we then have to step through a list and
         examine each buffer in the list.]
    
     (3) Allow the filler/encrypter to run ahead of the transmission window.
    
     (4) Make it easier to do zero copy UDP from the packet buffers.
    
     (5) Make it easier to do zero copy from userspace to the packet buffers -
         and thence to UDP (only if for unauthenticated connections).
    
    To that end, the following changes are made:
    
     (1) Use the new rxrpc_txbuf struct instead of sk_buff for keeping packets
         to be transmitted in.  This allows them to be placed on multiple
         queues simultaneously.  An sk_buff isn't really necessary as it's
         never passed on to lower-level networking code.
    
     (2) Keep the transmissable packets in a linked list on the call struct
         rather than in a ring.  As a consequence, the annotation buffer isn't
         used either; rather a flag is set on the packet to indicate ackedness.
    
     (3) Use the RXRPC_CALL_TX_LAST flag to indicate that the last packet to be
         transmitted has been queued.  Add RXRPC_CALL_TX_ALL_ACKED to indicate
         that all packets up to and including the last got hard acked.
    
     (4) Wire headers are now stored in the txbuf rather than being concocted
         on the stack and they're stored immediately before the data, thereby
         allowing zerocopy of a single span.
    
     (5) Don't bother with instant-resend on transmission failure; rather,
         leave it for a timer or an ACK packet to trigger.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    cc: Marc Dionne <marc.dionne@auristor.com>
    cc: linux-afs@lists.infradead.org
    a4ea4c47
rxkad.c 33.1 KB