• Javi Merino's avatar
    DMA: PL330: Fix racy mutex unlock · fdec53d5
    Javi Merino authored
    pl330_update() stores a pointer to the thrd->req that finished, which
    contains a pointer to the corresponding pl330_req.  This is done with
    the pl330_lock held.  Then, it iterates through the req_done list,
    calling the callback for each of the requests that are done.  The
    problem is that the driver releases the lock before calling the
    callback for each of the callbacks.  pl330_submit_req() running in
    another processor can then acquire the lock and insert another request
    in one of the thrd->req that hasn't been processed yet, replacing the
    pointer to pl330_req there.  When the callback returns in
    pl330_update() and the next rqdone is popped from the list, it
    dereferences the pl330_req pointer to the just scheduled pl330_req,
    instead of the one that has finished, calling pl330 with the wrong r.
    
    This patch fixes this by storing the pointer to pl330_req directly in
    the list.
    Signed-off-by: default avatarJavi Merino <javi.merino@arm.com>
    Cc: Jassi Brar <jaswinder.singh@linaro.org>
    Acked-by: default avatarJassi Brar <jaswinder.singh@linaro.org>
    Signed-off-by: default avatarVinod Koul <vinod.koul@linux.intel.com>
    fdec53d5
pl330.c 66.8 KB