• Chuck Lever's avatar
    xprtrdma: Use scatterlist for DMA mapping and unmapping under FMR · fcdfb968
    Chuck Lever authored
    The use of a scatterlist for handling DMA mapping and unmapping
    was recently introduced in frwr_ops.c in commit 4143f34e
    ("xprtrdma: Port to new memory registration API"). That commit did
    not make a similar update to xprtrdma's FMR support because the
    core ib_map_phys_fmr() and ib_unmap_fmr() APIs have not been changed
    to take a scatterlist argument.
    
    However, FMR still needs to do DMA mapping and unmapping. It appears
    that RDS, for example, uses a scatterlist for this, then builds the
    DMA addr array for the ib_map_phys_fmr call separately. I see that
    SRP also utilizes a scatterlist for DMA mapping. xprtrdma can do
    something similar.
    
    This modernization is used immediately to properly defer DMA
    unmapping during fmr_unmap_safe (a FIXME). It separates the DMA
    unmapping coordinates from the rl_segments array. This array, being
    part of an rpcrdma_req, is always re-used immediately when an RPC
    exits. A scatterlist is allocated in memory independent of the
    rl_segments array, so it can be preserved indefinitely (ie, until
    the MR invalidation and DMA unmapping can actually be done by a
    worker thread).
    
    The FRWR and FMR DMA mapping code are slightly different from each
    other now, and will diverge further when the "Check for holes" logic
    can be removed from FRWR (support for SG_GAP MRs). So I chose not to
    create helpers for the common-looking code.
    
    Fixes: ead3f26e ("xprtrdma: Add ro_unmap_safe memreg method")
    Suggested-by: default avatarSagi Grimberg <sagi@lightbits.io>
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Tested-by: default avatarSteve Wise <swise@opengridcomputing.com>
    Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
    fcdfb968
fmr_ops.c 9.3 KB