Message ID | 20230821160849.531668-3-david@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm/swap: stop using page->private on tail pages for THP_SWAP + cleanups | expand |
Reviewed-by: Chris Li <chrisl@kernel.org> Chris On Mon, Aug 21, 2023 at 9:09 AM David Hildenbrand <david@redhat.com> wrote: > > From: Matthew Wilcox <willy@infradead.org> > > Let's stop working on the private field and use an explicit swap field. > We have to move the swp_entry_t typedef. > > Signed-off-by: Matthew Wilcox <willy@infradead.org> > Signed-off-by: David Hildenbrand <david@redhat.com> > --- > include/linux/mm_types.h | 23 +++++++++++++---------- > include/linux/swap.h | 5 ++--- > 2 files changed, 15 insertions(+), 13 deletions(-) > > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h > index 61361f1750c3..438a07854f8c 100644 > --- a/include/linux/mm_types.h > +++ b/include/linux/mm_types.h > @@ -259,6 +259,14 @@ static inline struct page *encoded_page_ptr(struct encoded_page *page) > */ > #define TAIL_MAPPING_REUSED_MAX (2) > > +/* > + * A swap entry has to fit into a "unsigned long", as the entry is hidden > + * in the "index" field of the swapper address space. > + */ > +typedef struct { > + unsigned long val; > +} swp_entry_t; > + > /** > * struct folio - Represents a contiguous set of bytes. > * @flags: Identical to the page flags. > @@ -269,7 +277,7 @@ static inline struct page *encoded_page_ptr(struct encoded_page *page) > * @index: Offset within the file, in units of pages. For anonymous memory, > * this is the index from the beginning of the mmap. > * @private: Filesystem per-folio data (see folio_attach_private()). > - * Used for swp_entry_t if folio_test_swapcache(). > + * @swap: Used for swp_entry_t if folio_test_swapcache(). > * @_mapcount: Do not access this member directly. Use folio_mapcount() to > * find out how many times this folio is mapped by userspace. > * @_refcount: Do not access this member directly. Use folio_ref_count() > @@ -312,7 +320,10 @@ struct folio { > }; > struct address_space *mapping; > pgoff_t index; > - void *private; > + union { > + void *private; > + swp_entry_t swap; > + }; > atomic_t _mapcount; > atomic_t _refcount; > #ifdef CONFIG_MEMCG > @@ -1220,14 +1231,6 @@ enum tlb_flush_reason { > NR_TLB_FLUSH_REASONS, > }; > > - /* > - * A swap entry has to fit into a "unsigned long", as the entry is hidden > - * in the "index" field of the swapper address space. > - */ > -typedef struct { > - unsigned long val; > -} swp_entry_t; > - > /** > * enum fault_flag - Fault flag definitions. > * @FAULT_FLAG_WRITE: Fault was a write fault. > diff --git a/include/linux/swap.h b/include/linux/swap.h > index 84fe0e94f5cd..82859a1944f5 100644 > --- a/include/linux/swap.h > +++ b/include/linux/swap.h > @@ -335,8 +335,7 @@ struct swap_info_struct { > > static inline swp_entry_t folio_swap_entry(struct folio *folio) > { > - swp_entry_t entry = { .val = page_private(&folio->page) }; > - return entry; > + return folio->swap; > } > > static inline swp_entry_t page_swap_entry(struct page *page) > @@ -350,7 +349,7 @@ static inline swp_entry_t page_swap_entry(struct page *page) > > static inline void folio_set_swap_entry(struct folio *folio, swp_entry_t entry) > { > - folio->private = (void *)entry.val; > + folio->swap = entry; > } > > /* linux/mm/workingset.c */ > -- > 2.41.0 > >
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 61361f1750c3..438a07854f8c 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -259,6 +259,14 @@ static inline struct page *encoded_page_ptr(struct encoded_page *page) */ #define TAIL_MAPPING_REUSED_MAX (2) +/* + * A swap entry has to fit into a "unsigned long", as the entry is hidden + * in the "index" field of the swapper address space. + */ +typedef struct { + unsigned long val; +} swp_entry_t; + /** * struct folio - Represents a contiguous set of bytes. * @flags: Identical to the page flags. @@ -269,7 +277,7 @@ static inline struct page *encoded_page_ptr(struct encoded_page *page) * @index: Offset within the file, in units of pages. For anonymous memory, * this is the index from the beginning of the mmap. * @private: Filesystem per-folio data (see folio_attach_private()). - * Used for swp_entry_t if folio_test_swapcache(). + * @swap: Used for swp_entry_t if folio_test_swapcache(). * @_mapcount: Do not access this member directly. Use folio_mapcount() to * find out how many times this folio is mapped by userspace. * @_refcount: Do not access this member directly. Use folio_ref_count() @@ -312,7 +320,10 @@ struct folio { }; struct address_space *mapping; pgoff_t index; - void *private; + union { + void *private; + swp_entry_t swap; + }; atomic_t _mapcount; atomic_t _refcount; #ifdef CONFIG_MEMCG @@ -1220,14 +1231,6 @@ enum tlb_flush_reason { NR_TLB_FLUSH_REASONS, }; - /* - * A swap entry has to fit into a "unsigned long", as the entry is hidden - * in the "index" field of the swapper address space. - */ -typedef struct { - unsigned long val; -} swp_entry_t; - /** * enum fault_flag - Fault flag definitions. * @FAULT_FLAG_WRITE: Fault was a write fault. diff --git a/include/linux/swap.h b/include/linux/swap.h index 84fe0e94f5cd..82859a1944f5 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -335,8 +335,7 @@ struct swap_info_struct { static inline swp_entry_t folio_swap_entry(struct folio *folio) { - swp_entry_t entry = { .val = page_private(&folio->page) }; - return entry; + return folio->swap; } static inline swp_entry_t page_swap_entry(struct page *page) @@ -350,7 +349,7 @@ static inline swp_entry_t page_swap_entry(struct page *page) static inline void folio_set_swap_entry(struct folio *folio, swp_entry_t entry) { - folio->private = (void *)entry.val; + folio->swap = entry; } /* linux/mm/workingset.c */