Commit aa60b261 authored by Steve Longerbeam's avatar Steve Longerbeam Committed by Philipp Zabel

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: default avatarSteve Longerbeam <slongerbeam@gmail.com>
Tested-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
parent 920340ae
...@@ -896,7 +896,7 @@ static irqreturn_t do_bh(int irq, void *dev_id) ...@@ -896,7 +896,7 @@ static irqreturn_t do_bh(int irq, void *dev_id)
dev_dbg(priv->ipu->dev, dev_dbg(priv->ipu->dev,
"%s: task %u: signaling abort for ctx %p\n", "%s: task %u: signaling abort for ctx %p\n",
__func__, chan->ic_task, ctx); __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) ...@@ -1533,8 +1533,6 @@ static void __ipu_image_convert_abort(struct ipu_image_convert_ctx *ctx)
int run_count, ret; int run_count, ret;
bool need_abort; bool need_abort;
reinit_completion(&ctx->aborted);
spin_lock_irqsave(&chan->irqlock, flags); spin_lock_irqsave(&chan->irqlock, flags);
/* move all remaining pending runs in this context to done_q */ /* 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) ...@@ -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) ? active_run = (chan->current_run && chan->current_run->ctx == ctx) ?
chan->current_run : NULL; chan->current_run : NULL;
if (active_run)
reinit_completion(&ctx->aborted);
need_abort = (run_count || active_run); need_abort = (run_count || active_run);
ctx->aborting = true; ctx->aborting = true;
......
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