Ilia Mirkin
2015-May-10 05:57 UTC
[Nouveau] [PATCH] nvc0: switch mechanism for shader eviction to be a while loop
This aligns it to work similarly to nv50. However there's no library code there, so the whole thing can be freed. Here we end up with an allocated node that's not attached to a specific program. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=86792 Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> Cc: mesa-stable at lists.freedesktop.org --- src/gallium/drivers/nouveau/nvc0/nvc0_program.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c index c156e91..5589695 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c @@ -683,11 +683,12 @@ nvc0_program_upload_code(struct nvc0_context *nvc0, struct nvc0_program *prog) ret = nouveau_heap_alloc(screen->text_heap, size, prog, &prog->mem); if (ret) { struct nouveau_heap *heap = screen->text_heap; - struct nouveau_heap *iter; - for (iter = heap; iter && iter->next != heap; iter = iter->next) { - struct nvc0_program *evict = iter->priv; - if (evict) - nouveau_heap_free(&evict->mem); + /* Note that the code library, which is allocated before anything else, + * does not have a priv pointer. We can stop once we hit it. + */ + while (heap->next && heap->next->priv) { + struct nvc0_program *evict = heap->next->priv; + nouveau_heap_free(&evict->mem); } debug_printf("WARNING: out of code space, evicting all shaders.\n"); ret = nouveau_heap_alloc(heap, size, prog, &prog->mem); -- 2.3.6
Tobias Klausmann
2015-May-10 13:47 UTC
[Nouveau] [PATCH] nvc0: switch mechanism for shader eviction to be a while loop
On 10.05.2015 07:57, Ilia Mirkin wrote:> This aligns it to work similarly to nv50. However there's no library > code there, so the whole thing can be freed. Here we end up with an > allocated node that's not attached to a specific program. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=86792 > Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> > Cc: mesa-stable at lists.freedesktop.org > --- > src/gallium/drivers/nouveau/nvc0/nvc0_program.c | 11 ++++++----- > 1 file changed, 6 insertions(+), 5 deletions(-) > > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c > index c156e91..5589695 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c > @@ -683,11 +683,12 @@ nvc0_program_upload_code(struct nvc0_context *nvc0, struct nvc0_program *prog) > ret = nouveau_heap_alloc(screen->text_heap, size, prog, &prog->mem); > if (ret) { > struct nouveau_heap *heap = screen->text_heap; > - struct nouveau_heap *iter; > - for (iter = heap; iter && iter->next != heap; iter = iter->next) { > - struct nvc0_program *evict = iter->priv; > - if (evict) > - nouveau_heap_free(&evict->mem); > + /* Note that the code library, which is allocated before anything else, > + * does not have a priv pointer. We can stop once we hit it. > + */ > + while (heap->next && heap->next->priv) { > + struct nvc0_program *evict = heap->next->priv; > + nouveau_heap_free(&evict->mem); > } > debug_printf("WARNING: out of code space, evicting all shaders.\n"); > ret = nouveau_heap_alloc(heap, size, prog, &prog->mem);The new comment is a bit upside down, but thats not really a problem R-b here as well