diff mbox

drm/ttm: fix the fix for huge compound pages

Message ID 20171012173028.1505-1-deathsimple@vodafone.de (mailing list archive)
State New, archived
Headers show

Commit Message

Christian König Oct. 12, 2017, 5:30 p.m. UTC
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(-)

Comments

Christian König Oct. 13, 2017, 12:02 p.m. UTC | #1
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;
Michel Dänzer Oct. 13, 2017, 1:31 p.m. UTC | #2
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 mbox

Patch

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;