]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
gpu: ipu-v3: image-convert: Allow reentrancy into abort
authorSteve Longerbeam <slongerbeam@gmail.com>
Wed, 19 Sep 2018 23:17:15 +0000 (16:17 -0700)
committerPhilipp Zabel <p.zabel@pengutronix.de>
Mon, 5 Nov 2018 13:40:07 +0000 (14:40 +0100)
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 <slongerbeam@gmail.com>
Tested-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
drivers/gpu/ipu-v3/ipu-image-convert.c

index e3e032252604d35070987e12a7c95892fd40d370..abd8afb22b48fe9d8eb1ee5e62cb4f591e96d9e9 100644 (file)
@@ -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;