linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2/2] mm: add 'foreign' alias for the 'pinned' page flag
  2015-01-08 15:28 [PATCHv1 0/2] mm: infrastructure for correctly handling foreign pages on Xen David Vrabel
@ 2015-01-08 15:28 ` David Vrabel
  0 siblings, 0 replies; 8+ messages in thread
From: David Vrabel @ 2015-01-08 15:28 UTC (permalink / raw)
  To: Andrew Morton, linux-kernel
  Cc: David Vrabel, linux-mm, xen-devel, Konrad Rzeszutek Wilk,
	Boris Ostrovsky, Jenny Herbert

From: Jenny Herbert <jennifer.herbert@citrix.com>

The foreign page flag will be used by Xen guests to mark pages that
have grant mappings of frames from other (foreign) guests.

The foreign flag is an alias for the existing (Xen-specific) pinned
flag.  This is safe because pinned is only used on pages used for page
tables and these cannot also be foreign.

Signed-off-by: Jenny Herbert <jennifer.herbert@citrix.com>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
 include/linux/page-flags.h |    2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index e1f5fcd..7734cc8 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -123,6 +123,7 @@ enum pageflags {
 	/* XEN */
 	PG_pinned = PG_owner_priv_1,
 	PG_savepinned = PG_dirty,
+	PG_foreign = PG_owner_priv_1,
 
 	/* SLOB */
 	PG_slob_free = PG_private,
@@ -215,6 +216,7 @@ __PAGEFLAG(Slab, slab)
 PAGEFLAG(Checked, checked)		/* Used by some filesystems */
 PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned)	/* Xen */
 PAGEFLAG(SavePinned, savepinned);			/* Xen */
+PAGEFLAG(Foreign, foreign);				/* Xen */
 PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved)
 PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked)
 	__SETPAGEFLAG(SwapBacked, swapbacked)
-- 
1.7.10.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCHv2 0/2] mm: infrastructure for correctly handling foreign pages on Xen
@ 2015-01-12 15:53 David Vrabel
  2015-01-12 15:53 ` [PATCH 1/2] mm: provide a find_page vma operation David Vrabel
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: David Vrabel @ 2015-01-12 15:53 UTC (permalink / raw)
  To: Andrew Morton, linux-kernel; +Cc: David Vrabel, linux-mm

These two patches are the common parts of a larger Xen series[1]
fixing several long-standing bugs the handling of foreign[2] pages in
Xen guests.

The first patch is required to fix get_user_pages[_fast]() with
userspace space mappings of such foreign pages.  Basically, pte_page()
doesn't work so an alternate mechanism is needed to get the page from
a VMA and address.  By requiring mappings needing this method are
'special' this should not have an impact on the common use cases.

The second patch isn't essential but helps with readability of the
resulting user of the page flag.

For further background reading see:

  http://xenbits.xen.org/people/dvrabel/grant-improvements-C.pdf

Changes in v2:

- Add a find_page VMA op instead of the pages field so: a) the size of
  struct vm_area_struct does not increase; and b) the common code need
  not handling splitting the pages area.

David

[1] http://lists.xen.org/archives/html/xen-devel/2015-01/msg00979.html

[2] Another guest's page temporarily granted to this guest.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/2] mm: provide a find_page vma operation
  2015-01-12 15:53 [PATCHv2 0/2] mm: infrastructure for correctly handling foreign pages on Xen David Vrabel
@ 2015-01-12 15:53 ` David Vrabel
  2015-01-12 22:35   ` Johannes Weiner
  2015-01-12 15:53 ` [PATCH 2/2] mm: add 'foreign' alias for the 'pinned' page flag David Vrabel
  2015-01-12 20:58 ` [PATCHv2 0/2] mm: infrastructure for correctly handling foreign pages on Xen Andrew Morton
  2 siblings, 1 reply; 8+ messages in thread
From: David Vrabel @ 2015-01-12 15:53 UTC (permalink / raw)
  To: Andrew Morton, linux-kernel; +Cc: David Vrabel, linux-mm

The optional find_page VMA operation is used to lookup the pages
backing a VMA.  This is useful in cases where the normal mechanisms
for finding the page don't work.  This is only called if the PTE is
special.

