]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ufs: ensure clk gating work is finished before module unloading
authorAkinobu Mita <akinobu.mita@gmail.com>
Mon, 24 Nov 2014 05:24:18 +0000 (14:24 +0900)
committerChristoph Hellwig <hch@lst.de>
Wed, 26 Nov 2014 10:32:32 +0000 (11:32 +0100)
When dynamic clk gating feature is enabled, delayed workqueue machanism
is used in order to detect certain period of inactivity.  But there is no
guarantee that scheduled gating work is completed before module unloading.
So it can cause kernel crash by accessing memory after it was freed.

Fix it by cancelling clk gating and ungating works and ensure that its
execution is finished before module unloading.

Signed-off-by: Akinobu Mita <mita@fixstars.com>
Reviewed-by: Subhash Jadavani <subhashj@codeaurora.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/ufs/ufshcd.c

index b9da4463cefb4dce8e61ed69058612152f791dde..61bf002c7bd1a5b7ac940da64657af45f0425a02 100644 (file)
@@ -744,6 +744,8 @@ static void ufshcd_exit_clk_gating(struct ufs_hba *hba)
        if (!ufshcd_is_clkgating_allowed(hba))
                return;
        device_remove_file(hba->dev, &hba->clk_gating.delay_attr);
+       cancel_work_sync(&hba->clk_gating.ungate_work);
+       cancel_delayed_work_sync(&hba->clk_gating.gate_work);
 }
 
 /* Must be called with host lock acquired */