Message ID | 20171012173028.1505-1-deathsimple@vodafone.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Michel, gentle ping to you. With that patch applied piglit seems to be stable on my Tonga (with a bit older Mesa). Christian. Am 12.10.2017 um 19:30 schrieb Christian König: > From: Christian König <christian.koenig@amd.com> > > We don't use compound pages at the moment. Take this into account when > freeing them. > > Signed-off-by: Christian König <christian.koenig@amd.comd> > --- > drivers/gpu/drm/ttm/ttm_page_alloc.c | 21 ++++++++++++++++----- > 1 file changed, 16 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c > index b6f16e7ffff3..c3be50f41461 100644 > --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c > +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c > @@ -731,22 +731,33 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags, > /* No pool for this memory type so free the pages */ > i = 0; > while (i < npages) { > - unsigned order; > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + struct page *p = pages[i]; > +#endif > + unsigned order = 0, j; > > if (!pages[i]) { > ++i; > continue; > } > > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + for (j = 0; j < HPAGE_PMD_NR; ++j) > + if (p++ != pages[i + j]) > + break; > + > + if (j == HPAGE_PMD_NR) > + order = HPAGE_PMD_ORDER; > +#endif > + > if (page_count(pages[i]) != 1) > pr_err("Erroneous page count. Leaking pages.\n"); > - order = compound_order(pages[i]); > __free_pages(pages[i], order); > > - order = 1 << order; > - while (order) { > + j = 1 << order; > + while (j) { > pages[i++] = NULL; > - --order; > + --j; > } > } > return;
On 12/10/17 07:30 PM, Christian König wrote: > From: Christian König <christian.koenig@amd.com> > > We don't use compound pages at the moment. Take this into account when > freeing them. > > Signed-off-by: Christian König <christian.koenig@amd.comd> > --- > drivers/gpu/drm/ttm/ttm_page_alloc.c | 21 ++++++++++++++++----- > 1 file changed, 16 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c > index b6f16e7ffff3..c3be50f41461 100644 > --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c > +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c > @@ -731,22 +731,33 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags, > /* No pool for this memory type so free the pages */ > i = 0; > while (i < npages) { > - unsigned order; > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + struct page *p = pages[i]; > +#endif > + unsigned order = 0, j; > > if (!pages[i]) { > ++i; > continue; > } > > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + for (j = 0; j < HPAGE_PMD_NR; ++j) > + if (p++ != pages[i + j]) > + break; > + > + if (j == HPAGE_PMD_NR) > + order = HPAGE_PMD_ORDER; > +#endif > + > if (page_count(pages[i]) != 1) > pr_err("Erroneous page count. Leaking pages.\n"); > - order = compound_order(pages[i]); > __free_pages(pages[i], order); > > - order = 1 << order; > - while (order) { > + j = 1 << order; > + while (j) { > pages[i++] = NULL; > - --order; > + --j; > } > } > return; > Maybe the shortlog could be a better summary of what the change does, but I don't have a good suggestion, so either way Reviewed-and-Tested-by: Michel Dänzer <michel.daenzer@amd.com> Thanks Christian.
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index b6f16e7ffff3..c3be50f41461 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c @@ -731,22 +731,33 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags, /* No pool for this memory type so free the pages */ i = 0; while (i < npages) { - unsigned order; +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + struct page *p = pages[i]; +#endif + unsigned order = 0, j; if (!pages[i]) { ++i; continue; } +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + for (j = 0; j < HPAGE_PMD_NR; ++j) + if (p++ != pages[i + j]) + break; + + if (j == HPAGE_PMD_NR) + order = HPAGE_PMD_ORDER; +#endif + if (page_count(pages[i]) != 1) pr_err("Erroneous page count. Leaking pages.\n"); - order = compound_order(pages[i]); __free_pages(pages[i], order); - order = 1 << order; - while (order) { + j = 1 << order; + while (j) { pages[i++] = NULL; - --order; + --j; } } return;