video: tegra: host: Fix race from acm
Arto Merilainen [Thu, 2 May 2013 10:25:01 +0000 (13:25 +0300)]
The code did not take the client list mutex while setting a new
devfreq rate. However, the code utilised the list to determine
the required rate and therefore caused a race. This caused illegal
memory accesses if the client list was modified at the same time
the devfreq rate was set.

Bug 1375457

Change-Id: Ic4747e5c0fb38b717b5addcffd2d5ef7c188feea
Reviewed-on: http://git-master/r/224836
(cherry picked from commit 2024a2a9ea7d868e2c05d1f15dd3c7f1a9ba2e13)

Signed-off-by: Arto Merilainen <amerilainen@nvidia.com>
Signed-off-by: Shridhar Rasal <srasal@nvidia.com>
Reviewed-on: http://git-master/r/280997
(cherry picked from commit 57b79ad70752a164f1446a8a49a54be7b2076098)
Change-Id: I2b754466bdb5c9d376b422ebd3e72e54ed790ef6
Reviewed-on: http://git-master/r/328025
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Harry Hong <hhong@nvidia.com>
Tested-by: Harry Hong <hhong@nvidia.com>

drivers/video/tegra/host/nvhost_acm.c

index 3bde9d6..ad29ed5 100644 (file)
@@ -568,6 +568,7 @@ int nvhost_module_set_devfreq_rate(struct platform_device *dev, int index,
                unsigned long rate)
 {
        struct nvhost_device_data *pdata = platform_get_drvdata(dev);
+       int ret;
 
        rate = clk_round_rate(pdata->clk[index], rate);
        pdata->clocks[index].devfreq_rate = rate;
@@ -575,7 +576,11 @@ int nvhost_module_set_devfreq_rate(struct platform_device *dev, int index,
        trace_nvhost_module_set_devfreq_rate(dev->name,
                        pdata->clocks[index].name, rate);
 
-       return nvhost_module_update_rate(dev, index);
+       mutex_lock(&client_list_lock);
+       ret = nvhost_module_update_rate(dev, index);
+       mutex_unlock(&client_list_lock);
+
+       return ret;
 }
 
 int nvhost_module_init(struct platform_device *dev)