Message ID | 20171102173451.30675-1-michel@daenzer.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Am 02.11.2017 um 18:34 schrieb Michel Dänzer: > From: Michel Dänzer <michel.daenzer@amd.com> > > Memory allocation failure should generally be handled gracefully by > callers. In particular, with transparent hugepage support, attempts > to allocate huge pages can fail under memory pressure, but the callers > fall back to allocating individual pages instead. In that case, there > would be spurious > > [TTM] Unable to get page %u > > error messages in dmesg. > > Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> Reminds me that I wanted to better test this code path, so how did you triggered that? Anyway patch is Reviewed-by: Christian König <christian.koenig@amd.com>. Thanks, Christian. > --- > drivers/gpu/drm/ttm/ttm_page_alloc.c | 13 ++++++------- > drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 12 ++++++------ > 2 files changed, 12 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c > index 4d688c8d7853..316f831ad5f0 100644 > --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c > +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c > @@ -329,7 +329,7 @@ static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free, > pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), > GFP_KERNEL); > if (!pages_to_free) { > - pr_err("Failed to allocate memory for pool free operation\n"); > + pr_debug("Failed to allocate memory for pool free operation\n"); > return 0; > } > > @@ -517,7 +517,7 @@ static int ttm_alloc_new_pages(struct list_head *pages, gfp_t gfp_flags, > caching_array = kmalloc(max_cpages*sizeof(struct page *), GFP_KERNEL); > > if (!caching_array) { > - pr_err("Unable to allocate table for new pages\n"); > + pr_debug("Unable to allocate table for new pages\n"); > return -ENOMEM; > } > > @@ -525,7 +525,7 @@ static int ttm_alloc_new_pages(struct list_head *pages, gfp_t gfp_flags, > p = alloc_pages(gfp_flags, order); > > if (!p) { > - pr_err("Unable to get page %u\n", i); > + pr_debug("Unable to get page %u\n", i); > > /* store already allocated pages in the pool after > * setting the caching state */ > @@ -625,7 +625,7 @@ static void ttm_page_pool_fill_locked(struct ttm_page_pool *pool, int ttm_flags, > ++pool->nrefills; > pool->npages += alloc_size; > } else { > - pr_err("Failed to fill pool (%p)\n", pool); > + pr_debug("Failed to fill pool (%p)\n", pool); > /* If we have any pages left put them to the pool. */ > list_for_each_entry(p, &new_pages, lru) { > ++cpages; > @@ -885,8 +885,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, > while (npages) { > p = alloc_page(gfp_flags); > if (!p) { > - > - pr_err("Unable to allocate page\n"); > + pr_debug("Unable to allocate page\n"); > return -ENOMEM; > } > > @@ -925,7 +924,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, > /* If there is any pages in the list put them back to > * the pool. > */ > - pr_err("Failed to allocate extra pages for large request\n"); > + pr_debug("Failed to allocate extra pages for large request\n"); > ttm_put_pages(pages, count, flags, cstate); > return r; > } > diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c > index 96ad12906621..6b2627fe9bc1 100644 > --- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c > +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c > @@ -463,7 +463,7 @@ static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free, > GFP_KERNEL); > > if (!pages_to_free) { > - pr_err("%s: Failed to allocate memory for pool free operation\n", > + pr_debug("%s: Failed to allocate memory for pool free operation\n", > pool->dev_name); > return 0; > } > @@ -755,7 +755,7 @@ static int ttm_dma_pool_alloc_new_pages(struct dma_pool *pool, > caching_array = kmalloc(max_cpages*sizeof(struct page *), GFP_KERNEL); > > if (!caching_array) { > - pr_err("%s: Unable to allocate table for new pages\n", > + pr_debug("%s: Unable to allocate table for new pages\n", > pool->dev_name); > return -ENOMEM; > } > @@ -768,8 +768,8 @@ static int ttm_dma_pool_alloc_new_pages(struct dma_pool *pool, > for (i = 0, cpages = 0; i < count; ++i) { > dma_p = __ttm_dma_alloc_page(pool); > if (!dma_p) { > - pr_err("%s: Unable to get page %u\n", > - pool->dev_name, i); > + pr_debug("%s: Unable to get page %u\n", > + pool->dev_name, i); > > /* store already allocated pages in the pool after > * setting the caching state */ > @@ -855,8 +855,8 @@ static int ttm_dma_page_pool_fill_locked(struct dma_pool *pool, > struct dma_page *d_page; > unsigned cpages = 0; > > - pr_err("%s: Failed to fill %s pool (r:%d)!\n", > - pool->dev_name, pool->name, r); > + pr_debug("%s: Failed to fill %s pool (r:%d)!\n", > + pool->dev_name, pool->name, r); > > list_for_each_entry(d_page, &d_pages, page_list) { > cpages++;
On 02/11/17 06:37 PM, Christian König wrote: > Am 02.11.2017 um 18:34 schrieb Michel Dänzer: >> From: Michel Dänzer <michel.daenzer@amd.com> >> >> Memory allocation failure should generally be handled gracefully by >> callers. In particular, with transparent hugepage support, attempts >> to allocate huge pages can fail under memory pressure, but the callers >> fall back to allocating individual pages instead. In that case, there >> would be spurious >> >> [TTM] Unable to get page %u >> >> error messages in dmesg. >> >> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> > > Reminds me that I wanted to better test this code path, so how did you > triggered that? 1. Enable zswap by writing 1 to /sys/module/zswap/parameters/enabled 2. Create enough memory pressure that the system starts hitting swap. E.g. in my case I think a full LLVM build does the trick. /sys/kernel/debug/zswap/pool_total_size should contain a non-0 value now. 3. Run the piglit gpu profile. > Anyway patch is Reviewed-by: Christian König <christian.koenig@amd.com>. Thanks!
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index 4d688c8d7853..316f831ad5f0 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c @@ -329,7 +329,7 @@ static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free, pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), GFP_KERNEL); if (!pages_to_free) { - pr_err("Failed to allocate memory for pool free operation\n"); + pr_debug("Failed to allocate memory for pool free operation\n"); return 0; } @@ -517,7 +517,7 @@ static int ttm_alloc_new_pages(struct list_head *pages, gfp_t gfp_flags, caching_array = kmalloc(max_cpages*sizeof(struct page *), GFP_KERNEL); if (!caching_array) { - pr_err("Unable to allocate table for new pages\n"); + pr_debug("Unable to allocate table for new pages\n"); return -ENOMEM; } @@ -525,7 +525,7 @@ static int ttm_alloc_new_pages(struct list_head *pages, gfp_t gfp_flags, p = alloc_pages(gfp_flags, order); if (!p) { - pr_err("Unable to get page %u\n", i); + pr_debug("Unable to get page %u\n", i); /* store already allocated pages in the pool after * setting the caching state */ @@ -625,7 +625,7 @@ static void ttm_page_pool_fill_locked(struct ttm_page_pool *pool, int ttm_flags, ++pool->nrefills; pool->npages += alloc_size; } else { - pr_err("Failed to fill pool (%p)\n", pool); + pr_debug("Failed to fill pool (%p)\n", pool); /* If we have any pages left put them to the pool. */ list_for_each_entry(p, &new_pages, lru) { ++cpages; @@ -885,8 +885,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, while (npages) { p = alloc_page(gfp_flags); if (!p) { - - pr_err("Unable to allocate page\n"); + pr_debug("Unable to allocate page\n"); return -ENOMEM; } @@ -925,7 +924,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, /* If there is any pages in the list put them back to * the pool. */ - pr_err("Failed to allocate extra pages for large request\n"); + pr_debug("Failed to allocate extra pages for large request\n"); ttm_put_pages(pages, count, flags, cstate); return r; } diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c index 96ad12906621..6b2627fe9bc1 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c @@ -463,7 +463,7 @@ static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free, GFP_KERNEL); if (!pages_to_free) { - pr_err("%s: Failed to allocate memory for pool free operation\n", + pr_debug("%s: Failed to allocate memory for pool free operation\n", pool->dev_name); return 0; } @@ -755,7 +755,7 @@ static int ttm_dma_pool_alloc_new_pages(struct dma_pool *pool, caching_array = kmalloc(max_cpages*sizeof(struct page *), GFP_KERNEL); if (!caching_array) { - pr_err("%s: Unable to allocate table for new pages\n", + pr_debug("%s: Unable to allocate table for new pages\n", pool->dev_name); return -ENOMEM; } @@ -768,8 +768,8 @@ static int ttm_dma_pool_alloc_new_pages(struct dma_pool *pool, for (i = 0, cpages = 0; i < count; ++i) { dma_p = __ttm_dma_alloc_page(pool); if (!dma_p) { - pr_err("%s: Unable to get page %u\n", - pool->dev_name, i); + pr_debug("%s: Unable to get page %u\n", + pool->dev_name, i); /* store already allocated pages in the pool after * setting the caching state */ @@ -855,8 +855,8 @@ static int ttm_dma_page_pool_fill_locked(struct dma_pool *pool, struct dma_page *d_page; unsigned cpages = 0; - pr_err("%s: Failed to fill %s pool (r:%d)!\n", - pool->dev_name, pool->name, r); + pr_debug("%s: Failed to fill %s pool (r:%d)!\n", + pool->dev_name, pool->name, r); list_for_each_entry(d_page, &d_pages, page_list) { cpages++;