| From: Sidhartha Kumar <sidhartha.kumar@oracle.com> |
| Subject: mm: add private field of first tail to struct page and struct folio |
| Date: Thu, 22 Sep 2022 10:42:04 -0500 |
| |
| Allow struct folio to store hugetlb metadata that is contained in the |
| private field of the first tail page. On 32-bit, _private_1 aligns with |
| page[1].private. |
| |
| Link: https://lkml.kernel.org/r/20220922154207.1575343-3-sidhartha.kumar@oracle.com |
| Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com> |
| Acked-by: Mike Kravetz <mike.kravetz@oracle.com> |
| Cc: Arnd Bergmann <arnd@arndb.de> |
| Cc: Colin Cross <ccross@google.com> |
| Cc: David Howells <dhowells@redhat.com> |
| Cc: "Eric W . Biederman" <ebiederm@xmission.com> |
| Cc: Hugh Dickins <hughd@google.com> |
| Cc: kernel test robot <lkp@intel.com> |
| Cc: Matthew Wilcox <willy@infradead.org> |
| Cc: Muchun Song <songmuchun@bytedance.com> |
| Cc: Peter Xu <peterx@redhat.com> |
| Cc: Vlastimil Babka <vbabka@suse.cz> |
| Cc: William Kucharski <william.kucharski@oracle.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| include/linux/mm_types.h | 14 ++++++++++++++ |
| 1 file changed, 14 insertions(+) |
| |
| --- a/include/linux/mm_types.h~mm-add-private-field-of-first-tail-to-struct-page-and-struct-folio |
| +++ a/include/linux/mm_types.h |
| @@ -144,6 +144,7 @@ struct page { |
| atomic_t compound_pincount; |
| #ifdef CONFIG_64BIT |
| unsigned int compound_nr; /* 1 << compound_order */ |
| + unsigned long _private_1; |
| #endif |
| }; |
| struct { /* Second tail page of compound page */ |
| @@ -264,6 +265,7 @@ struct page { |
| * @_total_mapcount: Do not use directly, call folio_entire_mapcount(). |
| * @_pincount: Do not use directly, call folio_maybe_dma_pinned(). |
| * @_folio_nr_pages: Do not use directly, call folio_nr_pages(). |
| + * @_private_1: Do not use directly, call folio_get_private_1(). |
| * |
| * A folio is a physically, virtually and logically contiguous set |
| * of bytes. It is a power-of-two in size, and it is aligned to that |
| @@ -311,6 +313,7 @@ struct folio { |
| #ifdef CONFIG_64BIT |
| unsigned int _folio_nr_pages; |
| #endif |
| + unsigned long _private_1; |
| }; |
| |
| #define FOLIO_MATCH(pg, fl) \ |
| @@ -338,6 +341,7 @@ FOLIO_MATCH(compound_mapcount, _total_ma |
| FOLIO_MATCH(compound_pincount, _pincount); |
| #ifdef CONFIG_64BIT |
| FOLIO_MATCH(compound_nr, _folio_nr_pages); |
| +FOLIO_MATCH(_private_1, _private_1); |
| #endif |
| #undef FOLIO_MATCH |
| |
| @@ -383,6 +387,16 @@ static inline void *folio_get_private(st |
| return folio->private; |
| } |
| |
| +static inline void folio_set_private_1(struct folio *folio, unsigned long private) |
| +{ |
| + folio->_private_1 = private; |
| +} |
| + |
| +static inline unsigned long folio_get_private_1(struct folio *folio) |
| +{ |
| + return folio->_private_1; |
| +} |
| + |
| struct page_frag_cache { |
| void * va; |
| #if (PAGE_SIZE < PAGE_FRAG_CACHE_MAX_SIZE) |
| _ |