• Ioan Nicu's avatar
    rapidio: use a reference count for struct mport_dma_req · bbd876ad
    Ioan Nicu authored
    Once the dma request is passed to the DMA engine, the DMA subsystem
    would hold a pointer to this structure and could call the completion
    callback after do_dma_request() has timed out.
    
    The current code deals with this by putting timed out SYNC requests to a
    pending list and freeing them later, when the mport cdev device is
    released.  This still does not guarantee that the DMA subsystem is
    really done with those transfers, so in theory
    dma_xfer_callback/dma_req_free could be called after
    mport_cdev_release_dma and could potentially access already freed
    memory.
    
    This patch simplifies the current handling by using a kref in the mport
    dma request structure, so that it gets freed only when nobody uses it
    anymore.
    
    This also simplifies the code a bit, as FAF transfers are now handled in
    the same way as SYNC and ASYNC transfers.  There is no need anymore for
    the pending list and for the dma workqueue which was used in case of FAF
    transfers, so we remove them both.
    
    Link: http://lkml.kernel.org/r/20180405203342.GA16191@nokia.comSigned-off-by: default avatarIoan Nicu <ioan.nicu.ext@nokia.com>
    Acked-by: default avatarAlexandre Bounine <alex.bou9@gmail.com>
    Cc: Barry Wood <barry.wood@idt.com>
    Cc: Matt Porter <mporter@kernel.crashing.org>
    Cc: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Logan Gunthorpe <logang@deltatee.com>
    Cc: Chris Wilson <chris@chris-wilson.co.uk>
    Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
    Cc: Frank Kunz <frank.kunz@nokia.com>
    Cc: Alexander Sverdlin <alexander.sverdlin@nokia.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    bbd876ad
rio_mport_cdev.c 64.9 KB