Commit f98b9a26 authored by Javi Merino's avatar Javi Merino Committed by Russell King

ARM: 7242/1: PL330: Detach the request from the pl330_thread when it finishes successful

When a request has finished successfully and we are about to call its
callback, remove its pointer from the corresponding pl330_thread .
This prevents the core driver from calling its callback again if
pl330_release_channel() is called without first flushing the device.
When pl330_update() returns, the driver is allowed to free the pointer
to pl330_req so the core driver shouldn't be able to access it again.

Reference: <CAJe_ZhftO+481BfL0ErEcM_brfmSuTXkTEniLRYxxM2T7OM2QA@mail.gmail.com>
Signed-off-by: default avatarJavi Merino <javi.merino@arm.com>
Acked-by: default avatarJassi Brar <jaswinder.singh@linaro.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 1ec332a3
...@@ -1467,13 +1467,19 @@ int pl330_update(const struct pl330_info *pi) ...@@ -1467,13 +1467,19 @@ int pl330_update(const struct pl330_info *pi)
/* Now that we are in no hurry, do the callbacks */ /* Now that we are in no hurry, do the callbacks */
while (!list_empty(&pl330->req_done)) { while (!list_empty(&pl330->req_done)) {
struct pl330_req *r;
rqdone = container_of(pl330->req_done.next, rqdone = container_of(pl330->req_done.next,
struct _pl330_req, rqd); struct _pl330_req, rqd);
list_del_init(&rqdone->rqd); list_del_init(&rqdone->rqd);
/* Detach the req */
r = rqdone->r;
rqdone->r = NULL;
spin_unlock_irqrestore(&pl330->lock, flags); spin_unlock_irqrestore(&pl330->lock, flags);
_callback(rqdone->r, PL330_ERR_NONE); _callback(r, PL330_ERR_NONE);
spin_lock_irqsave(&pl330->lock, flags); spin_lock_irqsave(&pl330->lock, flags);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment