diff options
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c')
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c | 21 |
1 files changed, 20 insertions, 1 deletions
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 { | |||
55 | struct device *dev; | 55 | struct device *dev; |
56 | struct gk20a *g; | 56 | struct gk20a *g; |
57 | struct nvgpu_clk_session *clk_session; | 57 | struct nvgpu_clk_session *clk_session; |
58 | |||
59 | struct nvgpu_list_node list; | ||
58 | }; | 60 | }; |
59 | 61 | ||
62 | static inline struct gk20a_ctrl_priv * | ||
63 | gk20a_ctrl_priv_from_list(struct nvgpu_list_node *node) | ||
64 | { | ||
65 | return (struct gk20a_ctrl_priv *) | ||
66 | ((uintptr_t)node - offsetof(struct gk20a_ctrl_priv, list)); | ||
67 | } | ||
68 | |||
60 | static u32 gk20a_as_translate_as_alloc_flags(struct gk20a *g, u32 flags) | 69 | static u32 gk20a_as_translate_as_alloc_flags(struct gk20a *g, u32 flags) |
61 | { | 70 | { |
62 | u32 core_flags = 0; | 71 | u32 core_flags = 0; |
@@ -105,20 +114,30 @@ int gk20a_ctrl_dev_open(struct inode *inode, struct file *filp) | |||
105 | 114 | ||
106 | err = nvgpu_clk_arb_init_session(g, &priv->clk_session); | 115 | err = nvgpu_clk_arb_init_session(g, &priv->clk_session); |
107 | free_ref: | 116 | free_ref: |
108 | if (err) { | 117 | if (err != 0) { |
109 | gk20a_put(g); | 118 | gk20a_put(g); |
110 | if (priv) | 119 | if (priv) |
111 | nvgpu_kfree(g, priv); | 120 | nvgpu_kfree(g, priv); |
121 | } else { | ||
122 | nvgpu_mutex_acquire(&l->ctrl.privs_lock); | ||
123 | nvgpu_list_add(&priv->list, &l->ctrl.privs); | ||
124 | nvgpu_mutex_release(&l->ctrl.privs_lock); | ||
112 | } | 125 | } |
126 | |||
113 | return err; | 127 | return err; |
114 | } | 128 | } |
115 | int gk20a_ctrl_dev_release(struct inode *inode, struct file *filp) | 129 | int gk20a_ctrl_dev_release(struct inode *inode, struct file *filp) |
116 | { | 130 | { |
117 | struct gk20a_ctrl_priv *priv = filp->private_data; | 131 | struct gk20a_ctrl_priv *priv = filp->private_data; |
118 | struct gk20a *g = priv->g; | 132 | struct gk20a *g = priv->g; |
133 | struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); | ||
119 | 134 | ||
120 | nvgpu_log_fn(g, " "); | 135 | nvgpu_log_fn(g, " "); |
121 | 136 | ||
137 | nvgpu_mutex_acquire(&l->ctrl.privs_lock); | ||
138 | nvgpu_list_del(&priv->list); | ||
139 | nvgpu_mutex_release(&l->ctrl.privs_lock); | ||
140 | |||
122 | if (priv->clk_session) | 141 | if (priv->clk_session) |
123 | nvgpu_clk_arb_release_session(g, priv->clk_session); | 142 | nvgpu_clk_arb_release_session(g, priv->clk_session); |
124 | 143 | ||