• Chuck Lever's avatar
    svcrdma: Remove max_sge check at connect time · e248aa7b
    Chuck Lever authored
    Two and a half years ago, the client was changed to use gathered
    Send for larger inline messages, in commit 655fec69 ("xprtrdma:
    Use gathered Send for large inline messages"). Several fixes were
    required because there are a few in-kernel device drivers whose
    max_sge is 3, and these were broken by the change.
    
    Apparently my memory is going, because some time later, I submitted
    commit 25fd86ec ("svcrdma: Don't overrun the SGE array in
    svc_rdma_send_ctxt"), and after that, commit f3c1fd0e ("svcrdma:
    Reduce max_send_sges"). These too incorrectly assumed in-kernel
    device drivers would have more than a few Send SGEs available.
    
    The fix for the server side is not the same. This is because the
    fundamental problem on the server is that, whether or not the client
    has provisioned a chunk for the RPC reply, the server must squeeze
    even the most complex RPC replies into a single RDMA Send. Failing
    in the send path because of Send SGE exhaustion should never be an
    option.
    
    Therefore, instead of failing when the send path runs out of SGEs,
    switch to using a bounce buffer mechanism to handle RPC replies that
    are too complex for the device to send directly. That allows us to
    remove the max_sge check to enable drivers with small max_sge to
    work again.
    Reported-by: default avatarDon Dutile <ddutile@redhat.com>
    Fixes: 25fd86ec ("svcrdma: Don't overrun the SGE array in ...")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
    e248aa7b
svc_rdma_transport.c 20.8 KB