From 7e96b143909b8ab7ba18f28b51cb796d8544aabb Mon Sep 17 00:00:00 2001 From: Konsta Holtta Date: Tue, 11 Sep 2018 14:37:09 +0300 Subject: gpu: nvgpu: track opened Linux ctrl files An upcoming patch will need to enumerate opened ctrl nodes; track them in a list, protected by a mutex. Bug 200145225 Bug 200541476 Change-Id: I50dc15056832a3bb53fbdd7bd2bffcdaecc7b21c Signed-off-by: Konsta Holtta Reviewed-on: https://git-master.nvidia.com/r/1811840 Reviewed-by: Alex Waterman Reviewed-by: Terje Bergstrom Reviewed-by: Vijayakumar Subbu Signed-off-by: Debarshi Dutta (cherry picked from commit d53495400e15fdef80be2f04a9f2312b81d2bd6d in dev-main) Reviewed-on: https://git-master.nvidia.com/r/2170005 GVS: Gerrit_Virtual_Submit Reviewed-by: Bibek Basu Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/os/linux/driver_common.c | 3 +++ drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c | 21 ++++++++++++++++++++- drivers/gpu/nvgpu/os/linux/os_linux.h | 4 ++++ drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c | 3 +++ 4 files changed, 30 insertions(+), 1 deletion(-) (limited to 'drivers/gpu/nvgpu') diff --git a/drivers/gpu/nvgpu/os/linux/driver_common.c b/drivers/gpu/nvgpu/os/linux/driver_common.c index ea4dadac..c76dabeb 100644 --- a/drivers/gpu/nvgpu/os/linux/driver_common.c +++ b/drivers/gpu/nvgpu/os/linux/driver_common.c @@ -70,6 +70,9 @@ static void nvgpu_init_vars(struct gk20a *g) /* Init the clock req count to 0 */ nvgpu_atomic_set(&g->clk_arb_global_nr, 0); + nvgpu_mutex_init(&l->ctrl.privs_lock); + nvgpu_init_list_node(&l->ctrl.privs); + l->regs_saved = l->regs; l->bar1_saved = l->bar1; diff --git a/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c b/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c index 3ccc6b0a..e85cec9c 100644 --- a/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c +++ b/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c @@ -55,8 +55,17 @@ struct gk20a_ctrl_priv { struct device *dev; struct gk20a *g; struct nvgpu_clk_session *clk_session; + + struct nvgpu_list_node list; }; +static inline struct gk20a_ctrl_priv * +gk20a_ctrl_priv_from_list(struct nvgpu_list_node *node) +{ + return (struct gk20a_ctrl_priv *) + ((uintptr_t)node - offsetof(struct gk20a_ctrl_priv, list)); +} + static u32 gk20a_as_translate_as_alloc_flags(struct gk20a *g, u32 flags) { u32 core_flags = 0; @@ -105,20 +114,30 @@ int gk20a_ctrl_dev_open(struct inode *inode, struct file *filp) err = nvgpu_clk_arb_init_session(g, &priv->clk_session); free_ref: - if (err) { + if (err != 0) { gk20a_put(g); if (priv) nvgpu_kfree(g, priv); + } else { + nvgpu_mutex_acquire(&l->ctrl.privs_lock); + nvgpu_list_add(&priv->list, &l->ctrl.privs); + nvgpu_mutex_release(&l->ctrl.privs_lock); } + return err; } int gk20a_ctrl_dev_release(struct inode *inode, struct file *filp) { struct gk20a_ctrl_priv *priv = filp->private_data; struct gk20a *g = priv->g; + struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); nvgpu_log_fn(g, " "); + nvgpu_mutex_acquire(&l->ctrl.privs_lock); + nvgpu_list_del(&priv->list); + nvgpu_mutex_release(&l->ctrl.privs_lock); + if (priv->clk_session) nvgpu_clk_arb_release_session(g, priv->clk_session); diff --git a/drivers/gpu/nvgpu/os/linux/os_linux.h b/drivers/gpu/nvgpu/os/linux/os_linux.h index d4b5a770..5880384a 100644 --- a/drivers/gpu/nvgpu/os/linux/os_linux.h +++ b/drivers/gpu/nvgpu/os/linux/os_linux.h @@ -65,6 +65,10 @@ struct nvgpu_os_linux { struct { struct cdev cdev; struct device *node; + /* see gk20a_ctrl_priv */ + struct nvgpu_list_node privs; + /* guards modifications to the list and its contents */ + struct nvgpu_mutex privs_lock; } ctrl; struct { diff --git a/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c b/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c index 522f1b86..80bcfffb 100644 --- a/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c +++ b/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c @@ -73,6 +73,9 @@ static void vgpu_init_vars(struct gk20a *g, struct gk20a_platform *platform) nvgpu_mutex_init(&priv->vgpu_clk_get_freq_lock); + nvgpu_mutex_init(&l->ctrl.privs_lock); + nvgpu_init_list_node(&l->ctrl.privs); + l->regs_saved = l->regs; l->bar1_saved = l->bar1; -- cgit v1.2.2