Multiple mm/ subsystems already skip operations for ZONE_DEVICE folios, and N_MEMORY_PRIVATE folios share the checkpoints for ZONE_DEVICE pages.
Add folio_is_private_managed() as a unified predicate that returns true for folios on N_MEMORY_PRIVATE nodes or in ZONE_DEVICE. This predicate replaces folio_is_zone_device at skip sites where both folio types should be excluded from an MM operation. At some locations, explicit zone_device vs private_node checks are more appropriate when the operations between the two fundamentally differ. The !CONFIG_NUMA stubs fall through to folio_is_zone_device() only, preserving existing behavior when NUMA is disabled. Signed-off-by: Gregory Price <[email protected]> --- include/linux/node_private.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/include/linux/node_private.h b/include/linux/node_private.h index 6a70ec39d569..7687a4cf990c 100644 --- a/include/linux/node_private.h +++ b/include/linux/node_private.h @@ -92,6 +92,16 @@ static inline bool page_is_private_node(struct page *page) return node_state(page_to_nid(page), N_MEMORY_PRIVATE); } +static inline bool folio_is_private_managed(struct folio *folio) +{ + return folio_is_zone_device(folio) || folio_is_private_node(folio); +} + +static inline bool page_is_private_managed(struct page *page) +{ + return folio_is_private_managed(page_folio(page)); +} + static inline const struct node_private_ops * folio_node_private_ops(struct folio *folio) { @@ -146,6 +156,16 @@ static inline bool page_is_private_node(struct page *page) return false; } +static inline bool folio_is_private_managed(struct folio *folio) +{ + return folio_is_zone_device(folio); +} + +static inline bool page_is_private_managed(struct page *page) +{ + return folio_is_private_managed(page_folio(page)); +} + static inline const struct node_private_ops * folio_node_private_ops(struct folio *folio) { -- 2.53.0
