Re: [PATCH v3 6/6] drm/pagemap: Add fault injection for higher-order RAM folio allocation
Matthew Brost <[email protected]>
| Newsgroups | org.freedesktop.lists.intel-xe |
|---|---|
| Message-ID | <[email protected]> |
On Thu, Aug 20, 2026 at 03:58:16PM +0530, Ghimiray, Himal Prasad wrote: > > > On 20-08-2026 12:33, Matthew Brost wrote: > > On Sun, Aug 16, 2026 at 08:44:21PM +0530, Ghimiray, Himal Prasad wrote: > > > > > > > > > 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. > > > > I checked on this and kernel wide no code seems to undo > > fault_create_debugfs_attr on module unload, nor is there a function in > > linux/fault-inject.h to undo all debugfs entries setup. > > I believe the cleanup is done via standard debugfs_remove_recursive via > passing the fault_create_debugfs_attr dir or parent. Here we have no parent > so > > dir = fault_create_debugfs_attr at init > > and debugfs_remove_recursive(dir) should be sufficient during > drm_pagemap_exit > > I assume not cleaning it exit might leave the debugfs entries incase of > module unload. I think you are right here - realised this after typing this. Will fix. Matt > > > > So IMO this is either everyone is kernel is doing this wrong or this is > > a non-issue. debugfs_create_file kernel doc seems to indicate all > > debugfs enteries should be removed with debugfs_remove though (?). > > Either way I'd say this out of scope for this series. > > > > Matt > > > > > > flush_work(&drm_pagemap_work); > > > >