Re: [PATCH RFC 03/14] xen/grant-table: stop setting PG_private on pages for grant mapping

Usama Arif <[email protected]>
Newsgroups org.kvack.linux-mm,org.kernel.vger.linux-kernel,org.xenproject.lists.xen-devel
Message-ID <[email protected]>
On Fri, 31 Jul 2026 22:13:26 -0400 Zi Yan <[email protected]> wrote:

> gnttab_alloc_pages() stores xen_page_foreign in allocated page->private.

in allocated page->private "for 32-bit only".

> On 32-bit, a pointer to xen_page_foreign is stored; on 64-bit,
> xen_page_foreign is stored inline. Checking page->private != NULL is enough
> to tell whether a xen_page_foreign needs to be freed on 32-bit and
> page->private is zeroed unconditionally on 64-bit.
> 
> It prepares for a future commit that remove PG_private.
> 
> No funtional change intended.
> 
> Assisted-by: Claude:claude-opus-4-8
> Assisted-by: Codex:gpt-5
> Signed-off-by: Zi Yan <[email protected]>
> To: Juergen Gross <[email protected]>
> To: Stefano Stabellini <[email protected]>
> Cc: Oleksandr Tyshchenko <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> ---
>  drivers/xen/balloon.c     | 5 +++++
>  drivers/xen/grant-table.c | 7 +++----
>  2 files changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
> index e7f1d4ca6d753..7f47b0ad05607 100644
> --- a/drivers/xen/balloon.c
> +++ b/drivers/xen/balloon.c
> @@ -182,6 +182,11 @@ static struct page *balloon_retrieve(bool require_lowmem)
>  
>  	__ClearPageOffline(page);
>  	dec_node_page_state(page, NR_BALLOON_PAGES);
> +	/*
> +	 * clear page->private before giving it out, since it might be used to
> +	 * store xen_page_foreign info.
> +	 */
> +	set_page_private(page, 0);
>  
>  	return page;
>  }
> diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
> index 35f879dc5dfb8..cc348ba2e0786 100644
> --- a/drivers/xen/grant-table.c
> +++ b/drivers/xen/grant-table.c
> @@ -875,7 +875,7 @@ int gnttab_pages_set_private(int nr_pages, struct page **pages)
>  
>  		set_page_private(pages[i], (unsigned long)foreign);
>  #endif
> -		SetPagePrivate(pages[i]);
> +		/* Data is stored in page->private on 64-bit */

On 64-bit arch you just iterate an empty for loop. Cleaner to put the
whole for loop in ifdef?

>  	}
>  
>  	return 0;
> @@ -1031,12 +1031,11 @@ void gnttab_pages_clear_private(int nr_pages, struct page **pages)
>  	int i;
>  
>  	for (i = 0; i < nr_pages; i++) {
> -		if (PagePrivate(pages[i])) {
>  #if BITS_PER_LONG < 64
> +		if (page_private(pages[i]))
>  			kfree((void *)page_private(pages[i]));
>  #endif
> -			ClearPagePrivate(pages[i]);
> -		}
> +		set_page_private(pages[i], 0);
>  	}
>  }
>  EXPORT_SYMBOL_GPL(gnttab_pages_clear_private);
> 
> -- 
> 2.53.0
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.