• David Howells's avatar
    rxrpc: Fix overproduction of wakeups to recvmsg() · c0783818
    David Howells authored
    Fix three cases of overproduction of wakeups:
    
     (1) rxrpc_input_split_jumbo() conditionally notifies the app that there's
         data for recvmsg() to collect if it queues some data - and then its
         only caller, rxrpc_input_data(), goes and wakes up recvmsg() anyway.
    
         Fix the rxrpc_input_data() to only do the wakeup in failure cases.
    
     (2) If a DATA packet is received for a call by the I/O thread whilst
         recvmsg() is busy draining the call's rx queue in the app thread, the
         call will left on the recvmsg() queue for recvmsg() to pick up, even
         though there isn't any data on it.
    
         This can cause an unexpected recvmsg() with a 0 return and no MSG_EOR
         set after the reply has been posted to a service call.
    
         Fix this by discarding pending calls from the recvmsg() queue that
         don't need servicing yet.
    
     (3) Not-yet-completed calls get requeued after having data read from them,
         even if they have no data to read.
    
         Fix this by only requeuing them if they have data waiting on them; if
         they don't, the I/O thread will requeue them when data arrives or they
         fail.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    cc: Marc Dionne <marc.dionne@auristor.com>
    cc: linux-afs@lists.infradead.org
    Link: https://lore.kernel.org/r/3386149.1676497685@warthog.procyon.org.ukSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    c0783818
input.c 27.7 KB