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);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.