All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ed White <edmund.h.white@intel.com>
To: xen-devel@lists.xen.org
Cc: keir@xen.org, ian.campbell@citrix.com, tim@xen.org,
	ian.jackson@eu.citrix.com, Ed White <edmund.h.white@intel.com>,
	jbeulich@suse.com
Subject: [PATCH 04/11] x86/MM: Improve p2m type checks.
Date: Fri,  9 Jan 2015 13:26:34 -0800	[thread overview]
Message-ID: <1420838801-11704-5-git-send-email-edmund.h.white@intel.com> (raw)
In-Reply-To: <1420838801-11704-1-git-send-email-edmund.h.white@intel.com>

The alternate p2m code will introduce a new p2m type. In preparation for using
that new type, introduce the type indicator here and fix all the checks
that assume !nestedp2m == hostp2m to explicitly check for hostp2m.

Signed-off-by: Ed White <edmund.h.white@intel.com>
---
 xen/arch/x86/hvm/hvm.c           | 2 +-
 xen/arch/x86/mm/guest_walk.c     | 2 +-
 xen/arch/x86/mm/hap/guest_walk.c | 4 ++--
 xen/arch/x86/mm/p2m-ept.c        | 4 ++--
 xen/arch/x86/mm/p2m.c            | 9 +++++----
 xen/include/asm-x86/p2m.h        | 7 ++++++-
 6 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 3a7367c..b89e9d2 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -2861,7 +2861,7 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned long gla,
     /* Mem sharing: unshare the page and try again */
     if ( npfec.write_access && (p2mt == p2m_ram_shared) )
     {
-        ASSERT(!p2m_is_nestedp2m(p2m));
+        ASSERT(p2m_is_hostp2m(p2m));
         sharing_enomem = 
             (mem_sharing_unshare_page(p2m->domain, gfn, 0) < 0);
         rc = 1;
diff --git a/xen/arch/x86/mm/guest_walk.c b/xen/arch/x86/mm/guest_walk.c
index 1b26175..d8f5a35 100644
--- a/xen/arch/x86/mm/guest_walk.c
+++ b/xen/arch/x86/mm/guest_walk.c
@@ -99,7 +99,7 @@ void *map_domain_gfn(struct p2m_domain *p2m, gfn_t gfn, mfn_t *mfn,
                                  q);
     if ( p2m_is_paging(*p2mt) )
     {
-        ASSERT(!p2m_is_nestedp2m(p2m));
+        ASSERT(p2m_is_hostp2m(p2m));
         if ( page )
             put_page(page);
         p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
diff --git a/xen/arch/x86/mm/hap/guest_walk.c b/xen/arch/x86/mm/hap/guest_walk.c
index 25d9792..381a196 100644
--- a/xen/arch/x86/mm/hap/guest_walk.c
+++ b/xen/arch/x86/mm/hap/guest_walk.c
@@ -64,7 +64,7 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PAGING_LEVELS)(
                                      &p2mt, NULL, P2M_ALLOC | P2M_UNSHARE);
     if ( p2m_is_paging(p2mt) )
     {
-        ASSERT(!p2m_is_nestedp2m(p2m));
+        ASSERT(p2m_is_hostp2m(p2m));
         pfec[0] = PFEC_page_paged;
         if ( top_page )
             put_page(top_page);
@@ -106,7 +106,7 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PAGING_LEVELS)(
             put_page(page);
         if ( p2m_is_paging(p2mt) )
         {
-            ASSERT(!p2m_is_nestedp2m(p2m));
+            ASSERT(p2m_is_hostp2m(p2m));
             pfec[0] = PFEC_page_paged;
             p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
             return INVALID_GFN;
diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c
index 2b9f07c..255b681 100644
--- a/xen/arch/x86/mm/p2m-ept.c
+++ b/xen/arch/x86/mm/p2m-ept.c
@@ -787,8 +787,8 @@ out:
     if ( needs_sync != sync_off )
         ept_sync_domain(p2m);
 
-    /* For non-nested p2m, may need to change VT-d page table.*/
-    if ( rc == 0 && !p2m_is_nestedp2m(p2m) && need_iommu(d) &&
+    /* For host p2m, may need to change VT-d page table.*/
+    if ( rc == 0 && p2m_is_hostp2m(p2m) && need_iommu(d) &&
          need_modify_vtd_table )
     {
         if ( iommu_hap_pt_share )
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index efa49dd..49b66fb 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -73,6 +73,7 @@ static int p2m_initialise(struct domain *d, struct p2m_domain *p2m)
     p2m->default_access = p2m_access_rwx;
 
     p2m->np2m_base = P2M_BASE_EADDR;
+    p2m->alternate = 0;
 
     if ( hap_enabled(d) && cpu_has_vmx )
         ret = ept_p2m_init(p2m);
@@ -202,7 +203,7 @@ int p2m_init(struct domain *d)
 int p2m_is_logdirty_range(struct p2m_domain *p2m, unsigned long start,
                           unsigned long end)
 {
-    ASSERT(!p2m_is_nestedp2m(p2m));
+    ASSERT(p2m_is_hostp2m(p2m));
     if ( p2m->global_logdirty ||
          rangeset_contains_range(p2m->logdirty_ranges, start, end) )
         return 1;
@@ -263,7 +264,7 @@ mfn_t __get_gfn_type_access(struct p2m_domain *p2m, unsigned long gfn,
 
     if ( (q & P2M_UNSHARE) && p2m_is_shared(*t) )
     {
-        ASSERT(!p2m_is_nestedp2m(p2m));
+        ASSERT(p2m_is_hostp2m(p2m));
         /* Try to unshare. If we fail, communicate ENOMEM without
          * sleeping. */
         if ( mem_sharing_unshare_page(p2m->domain, gfn, 0) < 0 )
@@ -431,7 +432,7 @@ int p2m_alloc_table(struct p2m_domain *p2m)
 
     p2m_lock(p2m);
 
-    if ( !p2m_is_nestedp2m(p2m)
+    if ( p2m_is_hostp2m(p2m)
          && !page_list_empty(&d->page_list) )
     {
         P2M_ERROR("dom %d already has memory allocated\n", d->domain_id);
@@ -1708,7 +1709,7 @@ p2m_flush_table(struct p2m_domain *p2m)
 
     /* "Host" p2m tables can have shared entries &c that need a bit more 
      * care when discarding them */
-    ASSERT(p2m_is_nestedp2m(p2m));
+    ASSERT(!p2m_is_hostp2m(p2m));
     /* Nested p2m's do not do pod, hence the asserts (and no pod lock)*/
     ASSERT(page_list_empty(&p2m->pod.super));
     ASSERT(page_list_empty(&p2m->pod.single));
diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
index 5f7fe71..8193901 100644
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -193,6 +193,9 @@ struct p2m_domain {
      * threaded on in LRU order. */
     struct list_head   np2m_list;
 
+    /* Does this p2m belong to the altp2m code? */
+    bool_t alternate;
+
     /* Host p2m: Log-dirty ranges registered for the domain. */
     struct rangeset   *logdirty_ranges;
 
@@ -290,7 +293,9 @@ struct p2m_domain *p2m_get_nestedp2m(struct vcpu *v, uint64_t np2m_base);
  */
 struct p2m_domain *p2m_get_p2m(struct vcpu *v);
 
-#define p2m_is_nestedp2m(p2m)   ((p2m) != p2m_get_hostp2m((p2m->domain)))
+#define p2m_is_hostp2m(p2m)   ((p2m) == p2m_get_hostp2m((p2m->domain)))
+#define p2m_is_altp2m(p2m)    ((p2m)->alternate)
+#define p2m_is_nestedp2m(p2m) (!p2m_is_altp2m(p2m) && !p2m_ishostp2m(p2m))
 
 #define p2m_get_pagetable(p2m)  ((p2m)->phys_table)
 
-- 
1.9.1

  parent reply	other threads:[~2015-01-09 21:26 UTC|newest]

Thread overview: 135+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-09 21:26 [PATCH 00/11] Alternate p2m: support multiple copies of host p2m Ed White
2015-01-09 21:26 ` [PATCH 01/11] VMX: VMFUNC and #VE definitions and detection Ed White
2015-01-12 13:06   ` Andrew Cooper
2015-01-13 18:50     ` Ed White
2015-01-14 14:38       ` Andrew Cooper
2015-01-09 21:26 ` [PATCH 02/11] VMX: implement suppress #VE Ed White
2015-01-12 16:43   ` Andrew Cooper
2015-01-12 17:45     ` Ed White
2015-01-13 18:36       ` Ed White
2015-01-15 16:25   ` Tim Deegan
2015-01-15 18:46     ` Ed White
2015-01-16 17:22       ` Tim Deegan
2015-03-25 17:30       ` Ed White
2015-03-26 10:15         ` Tim Deegan
2015-01-09 21:26 ` [PATCH 03/11] x86/HVM: Hardware alternate p2m support detection Ed White
2015-01-12 17:08   ` Andrew Cooper
2015-01-12 17:46     ` Ed White
2015-01-15 16:32   ` Tim Deegan
2015-01-09 21:26 ` Ed White [this message]
2015-01-12 17:48   ` [PATCH 04/11] x86/MM: Improve p2m type checks Andrew Cooper
2015-01-13 19:39     ` Ed White
2015-01-15 16:36   ` Tim Deegan
2015-01-09 21:26 ` [PATCH 05/11] x86/altp2m: basic data structures and support routines Ed White
2015-01-13 11:28   ` Andrew Cooper
2015-01-13 19:49     ` Ed White
2015-03-25 20:59       ` Ed White
2015-03-26 10:48         ` Tim Deegan
2015-03-26 18:00           ` Ed White
2015-01-15 16:48   ` Tim Deegan
2015-01-15 16:53     ` Jan Beulich
2015-01-15 18:49       ` Ed White
2015-01-16  7:37         ` Jan Beulich
2015-01-16 17:23         ` Tim Deegan
2015-01-09 21:26 ` [PATCH 06/11] VMX/altp2m: add code to support EPTP switching and #VE Ed White
2015-01-13 11:58   ` Andrew Cooper
2015-01-15 16:56   ` Tim Deegan
2015-01-15 18:55     ` Ed White
2015-01-16 17:50       ` Tim Deegan
2015-01-16 17:57         ` Ed White
2015-01-09 21:26 ` [PATCH 07/11] x86/altp2m: introduce p2m_ram_rw_ve type Ed White
2015-01-15 17:03   ` Tim Deegan
2015-01-15 20:38     ` Ed White
2015-01-16  8:20       ` Jan Beulich
2015-01-16 17:14         ` Ed White
2015-01-19  8:49           ` Jan Beulich
2015-01-19 19:53             ` Ed White
2015-01-16 17:52       ` Tim Deegan
2015-01-16 18:35         ` Ed White
2015-01-17  9:37           ` Tim Deegan
2015-01-09 21:26 ` [PATCH 08/11] x86/altp2m: add remaining support routines Ed White
2015-01-15 17:25   ` Tim Deegan
2015-01-15 20:57     ` Ed White
2015-01-16 18:04       ` Tim Deegan
2015-01-15 17:33   ` Tim Deegan
2015-01-15 21:00     ` Ed White
2015-01-16  8:24       ` Jan Beulich
2015-01-16 17:17         ` Ed White
2015-01-19  8:52           ` Jan Beulich
2015-01-16 18:09       ` Tim Deegan
2015-01-09 21:26 ` [PATCH 09/11] x86/altp2m: define and implement alternate p2m HVMOP types Ed White
2015-01-15 17:09   ` Tim Deegan
2015-01-15 20:43     ` Ed White
2015-01-16 17:57       ` Tim Deegan
2015-01-09 21:26 ` [PATCH 10/11] x86/altp2m: fix log-dirty handling Ed White
2015-01-15 17:20   ` Tim Deegan
2015-01-15 20:49     ` Ed White
2015-01-16 17:59       ` Tim Deegan
2015-01-09 21:26 ` [PATCH 11/11] x86/altp2m: alternate p2m memory events Ed White
2015-01-09 22:06 ` [PATCH 00/11] Alternate p2m: support multiple copies of host p2m Andrew Cooper
2015-01-09 22:21   ` Ed White
2015-01-09 22:41     ` Andrew Cooper
2015-01-09 23:04       ` Ed White
2015-01-12 10:00         ` Jan Beulich
2015-01-12 17:36           ` Ed White
2015-01-13  8:56             ` Jan Beulich
2015-01-13 11:28               ` Ian Jackson
2015-01-13 17:42               ` Ed White
2015-01-12 12:17 ` Ian Jackson
2015-01-12 17:39   ` Ed White
2015-01-12 17:43     ` Ian Jackson
2015-01-12 17:50       ` Ed White
2015-01-12 18:00         ` Ian Jackson
2015-01-12 18:31           ` Ed White
2015-01-13 10:21             ` Tamas K Lengyel
2015-01-13 18:25               ` Ed White
2015-01-13 11:16             ` Ian Jackson
2015-01-12 17:51       ` Andrew Cooper
2015-01-13 19:01 ` Andrew Cooper
2015-01-13 20:02   ` Ed White
2015-01-13 20:45     ` Andrew Cooper
2015-01-13 21:30       ` Ed White
2015-01-14  7:04         ` Jan Beulich
2015-01-14 10:31           ` Tamas K Lengyel
2015-01-14 11:09             ` Jan Beulich
2015-01-14 11:28               ` Tamas K Lengyel
2015-01-14 17:35                 ` Ed White
2015-01-15  8:16                   ` Jan Beulich
2015-01-15 17:28                     ` Ed White
2015-01-15 17:45                       ` Tim Deegan
2015-01-15 18:44                         ` Ed White
2015-03-04 23:06                           ` Tamas K Lengyel
2015-03-04 23:41                             ` Ed White
2015-03-05 10:51                               ` Tamas K Lengyel
2015-03-13 17:38                                 ` Ed White
2015-03-05 10:36                             ` Tim Deegan
2015-03-05 10:58                               ` Tamas K Lengyel
2015-03-05 11:13                                 ` Tim Deegan
2015-01-16  7:35                       ` Jan Beulich
2015-01-16 16:54                         ` Ed White
2015-01-15 10:39                   ` Tamas K Lengyel
2015-01-15 17:31                     ` Ed White
2015-01-16 10:43                       ` Tamas K Lengyel
2015-01-16 17:21                         ` Ed White
2015-03-05 13:45       ` Egger, Christoph
2015-01-14  7:01     ` Jan Beulich
2015-01-15 16:15 ` Tim Deegan
2015-01-15 18:23   ` Ed White
2015-01-16  8:12     ` Jan Beulich
2015-01-16 17:01       ` Ed White
2015-01-16 18:33     ` Tim Deegan
2015-01-16 20:32       ` Ed White
2015-01-17  9:34         ` Tim Deegan
2015-01-16 21:43       ` Ed White
2015-01-17  9:49         ` Tim Deegan
2015-01-19 19:35           ` Ed White
2015-01-17  9:31       ` Tim Deegan
2015-01-17 15:01         ` Andrew Cooper
2015-01-19 12:17           ` Tim Deegan
2015-01-19 21:54             ` Ed White
2015-01-20  8:47               ` Jan Beulich
2015-01-20 18:43                 ` Ed White
2015-01-22 15:42               ` Tim Deegan
2015-01-22 19:15                 ` Ed White
2015-03-25 17:41     ` Ed White
2015-03-26 10:40       ` Tim Deegan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1420838801-11704-5-git-send-email-edmund.h.white@intel.com \
    --to=edmund.h.white@intel.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=keir@xen.org \
    --cc=tim@xen.org \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.