diff options
Diffstat (limited to 'fs/proc/internal.h')
| -rw-r--r-- | fs/proc/internal.h | 57 | 
1 files changed, 57 insertions, 0 deletions
| diff --git a/fs/proc/internal.h b/fs/proc/internal.h index 1695509370b8..96122e91c645 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h @@ -85,6 +85,20 @@ static inline void pde_make_permanent(struct proc_dir_entry *pde)  	pde->flags |= PROC_ENTRY_PERMANENT;  } +static inline bool pde_has_proc_read_iter(const struct proc_dir_entry *pde) +{ +	return pde->flags & PROC_ENTRY_proc_read_iter; +} + +static inline bool pde_has_proc_compat_ioctl(const struct proc_dir_entry *pde) +{ +#ifdef CONFIG_COMPAT +	return pde->flags & PROC_ENTRY_proc_compat_ioctl; +#else +	return false; +#endif +} +  extern struct kmem_cache *proc_dir_entry_cache;  void pde_free(struct proc_dir_entry *pde); @@ -143,6 +157,7 @@ unsigned name_to_int(const struct qstr *qstr);  /* Worst case buffer size needed for holding an integer. */  #define PROC_NUMBUF 13 +#ifdef CONFIG_PAGE_MAPCOUNT  /**   * folio_precise_page_mapcount() - Number of mappings of this folio page.   * @folio: The folio. @@ -173,7 +188,49 @@ static inline int folio_precise_page_mapcount(struct folio *folio,  	return mapcount;  } +#else /* !CONFIG_PAGE_MAPCOUNT */ +static inline int folio_precise_page_mapcount(struct folio *folio, +		struct page *page) +{ +	BUILD_BUG(); +} +#endif /* CONFIG_PAGE_MAPCOUNT */ +/** + * folio_average_page_mapcount() - Average number of mappings per page in this + *				   folio + * @folio: The folio. + * + * The average number of user page table entries that reference each page in + * this folio as tracked via the RMAP: either referenced directly (PTE) or + * as part of a larger area that covers this page (e.g., PMD). + * + * The average is calculated by rounding to the nearest integer; however, + * to avoid duplicated code in current callers, the average is at least + * 1 if any page of the folio is mapped. + * + * Returns: The average number of mappings per page in this folio. + */ +static inline int folio_average_page_mapcount(struct folio *folio) +{ +	int mapcount, entire_mapcount, avg; + +	if (!folio_test_large(folio)) +		return atomic_read(&folio->_mapcount) + 1; + +	mapcount = folio_large_mapcount(folio); +	if (unlikely(mapcount <= 0)) +		return 0; +	entire_mapcount = folio_entire_mapcount(folio); +	if (mapcount <= entire_mapcount) +		return entire_mapcount; +	mapcount -= entire_mapcount; + +	/* Round to closest integer ... */ +	avg = ((unsigned int)mapcount + folio_large_nr_pages(folio) / 2) >> folio_large_order(folio); +	/* ... but return at least 1. */ +	return max_t(int, avg + entire_mapcount, 1); +}  /*   * array.c   */ | 
