linux/drivers/gpu/drm/ttm
Tetsuo Handa 881fdaa5e4 drm/ttm: Avoid memory allocation from shrinker functions.
Andrew Morton wrote:
> On Wed, 12 Nov 2014 13:08:55 +0900 Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp> wrote:
>
> > Andrew Morton wrote:
> > > Poor ttm guys - this is a bit of a trap we set for them.
> >
> > Commit a91576d791 ("drm/ttm: Pass GFP flags in order to avoid deadlock.")
> > changed to use sc->gfp_mask rather than GFP_KERNEL.
> >
> > -       pages_to_free = kmalloc(npages_to_free * sizeof(struct page *),
> > -                       GFP_KERNEL);
> > +       pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp);
> >
> > But this bug is caused by sc->gfp_mask containing some flags which are not
> > in GFP_KERNEL, right? Then, I think
> >
> > -       pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp);
> > +       pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp & GFP_KERNEL);
> >
> > would hide this bug.
> >
> > But I think we should use GFP_ATOMIC (or drop __GFP_WAIT flag)
>
> Well no - ttm_page_pool_free() should stop calling kmalloc altogether.
> Just do
>
> 	struct page *pages_to_free[16];
>
> and rework the code to free 16 pages at a time.  Easy.

Well, ttm code wants to process 512 pages at a time for performance.
Memory footprint increased by 512 * sizeof(struct page *) buffer is
only 4096 bytes. What about using static buffer like below?
----------
>From d3cb5393c9c8099d6b37e769f78c31af1541fe8c Mon Sep 17 00:00:00 2001
From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Date: Thu, 13 Nov 2014 22:21:54 +0900
Subject: [PATCH] drm/ttm: Avoid memory allocation from shrinker functions.

Commit a91576d791 ("drm/ttm: Pass GFP flags in order to avoid
deadlock.") caused BUG_ON() due to sc->gfp_mask containing flags
which are not in GFP_KERNEL.

  https://bugzilla.kernel.org/show_bug.cgi?id=87891

Changing from sc->gfp_mask to (sc->gfp_mask & GFP_KERNEL) would
avoid the BUG_ON(), but avoiding memory allocation from shrinker
function is better and reliable fix.

Shrinker function is already serialized by global lock, and
clean up function is called after shrinker function is unregistered.
Thus, we can use static buffer when called from shrinker function
and clean up function.

Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: stable <stable@kernel.org> [2.6.35+]
Signed-off-by: Dave Airlie <airlied@redhat.com>
2014-11-20 11:31:56 +10:00
..
Makefile drm/ttm: Enable the dma page pool also for intel IOMMUs 2013-11-06 03:55:52 -08:00
ttm_agp_backend.c drm/ttm: Fix memory leak in ttm_agp_backend.c 2014-02-18 14:03:32 +01:00
ttm_bo.c drm/ttm: Don't evict BOs outside of the requested placement range 2014-10-16 18:34:08 -04:00
ttm_bo_manager.c drm/ttm: Use only DRM_MM_SEARCH_BELOW for TTM_PL_FLAG_TOPDOWN 2014-11-12 11:56:33 -05:00
ttm_bo_util.c drm/ttm: Clean usage of ttm_io_prot() with TTM_PL_FLAG_CACHED 2014-09-23 15:00:26 +10:00
ttm_bo_vm.c drm/ttm: Clean usage of ttm_io_prot() with TTM_PL_FLAG_CACHED 2014-09-23 15:00:26 +10:00
ttm_execbuf_util.c drm/ttm: allow fence to be added as shared 2014-09-11 10:46:00 -04:00
ttm_lock.c drivers: gpu: Remove unused function in ttm_lock.c 2014-01-08 13:24:14 +01:00
ttm_memory.c drm/ttm: make sure format string cannot leak in 2014-09-17 11:15:01 +10:00
ttm_module.c drm/ttm: make device_released static 2014-07-22 12:59:32 +10:00
ttm_object.c dma-buf: use reservation objects 2014-07-08 13:03:20 -07:00
ttm_page_alloc.c drm/ttm: Avoid memory allocation from shrinker functions. 2014-11-20 11:31:56 +10:00
ttm_page_alloc_dma.c drm/ttm: Avoid memory allocation from shrinker functions. 2014-11-20 11:31:56 +10:00
ttm_tt.c drm/ttm: expose CPU address of DMA-allocated pages 2014-08-10 01:08:03 +10:00