diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2014-09-04 10:02:00 -0400 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:11:10 -0400 |
commit | 8095b3cf9cadbcf42a0e5fdcf3fb32cf87c55798 (patch) | |
tree | 8ea662e804502a705f41ad1f67e35559cfaff2dd /drivers | |
parent | b81e9a2431e9a045e586ff028e0262e99202b3f0 (diff) |
gpu: nvgpu: get VM reference for TSG
We store a reference to common address space of channels
in struct tsg_gk20a without increasing the refcount
This could result in freeing the address space even when
some channel in TSG needs it or when we need to free
common gr_ctx
Fix this by getting ref using gk20a_vm_get() when we store
the VM reference. We drop this reference with
gk20a_vm_put() when closing the TSG
Bug 1470692
Change-Id: Ifc1f29d32cd721810bfbb5a4db96095770318c17
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/495668
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/tsg_gk20a.c | 4 |
2 files changed, 6 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c index 69fe4901..976e9171 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c | |||
@@ -2830,10 +2830,13 @@ int gk20a_alloc_obj_ctx(struct channel_gk20a *c, | |||
2830 | } else { | 2830 | } else { |
2831 | if (!tsg->tsg_gr_ctx) { | 2831 | if (!tsg->tsg_gr_ctx) { |
2832 | tsg->vm = c->vm; | 2832 | tsg->vm = c->vm; |
2833 | gk20a_vm_get(tsg->vm); | ||
2833 | err = gr_gk20a_alloc_tsg_gr_ctx(g, tsg); | 2834 | err = gr_gk20a_alloc_tsg_gr_ctx(g, tsg); |
2834 | if (err) { | 2835 | if (err) { |
2835 | gk20a_err(dev_from_gk20a(g), | 2836 | gk20a_err(dev_from_gk20a(g), |
2836 | "fail to allocate TSG gr ctx buffer"); | 2837 | "fail to allocate TSG gr ctx buffer"); |
2838 | gk20a_vm_put(tsg->vm); | ||
2839 | tsg->vm = NULL; | ||
2837 | goto out; | 2840 | goto out; |
2838 | } | 2841 | } |
2839 | } | 2842 | } |
diff --git a/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c b/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c index e7b70894..849c3f6a 100644 --- a/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c | |||
@@ -161,8 +161,10 @@ static void gk20a_tsg_release(struct kref *ref) | |||
161 | gr_gk20a_free_tsg_gr_ctx(tsg); | 161 | gr_gk20a_free_tsg_gr_ctx(tsg); |
162 | tsg->tsg_gr_ctx = NULL; | 162 | tsg->tsg_gr_ctx = NULL; |
163 | } | 163 | } |
164 | if (tsg->vm) | 164 | if (tsg->vm) { |
165 | gk20a_vm_put(tsg->vm); | ||
165 | tsg->vm = NULL; | 166 | tsg->vm = NULL; |
167 | } | ||
166 | 168 | ||
167 | release_used_tsg(&g->fifo, tsg); | 169 | release_used_tsg(&g->fifo, tsg); |
168 | 170 | ||