One use case is a Xen PV guest mapping foreign pages into userspace.

In a Xen PV guest, the PTEs contain MFNs so get_user_pages() (for
example) must do an MFN to PFN (M2P) lookup before it can get the
page.  For foreign pages (those owned by another guest) the M2P lookup
returns the PFN as seen by the foreign guest (which would be
completely the wrong page for the local guest).

This cannot be fixed up improving the M2P lookup since one MFN may be
mapped onto two or more pages so getting the right page is impossible
given just the MFN.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
 include/linux/mm.h |    3 +++
 mm/memory.c        |    2 ++
 2 files changed, 5 insertions(+)

diff --git a/include/linux/mm.h b/include/linux/mm.h
index 80fc92a..1306643 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -290,6 +290,9 @@ struct vm_operations_struct {
 	/* called by sys_remap_file_pages() to populate non-linear mapping */
 	int (*remap_pages)(struct vm_area_struct *vma, unsigned long addr,
 			   unsigned long size, pgoff_t pgoff);
+
+	struct page * (*find_page)(struct vm_area_struct *vma,
+				   unsigned long addr);
 };
 
 struct mmu_gather;
diff --git a/mm/memory.c b/mm/memory.c
index c6565f0..f23a862 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -754,6 +754,8 @@ struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
 	if (HAVE_PTE_SPECIAL) {
 		if (likely(!pte_special(pte)))
 			goto check_pfn;
+		if (vma->vm_ops && vma->vm_ops->find_page)
+			return vma->vm_ops->find_page(vma, addr);
 		if (vma->vm_flags & (VM_PFNMAP | VM_MIXEDMAP))
 			return NULL;
 		if (!is_zero_pfn(pfn))
-- 
1.7.10.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/2] mm: add 'foreign' alias for the 'pinned' page flag
  2015-01-12 15:53 [PATCHv2 0/2] mm: infrastructure for correctly handling foreign pages on Xen David Vrabel
  2015-01-12 15:53 ` [PATCH 1/2] mm: provide a find_page vma operation David Vrabel
@ 2015-01-12 15:53 ` David Vrabel
  2015-01-12 20:58 ` [PATCHv2 0/2] mm: infrastructure for correctly handling foreign pages on Xen Andrew Morton
  2 siblings, 0 replies; 8+ messages in thread
From: David Vrabel @ 2015-01-12 15:53 UTC (permalink / raw)
  To: Andrew Morton, linux-kernel; +Cc: David Vrabel, linux-mm, Jenny Herbert

From: Jenny Herbert <jennifer.herbert@citrix.com>

The foreign page flag will be used by Xen guests to mark pages that
have grant mappings of frames from other (foreign) guests.

The foreign flag is an alias for the existing (Xen-specific) pinned
flag.  This is safe because pinned is only used on pages used for page
tables and these cannot also be foreign.

Signed-off-by: Jenny Herbert <jennifer.herbert@citrix.com>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
 include/linux/page-flags.h |    2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index e1f5fcd..7734cc8 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -123,6 +123,7 @@ enum pageflags {
 	/* XEN */
 	PG_pinned = PG_owner_priv_1,
 	PG_savepinned = PG_dirty,
+	PG_foreign = PG_owner_priv_1,
 
 	/* SLOB */
 	PG_slob_free = PG_private,
@@ -215,6 +216,7 @@ __PAGEFLAG(Slab, slab)
 PAGEFLAG(Checked, checked)		/* Used by some filesystems */
 PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned)	/* Xen */
 PAGEFLAG(SavePinned, savepinned);			/* Xen */
+PAGEFLAG(Foreign, foreign);				/* Xen */
 PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved)
 PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked)
 	__SETPAGEFLAG(SwapBacked, swapbacked)
-- 
1.7.10.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCHv2 0/2] mm: infrastructure for correctly handling foreign pages on Xen
  2015-01-12 15:53 [PATCHv2 0/2] mm: infrastructure for correctly handling foreign pages on Xen David Vrabel
  2015-01-12 15:53 ` [PATCH 1/2] mm: provide a find_page vma operation David Vrabel
  2015-01-12 15:53 ` [PATCH 2/2] mm: add 'foreign' alias for the 'pinned' page flag David Vrabel
@ 2015-01-12 20:58 ` Andrew Morton
  2 siblings, 0 replies; 8+ messages in thread
