Marcin Slusarz
2012-Oct-11 21:53 UTC
[Nouveau] [PATCH] drm/nouveau: fix nouveau_mm/nouveau_mm_node leak
Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com>
---
drivers/gpu/drm/nouveau/core/core/gpuobj.c | 6 +++++-
drivers/gpu/drm/nouveau/core/include/core/gpuobj.h | 3 +++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/nouveau/core/core/gpuobj.c
b/drivers/gpu/drm/nouveau/core/core/gpuobj.c
index c2a7608..48121d2 100644
--- a/drivers/gpu/drm/nouveau/core/core/gpuobj.c
+++ b/drivers/gpu/drm/nouveau/core/core/gpuobj.c
@@ -39,8 +39,11 @@ nouveau_gpuobj_destroy(struct nouveau_gpuobj *gpuobj)
nv_wo32(gpuobj, i, 0x00000000);
}
+ if (gpuobj->node)
+ nouveau_mm_free(gpuobj->node_heap, &gpuobj->node);
+
if (gpuobj->heap.block_size)
- nouveau_mm_fini(&gpuobj->heap);
+ WARN_ON(nouveau_mm_fini(&gpuobj->heap));
nouveau_object_destroy(&gpuobj->base);
}
@@ -114,6 +117,7 @@ nouveau_gpuobj_create_(struct nouveau_object *parent,
max(align, (u32)1), &gpuobj->node);
if (ret)
return ret;
+ gpuobj->node_heap = heap;
gpuobj->addr += gpuobj->node->offset;
}
diff --git a/drivers/gpu/drm/nouveau/core/include/core/gpuobj.h
b/drivers/gpu/drm/nouveau/core/include/core/gpuobj.h
index d09adf1..f65bf5b 100644
--- a/drivers/gpu/drm/nouveau/core/include/core/gpuobj.h
+++ b/drivers/gpu/drm/nouveau/core/include/core/gpuobj.h
@@ -16,7 +16,10 @@ struct nouveau_vm;
struct nouveau_gpuobj {
struct nouveau_object base;
struct nouveau_object *parent;
+
+ struct nouveau_mm *node_heap;
struct nouveau_mm_node *node;
+
struct nouveau_mm heap;
u32 flags;
--
1.7.12
Marcin Slusarz
2012-Oct-16 21:41 UTC
[Nouveau] [PATCH] drm/nouveau: fix nouveau_mm/nouveau_mm_node leak
On Thu, Oct 11, 2012 at 11:53:09PM +0200, Marcin Slusarz wrote:> Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com> > --- > drivers/gpu/drm/nouveau/core/core/gpuobj.c | 6 +++++- > drivers/gpu/drm/nouveau/core/include/core/gpuobj.h | 3 +++ > 2 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/nouveau/core/core/gpuobj.c b/drivers/gpu/drm/nouveau/core/core/gpuobj.c > index c2a7608..48121d2 100644 > --- a/drivers/gpu/drm/nouveau/core/core/gpuobj.c > +++ b/drivers/gpu/drm/nouveau/core/core/gpuobj.c > @@ -39,8 +39,11 @@ nouveau_gpuobj_destroy(struct nouveau_gpuobj *gpuobj) > nv_wo32(gpuobj, i, 0x00000000); > } > > + if (gpuobj->node) > + nouveau_mm_free(gpuobj->node_heap, &gpuobj->node); > + > if (gpuobj->heap.block_size) > - nouveau_mm_fini(&gpuobj->heap); > + WARN_ON(nouveau_mm_fini(&gpuobj->heap)); > > nouveau_object_destroy(&gpuobj->base); > } > @@ -114,6 +117,7 @@ nouveau_gpuobj_create_(struct nouveau_object *parent, > max(align, (u32)1), &gpuobj->node); > if (ret) > return ret; > + gpuobj->node_heap = heap; > > gpuobj->addr += gpuobj->node->offset; > } > diff --git a/drivers/gpu/drm/nouveau/core/include/core/gpuobj.h b/drivers/gpu/drm/nouveau/core/include/core/gpuobj.h > index d09adf1..f65bf5b 100644 > --- a/drivers/gpu/drm/nouveau/core/include/core/gpuobj.h > +++ b/drivers/gpu/drm/nouveau/core/include/core/gpuobj.h > @@ -16,7 +16,10 @@ struct nouveau_vm; > struct nouveau_gpuobj { > struct nouveau_object base; > struct nouveau_object *parent; > + > + struct nouveau_mm *node_heap; > struct nouveau_mm_node *node; > + > struct nouveau_mm heap; > > u32 flags; > --What's wrong with this patch?
Ben Skeggs
2012-Oct-19 06:05 UTC
[Nouveau] [PATCH] drm/nouveau: fix nouveau_mm/nouveau_mm_node leak
On Thu, Oct 11, 2012 at 11:53:09PM +0200, Marcin Slusarz wrote:> Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com> > --- > drivers/gpu/drm/nouveau/core/core/gpuobj.c | 6 +++++- > drivers/gpu/drm/nouveau/core/include/core/gpuobj.h | 3 +++ > 2 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/nouveau/core/core/gpuobj.c b/drivers/gpu/drm/nouveau/core/core/gpuobj.c > index c2a7608..48121d2 100644 > --- a/drivers/gpu/drm/nouveau/core/core/gpuobj.c > +++ b/drivers/gpu/drm/nouveau/core/core/gpuobj.c > @@ -39,8 +39,11 @@ nouveau_gpuobj_destroy(struct nouveau_gpuobj *gpuobj) > nv_wo32(gpuobj, i, 0x00000000); > } > > + if (gpuobj->node) > + nouveau_mm_free(gpuobj->node_heap, &gpuobj->node); > +if (gpuobj->node) { nouveau_mm_free(&nv_gpuobj(gpuobj->parent)->heap, &gpuobj->node); } Or something to that effect, instead of having to store the heap pointer again.> if (gpuobj->heap.block_size) > - nouveau_mm_fini(&gpuobj->heap); > + WARN_ON(nouveau_mm_fini(&gpuobj->heap));Alright, I get this. However, perhaps we should go the full hog here and make nouveau_mm_fini() directly do the WARN_ON() in this situation? There was, once upon a time, reasons for it not doing this, I don't believe they're valid anymore though. If you want to do this, that'd be great. Bonus points for being in a separate patch :)> > nouveau_object_destroy(&gpuobj->base); > } > @@ -114,6 +117,7 @@ nouveau_gpuobj_create_(struct nouveau_object *parent, > max(align, (u32)1), &gpuobj->node); > if (ret) > return ret; > + gpuobj->node_heap = heap; > > gpuobj->addr += gpuobj->node->offset; > } > diff --git a/drivers/gpu/drm/nouveau/core/include/core/gpuobj.h b/drivers/gpu/drm/nouveau/core/include/core/gpuobj.h > index d09adf1..f65bf5b 100644 > --- a/drivers/gpu/drm/nouveau/core/include/core/gpuobj.h > +++ b/drivers/gpu/drm/nouveau/core/include/core/gpuobj.h > @@ -16,7 +16,10 @@ struct nouveau_vm; > struct nouveau_gpuobj { > struct nouveau_object base; > struct nouveau_object *parent; > + > + struct nouveau_mm *node_heap; > struct nouveau_mm_node *node; > + > struct nouveau_mm heap; > > u32 flags; > -- > 1.7.12 > > _______________________________________________ > Nouveau mailing list > Nouveau at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/nouveau
Marcin Slusarz
2012-Oct-21 22:20 UTC
[Nouveau] [PATCH v2] drm/nouveau: fix nouveau_mm/nouveau_mm_node leak
v2: use already existing parent
Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com>
---
drivers/gpu/drm/nouveau/core/core/gpuobj.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/gpu/drm/nouveau/core/core/gpuobj.c
b/drivers/gpu/drm/nouveau/core/core/gpuobj.c
index c2a7608..18b3f5c 100644
--- a/drivers/gpu/drm/nouveau/core/core/gpuobj.c
+++ b/drivers/gpu/drm/nouveau/core/core/gpuobj.c
@@ -39,6 +39,11 @@ nouveau_gpuobj_destroy(struct nouveau_gpuobj *gpuobj)
nv_wo32(gpuobj, i, 0x00000000);
}
+ if (gpuobj->node) {
+ nouveau_mm_free(&nv_gpuobj(gpuobj->parent)->heap,
+ &gpuobj->node);
+ }
+
if (gpuobj->heap.block_size)
nouveau_mm_fini(&gpuobj->heap);
--
1.7.12
Marcin Slusarz
2012-Oct-21 22:21 UTC
[Nouveau] [PATCH] drm/nouveau: warn when trying to free mm which is still in use
Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com>
---
drivers/gpu/drm/nouveau/core/core/mm.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/nouveau/core/core/mm.c
b/drivers/gpu/drm/nouveau/core/core/mm.c
index bfddf87..4d62064 100644
--- a/drivers/gpu/drm/nouveau/core/core/mm.c
+++ b/drivers/gpu/drm/nouveau/core/core/mm.c
@@ -236,7 +236,7 @@ nouveau_mm_fini(struct nouveau_mm *mm)
int nodes = 0;
list_for_each_entry(node, &mm->nodes, nl_entry) {
- if (nodes++ == mm->heap_nodes)
+ if (WARN_ON(nodes++ == mm->heap_nodes))
return -EBUSY;
}
--
1.7.12
Maybe Matching Threads
- [PATCH] drm/nouveau: fix error handling in core/core object creation functions
- [PATCH] drm/nouveau: fix ltcg memory corruptions
- [PATCH] drm/nouveau: fix ltcg memory initialization after suspend
- [PATCH 1/4] nouveau: Allow allocating BOs at specific offsets
- [PATCH] drm/nouveau: force alignment to 0x1000 for gpu objects