From: Steve Longerbeam Date: Wed, 19 Sep 2018 23:17:15 +0000 (-0700) Subject: gpu: ipu-v3: image-convert: Allow reentrancy into abort X-Git-Tag: v5.4-rc1~1841^2~15^2~16 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=aa60b261c636220fc1dd6b2783c1e28aeab34364;p=platform%2Fkernel%2Flinux-rpi.git gpu: ipu-v3: image-convert: Allow reentrancy into abort Allow reentrancy into ipu_image_convert_abort(), by moving re-init of ctx->aborted completion under the spin lock, and only if there is an active run, and complete all waiters do_bh(). Note: ipu_image_convert_unprepare() is still _not_ reentrant, and can't be made reentrant. Signed-off-by: Steve Longerbeam Tested-by: Philipp Zabel Signed-off-by: Philipp Zabel --- diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c b/drivers/gpu/ipu-v3/ipu-image-convert.c index e3e0322..abd8afb 100644 --- a/drivers/gpu/ipu-v3/ipu-image-convert.c +++ b/drivers/gpu/ipu-v3/ipu-image-convert.c @@ -896,7 +896,7 @@ static irqreturn_t do_bh(int irq, void *dev_id) dev_dbg(priv->ipu->dev, "%s: task %u: signaling abort for ctx %p\n", __func__, chan->ic_task, ctx); - complete(&ctx->aborted); + complete_all(&ctx->aborted); } } @@ -1533,8 +1533,6 @@ static void __ipu_image_convert_abort(struct ipu_image_convert_ctx *ctx) int run_count, ret; bool need_abort; - reinit_completion(&ctx->aborted); - spin_lock_irqsave(&chan->irqlock, flags); /* move all remaining pending runs in this context to done_q */ @@ -1549,6 +1547,9 @@ static void __ipu_image_convert_abort(struct ipu_image_convert_ctx *ctx) active_run = (chan->current_run && chan->current_run->ctx == ctx) ? chan->current_run : NULL; + if (active_run) + reinit_completion(&ctx->aborted); + need_abort = (run_count || active_run); ctx->aborting = true;