From: Andrew Morton @ 2015-01-12 20:58 UTC (permalink / raw)
  To: David Vrabel; +Cc: linux-kernel, linux-mm

On Mon, 12 Jan 2015 15:53:11 +0000 David Vrabel <david.vrabel@citrix.com> wrote:

> These two patches are the common parts of a larger Xen series[1]
> fixing several long-standing bugs the handling of foreign[2] pages in
> Xen guests.
> 
> The first patch is required to fix get_user_pages[_fast]() with
> userspace space mappings of such foreign pages.  Basically, pte_page()
> doesn't work so an alternate mechanism is needed to get the page from
> a VMA and address.  By requiring mappings needing this method are
> 'special' this should not have an impact on the common use cases.
> 
> The second patch isn't essential but helps with readability of the
> resulting user of the page flag.
> 
> For further background reading see:
> 
>   http://xenbits.xen.org/people/dvrabel/grant-improvements-C.pdf
> 

Looks OK to me.  I can merge them if you like, but it's probably more
convenient for you to include them in the Xen tree.

It would be nice if PG_foreign (and PG_everythingelse) was properly
documented at the definition site.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/2] mm: provide a find_page vma operation
  2015-01-12 15:53 ` [PATCH 1/2] mm: provide a find_page vma operation David Vrabel
@ 2015-01-12 22:35   ` Johannes Weiner
  0 siblings, 0 replies; 8+ messages in thread
From: Johannes Weiner @ 2015-01-12 22:35 UTC (permalink / raw)
  To: David Vrabel; +Cc: Andrew Morton, linux-kernel, linux-mm

On Mon, Jan 12, 2015 at 03:53:12PM +0000, David Vrabel wrote:
> The optional find_page VMA operation is used to lookup the pages
> backing a VMA.  This is useful in cases where the normal mechanisms
> for finding the page don't work.  This is only called if the PTE is
> special.
> 
> One use case is a Xen PV guest mapping foreign pages into userspace.
> 
> In a Xen PV guest, the PTEs contain MFNs so get_user_pages() (for
> example) must do an MFN to PFN (M2P) lookup before it can get the
> page.  For foreign pages (those owned by another guest) the M2P lookup
> returns the PFN as seen by the foreign guest (which would be
> completely the wrong page for the local guest).
> 
> This cannot be fixed up improving the M2P lookup since one MFN may be
> mapped onto two or more pages so getting the right page is impossible
> given just the MFN.
> 
> Signed-off-by: David Vrabel <david.vrabel@citrix.com>

Looks much better to me, thanks.

