From 19218f465ccb1e817f6b0489fe1b361f72e6193c Mon Sep 17 00:00:00 2001 From: Maneet Singh Date: Fri, 9 Oct 2015 23:25:54 -0700 Subject: [PATCH] CHROMIUM: dmaengine: tegra-adma: Avoid tasklet from self-destructing Fix commit 92cd07d23e6332f373c53bbce6a3daa787091f09 which added code to kill tasklet on tegra_adma_terminate_all(). But this function is also invoked from tasklet itself resulting in forever loop. So avoid call to tasklet_kill when called from irq context. BUG=chrome-os-partner:46247 TEST=Launch Epic Citadel game and click on more options Change-Id: Ic0179bdd7ace99d1a3989b43d5794a3bd550afa7 Signed-off-by: Maneet Singh Reviewed-on: https://chromium-review.googlesource.com/304957 Commit-Ready: Anatol Pomazau Tested-by: Anatol Pomazau Reviewed-by: Anatol Pomazau Reviewed-by: Andrew Bresticker --- drivers/dma/tegra210-adma.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/dma/tegra210-adma.c b/drivers/dma/tegra210-adma.c index 22c7021fd2105..7eaf8a92ec817 100644 --- a/drivers/dma/tegra210-adma.c +++ b/drivers/dma/tegra210-adma.c @@ -725,13 +725,17 @@ static void tegra_adma_terminate_all(struct dma_chan *dc) tegra_adma_resume(tdc); /* - * Check for any running tasklets and kill them + * Check for any running tasklets and kill them. + * But since this function can be invoked from tasklet itself, + * avoid self-destruct which would cause forever loop. */ if (tdc->tasklet_active) { tdc->busy = true; spin_unlock_irqrestore(&tdc->lock, flags); - dev_warn(tdc2dev(tdc), "Killing tasklet\n"); - tasklet_kill(&tdc->tasklet); + if (!in_interrupt()) { + dev_warn(tdc2dev(tdc), "Killing tasklet\n"); + tasklet_kill(&tdc->tasklet); + } spin_lock_irqsave(&tdc->lock, flags); tdc->busy = false; }