mirror of
https://github.com/torvalds/linux.git
synced 2024-12-22 02:52:56 +00:00
drm/ttm: Use GFP_TRANSHUGE_LIGHT for allocating huge pages
GFP_TRANSHUGE tries very hard to allocate huge pages, which can result in long delays with high memory pressure. I have observed firefox freezing for up to around a minute due to this while restic was taking a full system backup. Since we don't really need huge pages, use GFP_TRANSHUGE_LIGHT | __GFP_NORETRY instead, in order to fail quickly when there are no huge pages available. Set __GFP_KSWAPD_RECLAIM as well, in order for huge pages to be freed up in the background if necessary. With these changes, I'm no longer seeing freezes during a restic backup. Cc: stable@vger.kernel.org Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
bd4caed47a
commit
da291320ba
@ -910,7 +910,8 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
|
|||||||
while (npages >= HPAGE_PMD_NR) {
|
while (npages >= HPAGE_PMD_NR) {
|
||||||
gfp_t huge_flags = gfp_flags;
|
gfp_t huge_flags = gfp_flags;
|
||||||
|
|
||||||
huge_flags |= GFP_TRANSHUGE;
|
huge_flags |= GFP_TRANSHUGE_LIGHT | __GFP_NORETRY |
|
||||||
|
__GFP_KSWAPD_RECLAIM;
|
||||||
huge_flags &= ~__GFP_MOVABLE;
|
huge_flags &= ~__GFP_MOVABLE;
|
||||||
huge_flags &= ~__GFP_COMP;
|
huge_flags &= ~__GFP_COMP;
|
||||||
p = alloc_pages(huge_flags, HPAGE_PMD_ORDER);
|
p = alloc_pages(huge_flags, HPAGE_PMD_ORDER);
|
||||||
@ -1027,11 +1028,15 @@ int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages)
|
|||||||
GFP_USER | GFP_DMA32, "uc dma", 0);
|
GFP_USER | GFP_DMA32, "uc dma", 0);
|
||||||
|
|
||||||
ttm_page_pool_init_locked(&_manager->wc_pool_huge,
|
ttm_page_pool_init_locked(&_manager->wc_pool_huge,
|
||||||
GFP_TRANSHUGE & ~(__GFP_MOVABLE | __GFP_COMP),
|
(GFP_TRANSHUGE_LIGHT | __GFP_NORETRY |
|
||||||
|
__GFP_KSWAPD_RECLAIM) &
|
||||||
|
~(__GFP_MOVABLE | __GFP_COMP),
|
||||||
"wc huge", order);
|
"wc huge", order);
|
||||||
|
|
||||||
ttm_page_pool_init_locked(&_manager->uc_pool_huge,
|
ttm_page_pool_init_locked(&_manager->uc_pool_huge,
|
||||||
GFP_TRANSHUGE & ~(__GFP_MOVABLE | __GFP_COMP)
|
(GFP_TRANSHUGE_LIGHT | __GFP_NORETRY |
|
||||||
|
__GFP_KSWAPD_RECLAIM) &
|
||||||
|
~(__GFP_MOVABLE | __GFP_COMP)
|
||||||
, "uc huge", order);
|
, "uc huge", order);
|
||||||
|
|
||||||
_manager->options.max_size = max_pages;
|
_manager->options.max_size = max_pages;
|
||||||
|
@ -910,7 +910,8 @@ static gfp_t ttm_dma_pool_gfp_flags(struct ttm_dma_tt *ttm_dma, bool huge)
|
|||||||
gfp_flags |= __GFP_ZERO;
|
gfp_flags |= __GFP_ZERO;
|
||||||
|
|
||||||
if (huge) {
|
if (huge) {
|
||||||
gfp_flags |= GFP_TRANSHUGE;
|
gfp_flags |= GFP_TRANSHUGE_LIGHT | __GFP_NORETRY |
|
||||||
|
__GFP_KSWAPD_RECLAIM;
|
||||||
gfp_flags &= ~__GFP_MOVABLE;
|
gfp_flags &= ~__GFP_MOVABLE;
|
||||||
gfp_flags &= ~__GFP_COMP;
|
gfp_flags &= ~__GFP_COMP;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user