> ---
>  include/linux/mm.h |    3 +++
>  mm/memory.c        |    2 ++
>  2 files changed, 5 insertions(+)
> 
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index 80fc92a..1306643 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -290,6 +290,9 @@ struct vm_operations_struct {
>  	/* called by sys_remap_file_pages() to populate non-linear mapping */
>  	int (*remap_pages)(struct vm_area_struct *vma, unsigned long addr,
>  			   unsigned long size, pgoff_t pgoff);
> +
> +	struct page * (*find_page)(struct vm_area_struct *vma,
> +				   unsigned long addr);

Could you please add a comment what that method is used for?

It would probably also be useful if the name reflected that this only
applies to special ptes.  find_special_page()?  lookup_special_pte()?
pte_special_page()?

Thanks

> @@ -754,6 +754,8 @@ struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
>  	if (HAVE_PTE_SPECIAL) {
>  		if (likely(!pte_special(pte)))
>  			goto check_pfn;
> +		if (vma->vm_ops && vma->vm_ops->find_page)
> +			return vma->vm_ops->find_page(vma, addr);
>  		if (vma->vm_flags & (VM_PFNMAP | VM_MIXEDMAP))
>  			return NULL;
>  		if (!is_zero_pfn(pfn))

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 2/2] mm: add 'foreign' alias for the 'pinned' page flag
  2015-01-19 15:47 [PATCHv3 " David Vrabel
@ 2015-01-19 15:47 ` David Vrabel
  2015-01-23  0:06   ` Andrew Morton
  0 siblings, 1 reply; 8+ messages in thread
From: David Vrabel @ 2015-01-19 15:47 UTC (permalink / raw)
  To: Andrew Morton, linux-kernel; +Cc: David Vrabel, linux-mm, Jenny Herbert

From: Jenny Herbert <jennifer.herbert@citrix.com>

The foreign page flag will be used by Xen guests to mark pages that
have grant mappings of frames from other (foreign) guests.

The foreign flag is an alias for the existing (Xen-specific) pinned
flag.  This is safe because pinned is only used on pages used for page
tables and these cannot also be foreign.

Signed-off-by: Jenny Herbert <jennifer.herbert@citrix.com>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
 include/linux/page-flags.h |    5 +++++
 1 file changed, 5 insertions(+)

diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index e1f5fcd..5ed7bda 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -121,8 +121,12 @@ enum pageflags {
 	PG_fscache = PG_private_2,	/* page backed by cache */
 
 	/* XEN */
+	/* Pinned in Xen as a read-only pagetable page. */
 	PG_pinned = PG_owner_priv_1,
+	/* Pinned as part of domain save (see xen_mm_pin_all()). */
 	PG_savepinned = PG_dirty,
+	/* Has a grant mapping of another (foreign) domain's page. */
+	PG_foreign = PG_owner_priv_1,
 
 	/* SLOB */
 	PG_slob_free = PG_private,
@@ -215,6 +219,7 @@ __PAGEFLAG(Slab, slab)
 PAGEFLAG(Checked, checked)		/* Used by some filesystems */
 PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned)	/* Xen */
 PAGEFLAG(SavePinned, savepinned);			/* Xen */
+PAGEFLAG(Foreign, foreign);				/* Xen */
 PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved)
 PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked)
 	__SETPAGEFLAG(SwapBacked, swapbacked)
-- 
1.7.10.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] mm: add 'foreign' alias for the 'pinned' page flag
  2015-01-19 15:47 ` [PATCH 2/2] mm: add 'foreign' alias for the 'pinned' page flag David Vrabel
@ 2015-01-23  0:06   ` Andrew Morton
  0 siblings, 0 replies; 8+ messages in thread
From: Andrew Morton @ 2015-01-23  0:06 UTC (permalink / raw)
  To: David Vrabel; +Cc: linux-kernel, linux-mm, Jenny Herbert

On Mon, 19 Jan 2015 15:47:23 +0000 David Vrabel <david.vrabel@citrix.com> wrote:

> From: Jenny Herbert <jennifer.herbert@citrix.com>
> 
> The foreign page flag will be used by Xen guests to mark pages that
> have grant mappings of frames from other (foreign) guests.
> 
> The foreign flag is an alias for the existing (Xen-specific) pinned
> flag.  This is safe because pinned is only used on pages used for page
> tables and these cannot also be foreign.
> 

Acked-by: Andrew Morton <akpm@linux-foundation.org>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-01-23  0:06 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-12 15:53 [PATCHv2 0/2] mm: infrastructure for correctly handling foreign pages on Xen David Vrabel
2015-01-12 15:53 ` [PATCH 1/2] mm: provide a find_page vma operation David Vrabel
2015-01-12 22:35   ` Johannes Weiner
2015-01-12 15:53 ` [PATCH 2/2] mm: add 'foreign' alias for the 'pinned' page flag David Vrabel
2015-01-12 20:58 ` [PATCHv2 0/2] mm: infrastructure for correctly handling foreign pages on Xen Andrew Morton
  -- strict thread matches above, loose matches on Subject: below --
2015-01-19 15:47 [PATCHv3 " David Vrabel
2015-01-19 15:47 ` [PATCH 2/2] mm: add 'foreign' alias for the 'pinned' page flag David Vrabel
2015-01-23  0:06   ` Andrew Morton
2015-01-08 15:28 [PATCHv1 0/2] mm: infrastructure for correctly handling foreign pages on Xen David Vrabel
2015-01-08 15:28 ` [PATCH 2/2] mm: add 'foreign' alias for the 'pinned' page flag David Vrabel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).