Re: [PATCH v3 6/6] drm/pagemap: Add fault injection for higher-order RAM folio allocation
"Ghimiray, Himal Prasad" <[email protected]>
| Newsgroups | org.freedesktop.lists.intel-xe |
|---|---|
| Message-ID | <[email protected]> |
On 06-08-2026 04:40, Matthew Brost wrote: > Migrating a device-private THP back to system memory has two distinct > paths in __migrate_device_pages(): the fast path where both source and > destination carry MIGRATE_PFN_COMPOUND, and the fallback path where the > destination could only be satisfied with order-0 folios and the source > THP therefore has to be split via migrate_vma_split_unmapped_folio(). > > The fallback path only triggers under genuine memory pressure, which > makes it both rare and awkward to reproduce, yet it is the path where > the interesting refcounting happens (the CPU fault holds an extra > reference on the device folio taken by do_huge_pmd_device_private()). > > Add a fault_attr, modelled on backup_fault_inject in ttm_pool.c, that > forces the higher-order allocation in > drm_pagemap_migrate_populate_ram_pfn() to fail so the existing order-0 > fallback is taken deterministically. > > The attribute is exposed at /sys/kernel/debug/drm_pagemap_fault_inject > and requires CONFIG_FAULT_INJECTION_DEBUG_FS. With > CONFIG_FAULT_INJECTION disabled the helper compiles out to a constant > false and the injection has no cost. > > Cc: Andrew Morton <[email protected]> > Cc: David Hildenbrand <[email protected]> > Cc: Lorenzo Stoakes <[email protected]> > Cc: Zi Yan <[email protected]> > Cc: Baolin Wang <[email protected]> > Cc: Liam R. Howlett <[email protected]> > Cc: Nico Pache <[email protected]> > Cc: Ryan Roberts <[email protected]> > Cc: Dev Jain <[email protected]> > Cc: Barry Song <[email protected]> > Cc: Lance Yang <[email protected]> > Cc: Usama Arif <[email protected]> > Cc: Joshua Hahn <[email protected]> > Cc: Rakie Kim <[email protected]> > Cc: Byungchul Park <[email protected]> > Cc: Gregory Price <[email protected]> > Cc: Ying Huang <[email protected]> > Cc: Alistair Popple <[email protected]> > Cc: Balbir Singh <[email protected]> > Cc: Maarten Lankhorst <[email protected]> > Cc: Maxime Ripard <[email protected]> > Cc: Thomas Zimmermann <[email protected]> > Cc: David Airlie <[email protected]> > Cc: Simona Vetter <[email protected]> > Cc: Thomas Hellström <[email protected]> > Cc: Francois Dugast <[email protected]> > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Assisted-by: GitHub_Copilot:claude-opus-5 > Signed-off-by: Matthew Brost <[email protected]> > --- > drivers/gpu/drm/drm_pagemap.c | 36 ++++++++++++++++++++++++++++++++++- > 1 file changed, 35 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/drm_pagemap.c b/drivers/gpu/drm/drm_pagemap.c > index 51c6f12e4256..6ae8c9aa36cc 100644 > --- a/drivers/gpu/drm/drm_pagemap.c > +++ b/drivers/gpu/drm/drm_pagemap.c > @@ -3,6 +3,7 @@ > * Copyright © 2024-2025 Intel Corporation > */ > > +#include <linux/debugfs.h> > #include <linux/dma-fence.h> > #include <linux/dma-mapping.h> > #include <linux/migrate.h> > @@ -12,6 +13,27 @@ > #include <drm/drm_pagemap_util.h> > #include <drm/drm_print.h> > > +#ifdef CONFIG_FAULT_INJECTION > +#include <linux/fault-inject.h> > +static DECLARE_FAULT_ATTR(migrate_to_ram_fault_inject); > + > +/* > + * Force a higher-order destination folio allocation to fail in > + * drm_pagemap_migrate_populate_ram_pfn(), exercising the order-0 fallback > + * (and, in turn, the THP split path in __migrate_device_pages()) without > + * having to drive the system into actual memory pressure. > + */ > +static bool drm_pagemap_fault_inject_folio(void) > +{ > + return should_fail(&migrate_to_ram_fault_inject, 1); > +} > +#else > +static bool drm_pagemap_fault_inject_folio(void) > +{ > + return false; > +} > +#endif > + > /** > * DOC: Overview > * > @@ -960,7 +982,9 @@ static int drm_pagemap_migrate_populate_ram_pfn(struct vm_area_struct *vas, > if (order) > gfp |= __GFP_NOWARN; > > - if (vas) > + if (order && drm_pagemap_fault_inject_folio()) > + folio = NULL; > + else if (vas) > folio = vma_alloc_folio(gfp, order, vas, addr); > else > folio = folio_alloc(gfp, order); > @@ -1554,6 +1578,16 @@ void drm_pagemap_destroy(struct drm_pagemap *dpagemap, bool is_atomic_or_reclaim > kfree(dpagemap); > } > > +static int __init drm_pagemap_module_init(void) > +{ > +#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_FAULT_INJECTION) > + fault_create_debugfs_attr("drm_pagemap_fault_inject", NULL, > + &migrate_to_ram_fault_inject); > +#endif > + return 0; > +} > +module_init(drm_pagemap_module_init); > + > static void drm_pagemap_exit(void) > { Missed fault injection debugfs removal ? Sashiko flags it and looks valid concern. > flush_work(&drm_pagemap_work);