[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] xen: grant-table: Simplify get_page_frame

The implementation of get_page_frame is currently different whether the
architecture support sharing memory or paging memory. Both
version are extremely similar so it is possible to consolidate in a
single implementation.

The check for shared/paged memory are gated with the respective ifdef.
Potentially, dummy p2m_is_shared/p2m_is_paging could be implemented for

Signed-off-by: Julien Grall <julien.grall@xxxxxxx>


Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Cc: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Cc: Jan Beulich <jbeulich@xxxxxxxx>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
Cc: Tim Deegan <tim@xxxxxxx>
Cc: Wei Liu <wei.liu2@xxxxxxxxxx>

get_page_from_gfn will be able to get reference on foreign page and as
per my understanding will allow to grant page on foreign memory.

This was not allowed with a simple get_page(...) on the ARM
implementation (no sharing nor paging supprot) but is allowed on the x86
implementation due to get_page_from_gfn.

On x86, foreign pages are currently only allowed for PVH dom0, so I
think it is not a big deal for now.

On Arm, foreign pages can be present on any domain. So this patch would
permit grant on foreing pages.

So I would like to check whether it would be valid to grant a mapping on
foreign pages?

If not, I could add a check if ( p2m_is_foreign(...) ) return
 xen/common/grant_table.c | 15 ++++-----------
 1 file changed, 4 insertions(+), 11 deletions(-)

diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
index c3895e6201..97d3200313 100644
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -259,7 +259,6 @@ static int get_paged_frame(unsigned long gfn, unsigned long 
                            struct domain *rd)
     int rc = GNTST_okay;
-#if defined(P2M_PAGED_TYPES) || defined(P2M_SHARED_TYPES)
     p2m_type_t p2mt;
     *page = get_page_from_gfn(rd, gfn, &p2mt,
@@ -267,26 +266,20 @@ static int get_paged_frame(unsigned long gfn, unsigned 
long *frame,
     if ( !(*page) )
         *frame = mfn_x(INVALID_MFN);
+#if defined(P2M_SHARED_TYPES)
         if ( p2m_is_shared(p2mt) )
             return GNTST_eagain;
+#if defined(P2M_PAGES_TYPES)
         if ( p2m_is_paging(p2mt) )
             p2m_mem_paging_populate(rd, gfn);
             return GNTST_eagain;
         return GNTST_bad_page;
     *frame = page_to_mfn(*page);
-    *frame = mfn_x(gfn_to_mfn(rd, _gfn(gfn)));
-    *page = mfn_valid(_mfn(*frame)) ? mfn_to_page(*frame) : NULL;
-    if ( (!(*page)) || (!get_page(*page, rd)) )
-    {
-        *frame = mfn_x(INVALID_MFN);
-        *page = NULL;
-        rc = GNTST_bad_page;
-    }
     return rc;

Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.