summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/host/nvhost_acm.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2011-09-22 15:37:17 +0300
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:49:23 -0800
commit601e1d16240cbe24c6d4fa72c6afacfbde13022e (patch)
treec33ece0e7705e7fd995118ac03ef5393d8b9c094 /drivers/video/tegra/host/nvhost_acm.c
parentbb210ce4aeb7ba7455f03938c6d4c87f9f1e2cad (diff)
video: tegra: host: Check for allocation failures
Adds checks for memory allocation failures, and proper propagation of error conditions. Adds clearing of pointers after free or unpin has been called to catch use after free. Bug 877551 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/54027 Reviewed-by: Antti Miettinen <amiettinen@nvidia.com> Reviewed-by: Hiroshi Doyu <hdoyu@nvidia.com> Reviewed-by: Scott Williams <scwilliams@nvidia.com> Reviewed-by: Krishna Reddy <vdumpa@nvidia.com> Tested-by: Gerrit_Virtual_Submit (cherry picked from commit bfbf2766d11a5f85781532ddce3a87b7ae762ba3) Change-Id: I04171ee5db6a42bb1689221d4f80d5f3d35e7399 Reviewed-on: http://git-master/r/57462 Rebase-Id: Rc9f43312c8b818869d746f4b73700d8b56e4569d
Diffstat (limited to 'drivers/video/tegra/host/nvhost_acm.c')
-rw-r--r--drivers/video/tegra/host/nvhost_acm.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/video/tegra/host/nvhost_acm.c b/drivers/video/tegra/host/nvhost_acm.c
index 4af2cb2b9e5e..ed950a562be7 100644
--- a/drivers/video/tegra/host/nvhost_acm.c
+++ b/drivers/video/tegra/host/nvhost_acm.c
@@ -138,8 +138,15 @@ static void powerdown_handler(struct work_struct *work)
powerdown);
mutex_lock(&mod->lock);
if ((atomic_read(&mod->refcount) == 0) && mod->powered) {
- if (mod->desc->prepare_poweroff)
- mod->desc->prepare_poweroff(mod);
+ if (mod->desc->prepare_poweroff
+ && mod->desc->prepare_poweroff(mod)) {
+ /* If poweroff fails, retry */
+ mutex_unlock(&mod->lock);
+ schedule_delayed_work(&mod->powerdown,
+ msecs_to_jiffies(
+ mod->desc->powerdown_delay));
+ return;
+ }
clock_disable(mod);
powergate(mod);
mod->powered = false;