Re: [PATCH v2 1/3] mm: document zone device struct page field usage
From: John Hubbard
Date: Fri Jul 19 2019 - 17:43:23 EST
On 7/19/19 12:29 PM, Ralph Campbell wrote:
> Struct page for ZONE_DEVICE private pages uses the page->mapping and
> and page->index fields while the source anonymous pages are migrated to
> device private memory. This is so rmap_walk() can find the page when
> migrating the ZONE_DEVICE private page back to system memory.
> ZONE_DEVICE pmem backed fsdax pages also use the page->mapping and
> page->index fields when files are mapped into a process address space.
>
> Restructure struct page and add comments to make this more clear.
>
> Signed-off-by: Ralph Campbell <rcampbell@xxxxxxxxxx>
> Reviewed-by: John Hubbard <jhubbard@xxxxxxxxxx>
> Cc: Matthew Wilcox <willy@xxxxxxxxxxxxx>
> Cc: Vlastimil Babka <vbabka@xxxxxxx>
> Cc: Christoph Lameter <cl@xxxxxxxxx>
> Cc: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
> Cc: JÃrÃme Glisse <jglisse@xxxxxxxxxx>
> Cc: "Kirill A . Shutemov" <kirill.shutemov@xxxxxxxxxxxxxxx>
> Cc: Lai Jiangshan <jiangshanlai@xxxxxxxxx>
> Cc: Martin Schwidefsky <schwidefsky@xxxxxxxxxx>
> Cc: Pekka Enberg <penberg@xxxxxxxxxx>
> Cc: Randy Dunlap <rdunlap@xxxxxxxxxxxxx>
> Cc: Andrey Ryabinin <aryabinin@xxxxxxxxxxxxx>
> Cc: Christoph Hellwig <hch@xxxxxx>
> Cc: Jason Gunthorpe <jgg@xxxxxxxxxxxx>
> Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
> Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
> ---
> include/linux/mm_types.h | 42 +++++++++++++++++++++++++++-------------
> 1 file changed, 29 insertions(+), 13 deletions(-)
>
> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> index 3a37a89eb7a7..f6c52e44d40c 100644
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -76,13 +76,35 @@ struct page {
> * avoid collision and false-positive PageTail().
> */
> union {
> - struct { /* Page cache and anonymous pages */
> - /**
> - * @lru: Pageout list, eg. active_list protected by
> - * pgdat->lru_lock. Sometimes used as a generic list
> - * by the page owner.
> - */
> - struct list_head lru;
> + struct { /* Page cache, anonymous, ZONE_DEVICE pages */
> + union {
> + /**
> + * @lru: Pageout list, e.g., active_list
> + * protected by pgdat->lru_lock. Sometimes
> + * used as a generic list by the page owner.
> + */
> + struct list_head lru;
> + /**
> + * ZONE_DEVICE pages are never on the lru
> + * list so they reuse the list space.
> + * ZONE_DEVICE private pages are counted as
> + * being mapped so the @mapping and @index
> + * fields are used while the page is migrated
> + * to device private memory.
> + * ZONE_DEVICE MEMORY_DEVICE_FS_DAX pages also
> + * use the @mapping and @index fields when pmem
> + * backed DAX files are mapped.
> + */
> + struct {
> + /**
> + * @pgmap: Points to the hosting
> + * device page map.
> + */
> + struct dev_pagemap *pgmap;
> + /** @zone_device_data: opaque data. */
This is nice, and I think it's a solid step forward in documentation via
clearer code. I recall a number of email, and even face to face discussions,
in which the statement kept coming up: "remember, the ZONE_DEVICE pages use
mapping and index, too. Actually, that reminds me: page->private is often
in use in that case, too, so ZONE_DEVICE couldn't use that, either. I don't
think we need to explicitly say that, though, with this new layout.
nit: the above comment can be deleted, because it merely echoes the actual
code that directly follows it.
Either way, you can add:
Reviewed-by: John Hubbard <jhubbard@xxxxxxxxxx>
thanks,
--
John Hubbard
NVIDIA
> + void *zone_device_data;
> + };
> + };
> /* See page-flags.h for PAGE_MAPPING_FLAGS */
> struct address_space *mapping;
> pgoff_t index; /* Our offset within mapping. */
> @@ -155,12 +177,6 @@ struct page {
> spinlock_t ptl;
> #endif
> };
> - struct { /* ZONE_DEVICE pages */
> - /** @pgmap: Points to the hosting device page map. */
> - struct dev_pagemap *pgmap;
> - void *zone_device_data;
> - unsigned long _zd_pad_1; /* uses mapping */
> - };
>
> /** @rcu_head: You can use this to free a page by RCU. */
> struct rcu_head rcu_head;
>