diff options
Diffstat (limited to 'include/linux/mmzone.h')
| -rw-r--r-- | include/linux/mmzone.h | 26 | 
1 files changed, 25 insertions, 1 deletions
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 5f74891556f3..cd28a100d9e4 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -986,6 +986,25 @@ static inline bool is_zone_device_page(const struct page *page)  {  	return page_zonenum(page) == ZONE_DEVICE;  } + +/* + * Consecutive zone device pages should not be merged into the same sgl + * or bvec segment with other types of pages or if they belong to different + * pgmaps. Otherwise getting the pgmap of a given segment is not possible + * without scanning the entire segment. This helper returns true either if + * both pages are not zone device pages or both pages are zone device pages + * with the same pgmap. + */ +static inline bool zone_device_pages_have_same_pgmap(const struct page *a, +						     const struct page *b) +{ +	if (is_zone_device_page(a) != is_zone_device_page(b)) +		return false; +	if (!is_zone_device_page(a)) +		return true; +	return a->pgmap == b->pgmap; +} +  extern void memmap_init_zone_device(struct zone *, unsigned long,  				    unsigned long, struct dev_pagemap *);  #else @@ -993,6 +1012,11 @@ static inline bool is_zone_device_page(const struct page *page)  {  	return false;  } +static inline bool zone_device_pages_have_same_pgmap(const struct page *a, +						     const struct page *b) +{ +	return true; +}  #endif  static inline bool folio_is_zone_device(const struct folio *folio) @@ -1200,7 +1224,7 @@ typedef struct pglist_data {  	/* start time in ms of current promote threshold adjustment period */  	unsigned int nbp_th_start;  	/* -	 * number of promote candidate pages at stat time of current promote +	 * number of promote candidate pages at start time of current promote  	 * threshold adjustment period  	 */  	unsigned long nbp_th_nr_cand;  |