From a870ff1d294126a3b46db4e0fdc14276035a2840 Mon Sep 17 00:00:00 2001 From: Konsta Holtta Date: Thu, 2 Oct 2014 15:25:53 +0300 Subject: gpu: nvgpu: Remove get and put client routines gk20a_get_client() and gk20a_put_client() routines are effectively dead code. The GPU has been using pm_runtime for reference counting whether the device should be turned on or off, and gk20a_get_client() and gk20a_put_client() have had no positive effect on the behaviour. In worst case these functions trigger some issues as they may trigger code paths that should not be run. There is also a race between get/put and busy/idle. This patch removes the functions and reworks as_gk20a.c to correctly use gk20a_busy()/gk20a_idle() where put/get was required. Additionally, finalize_poweron() is moved to gk20a_busy(), similarly as it was with gk20a_get_client(). If pm_runtime is not in use, the device is only powered on and never off. Currently this affects vgpu power management since it does not use pm_runtime yet. Bug 1562096 Change-Id: I3162655f83457e9caccd9264eed36b5d51e60c52 Signed-off-by: Arto Merilainen Signed-off-by: Konsta Holtta Reviewed-on: http://git-master/r/414998 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Seshendra Gadagottu Tested-by: Seshendra Gadagottu GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/as_gk20a.c | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/as_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/as_gk20a.c b/drivers/gpu/nvgpu/gk20a/as_gk20a.c index 74d83a7d..27608cec 100644 --- a/drivers/gpu/nvgpu/gk20a/as_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/as_gk20a.c @@ -56,14 +56,19 @@ int gk20a_as_alloc_share(struct gk20a_as *as, as_share->ref_cnt.counter = 1; /* this will set as_share->vm. */ + err = gk20a_busy(g->dev); + if (err) + goto failed; err = g->ops.mm.vm_alloc_share(as_share, flags); + gk20a_idle(g->dev); + if (err) goto failed; *out = as_share; return 0; - failed: +failed: kfree(as_share); return err; } @@ -180,16 +185,9 @@ int gk20a_as_dev_open(struct inode *inode, struct file *filp) g = container_of(inode->i_cdev, struct gk20a, as.cdev); - err = gk20a_get_client(g); - if (err) { - gk20a_dbg_fn("fail to get channel!"); - return err; - } - err = gk20a_as_alloc_share(&g->as, 0, &as_share); if (err) { gk20a_dbg_fn("failed to alloc share"); - gk20a_put_client(g); return err; } @@ -200,16 +198,10 @@ int gk20a_as_dev_open(struct inode *inode, struct file *filp) int gk20a_as_dev_release(struct inode *inode, struct file *filp) { struct gk20a_as_share *as_share = filp->private_data; - int ret; - struct gk20a *g = gk20a_from_as(as_share->as); gk20a_dbg_fn(""); - ret = gk20a_as_release_share(as_share); - - gk20a_put_client(g); - - return ret; + return gk20a_as_release_share(as_share); } long gk20a_as_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -- cgit v1.2.2