• Bob Pearson's avatar
    RDMA/rxe: Rewrite rxe_task.c · d9467163
    Bob Pearson authored
    This patch is a major rewrite of the tasklet routines in rxe_task.c.  The
    main motivation for this is the realization that the code violates the
    safety of the qp pointer by correct reference counting.  When a tasklet is
    scheduled from a verbs API the calling thread has a valid reference to the
    qp and schedules the tasklet to run at a later time carrying a pointer to
    the qp. Once the calling code returns however the qp can be destroyed at
    any time. In order to correct this a reference to the qp must be taken
    when the task is scheduled and held until it finishes running. This is
    complicated by the tasklet library not alwys running a task that is
    scheduled depending on whether someone else has scheduled it.
    
    This patch moves the logic for deciding whether to run or schedule a task
    outside of do_task() and guarantees that there is only one copy of the
    task scheduled or running at a time.
    
    Secondly the separate flags controlling teardown and draining of the task
    are included in the task state machine and all references to the state are
    protected by spinlocks to avoid consistency and memory barrier issues.
    
    Link: https://lore.kernel.org/r/20230304174533.11296-9-rpearsonhpe@gmail.comSigned-off-by: default avatarBob Pearson <rpearsonhpe@gmail.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    d9467163
rxe_task.h 1.24 KB