From: Paul Lai <paul.c.lai@intel.com>
To: xen-devel@lists.xensource.com
Cc: ravi.sahita@intel.com, george.dunlap@citrix.com, jbeulich@suse.com
Subject: [PATCH Altp2m cleanup v4 3/4] Move altp2m specific functions to altp2m files.
Date: Wed, 7 Sep 2016 15:04:25 -0700 [thread overview]
Message-ID: <1473285866-6868-4-git-send-email-paul.c.lai@intel.com> (raw)
In-Reply-To: <1473285866-6868-1-git-send-email-paul.c.lai@intel.com>
Move altp2m specific functions to altp2m files. This makes the code
a little easier to read.
Also moving ept code to ept specific files as requested in:
https://lists.xenproject.org/archives/html/xen-devel/2015-07/msg04323.html
Signed-off-by: Paul Lai <paul.c.lai@intel.com>
---
xen/arch/x86/mm/altp2m.c | 51 +++++++++++++++++++++++++++++++++++++++
xen/arch/x86/mm/hap/hap.c | 37 +++-------------------------
xen/arch/x86/mm/p2m-ept.c | 39 ++++++++++++++++++++++++++++++
xen/arch/x86/mm/p2m.c | 45 +++-------------------------------
xen/include/asm-x86/altp2m.h | 4 ++-
xen/include/asm-x86/hvm/vmx/vmx.h | 3 +++
xen/include/asm-x86/p2m.h | 9 +++----
7 files changed, 105 insertions(+), 83 deletions(-)
diff --git a/xen/arch/x86/mm/altp2m.c b/xen/arch/x86/mm/altp2m.c
index 930bdc2..bf3f46e 100644
--- a/xen/arch/x86/mm/altp2m.c
+++ b/xen/arch/x86/mm/altp2m.c
@@ -17,6 +17,7 @@
#include <asm/hvm/support.h>
#include <asm/hvm/hvm.h>
+#include <asm/domain.h>
#include <asm/p2m.h>
#include <asm/altp2m.h>
@@ -65,6 +66,56 @@ altp2m_vcpu_destroy(struct vcpu *v)
vcpu_unpause(v);
}
+int
+altp2m_domain_init(struct domain *d)
+{
+ int rc;
+ unsigned int i;
+
+ if ( !hvm_altp2m_supported() )
+ {
+ rc = 0;
+ goto out;
+ }
+ /* Init alternate p2m data. */
+ if ( (d->arch.altp2m_eptp = alloc_xenheap_page()) == NULL )
+ {
+ rc = -ENOMEM;
+ goto out;
+ }
+
+ for ( i = 0; i < MAX_EPTP; i++ )
+ d->arch.altp2m_eptp[i] = mfn_x(INVALID_MFN);
+
+ for ( i = 0; i < MAX_ALTP2M; i++ )
+ {
+ rc = p2m_alloc_table(d->arch.altp2m_p2m[i]);
+ if ( rc != 0 )
+ goto out;
+ }
+
+ d->arch.altp2m_active = 0;
+ out:
+ return rc;
+}
+
+void
+altp2m_domain_teardown(struct domain *d)
+{
+ unsigned int i;
+
+ if ( !hvm_altp2m_supported() )
+ return;
+
+ d->arch.altp2m_active = 0;
+
+ free_xenheap_page(d->arch.altp2m_eptp);
+ d->arch.altp2m_eptp = NULL;
+
+ for ( i = 0; i < MAX_ALTP2M; i++ )
+ p2m_teardown(d->arch.altp2m_p2m[i]);
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c
index 3218fa2..283ec38 100644
--- a/xen/arch/x86/mm/hap/hap.c
+++ b/xen/arch/x86/mm/hap/hap.c
@@ -37,6 +37,7 @@
#include <asm/hap.h>
#include <asm/paging.h>
#include <asm/p2m.h>
+#include <asm/altp2m.h>
#include <asm/domain.h>
#include <xen/numa.h>
#include <asm/hvm/nestedhvm.h>
@@ -499,27 +500,7 @@ int hap_enable(struct domain *d, u32 mode)
goto out;
}
- if ( hvm_altp2m_supported() )
- {
- /* Init alternate p2m data */
- if ( (d->arch.altp2m_eptp = alloc_xenheap_page()) == NULL )
- {
- rv = -ENOMEM;
- goto out;
- }
-
- for ( i = 0; i < MAX_EPTP; i++ )
- d->arch.altp2m_eptp[i] = mfn_x(INVALID_MFN);
-
- for ( i = 0; i < MAX_ALTP2M; i++ )
- {
- rv = p2m_alloc_table(d->arch.altp2m_p2m[i]);
- if ( rv != 0 )
- goto out;
- }
-
- d->arch.altp2m_active = 0;
- }
+ rv = altp2m_domain_init(d);
/* Now let other users see the new mode */
d->arch.paging.mode = mode | PG_HAP_enable;
@@ -533,19 +514,7 @@ void hap_final_teardown(struct domain *d)
{
unsigned int i;
- if ( hvm_altp2m_supported() )
- {
- d->arch.altp2m_active = 0;
-
- if ( d->arch.altp2m_eptp )
- {
- free_xenheap_page(d->arch.altp2m_eptp);
- d->arch.altp2m_eptp = NULL;
- }
-
- for ( i = 0; i < MAX_ALTP2M; i++ )
- p2m_teardown(d->arch.altp2m_p2m[i]);
- }
+ altp2m_domain_teardown(d);
/* Destroy nestedp2m's first */
for (i = 0; i < MAX_NESTEDP2M; i++) {
diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c
index 13cab24..7ae3168 100644
--- a/xen/arch/x86/mm/p2m-ept.c
+++ b/xen/arch/x86/mm/p2m-ept.c
@@ -1329,6 +1329,45 @@ void setup_ept_dump(void)
register_keyhandler('D', ept_dump_p2m_table, "dump VT-x EPT tables", 0);
}
+void p2m_init_altp2m_ept( struct domain *d, unsigned int i)
+{
+ struct p2m_domain *p2m = d->arch.altp2m_p2m[i];
+ struct ept_data *ept;
+
+ p2m->min_remapped_gfn = gfn_x(INVALID_GFN);
+ p2m->max_remapped_gfn = 0;
+ ept = &p2m->ept;
+ ept->asr = pagetable_get_pfn(p2m_get_pagetable(p2m));
+ d->arch.altp2m_eptp[i] = ept_get_eptp(ept);
+}
+
+unsigned int p2m_find_altp2m_by_eptp(struct domain *d, uint64_t eptp)
+{
+ struct p2m_domain *p2m;
+ struct ept_data *ept;
+ unsigned int i;
+
+ altp2m_list_lock(d);
+
+ for ( i = 0; i < MAX_ALTP2M; i++ )
+ {
+ if ( d->arch.altp2m_eptp[i] == mfn_x(INVALID_MFN) )
+ continue;
+
+ p2m = d->arch.altp2m_p2m[i];
+ ept = &p2m->ept;
+
+ if ( eptp == ept_get_eptp(ept) )
+ goto out;
+ }
+
+ i = INVALID_ALTP2M;
+
+ out:
+ altp2m_list_unlock(d);
+ return i;
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index 7d14c3b..9a97962 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -196,8 +196,8 @@ static void p2m_teardown_altp2m(struct domain *d)
if ( !d->arch.altp2m_p2m[i] )
continue;
p2m = d->arch.altp2m_p2m[i];
- d->arch.altp2m_p2m[i] = NULL;
p2m_free_one(p2m);
+ d->arch.altp2m_p2m[i] = NULL;
}
}
@@ -2261,33 +2261,6 @@ int unmap_mmio_regions(struct domain *d,
return i == nr ? 0 : i ?: ret;
}
-unsigned int p2m_find_altp2m_by_eptp(struct domain *d, uint64_t eptp)
-{
- struct p2m_domain *p2m;
- struct ept_data *ept;
- unsigned int i;
-
- altp2m_list_lock(d);
-
- for ( i = 0; i < MAX_ALTP2M; i++ )
- {
- if ( d->arch.altp2m_eptp[i] == mfn_x(INVALID_MFN) )
- continue;
-
- p2m = d->arch.altp2m_p2m[i];
- ept = &p2m->ept;
-
- if ( eptp == ept_get_eptp(ept) )
- goto out;
- }
-
- i = INVALID_ALTP2M;
-
- out:
- altp2m_list_unlock(d);
- return i;
-}
-
bool_t p2m_switch_vcpu_altp2m_by_id(struct vcpu *v, unsigned int idx)
{
struct domain *d = v->domain;
@@ -2393,18 +2366,6 @@ void p2m_flush_altp2m(struct domain *d)
altp2m_list_unlock(d);
}
-static void p2m_init_altp2m_helper(struct domain *d, unsigned int i)
-{
- struct p2m_domain *p2m = d->arch.altp2m_p2m[i];
- struct ept_data *ept;
-
- p2m->min_remapped_gfn = gfn_x(INVALID_GFN);
- p2m->max_remapped_gfn = 0;
- ept = &p2m->ept;
- ept->asr = pagetable_get_pfn(p2m_get_pagetable(p2m));
- d->arch.altp2m_eptp[i] = ept_get_eptp(ept);
-}
-
int p2m_init_altp2m_by_id(struct domain *d, unsigned int idx)
{
int rc = -EINVAL;
@@ -2416,7 +2377,7 @@ int p2m_init_altp2m_by_id(struct domain *d, unsigned int idx)
if ( d->arch.altp2m_eptp[idx] == mfn_x(INVALID_MFN) )
{
- p2m_init_altp2m_helper(d, idx);
+ p2m_init_altp2m_ept(d, idx);
rc = 0;
}
@@ -2436,7 +2397,7 @@ int p2m_init_next_altp2m(struct domain *d, uint16_t *idx)
if ( d->arch.altp2m_eptp[i] != mfn_x(INVALID_MFN) )
continue;
- p2m_init_altp2m_helper(d, i);
+ p2m_init_altp2m_ept(d, i);
*idx = i;
rc = 0;
diff --git a/xen/include/asm-x86/altp2m.h b/xen/include/asm-x86/altp2m.h
index 64c7618..0090c89 100644
--- a/xen/include/asm-x86/altp2m.h
+++ b/xen/include/asm-x86/altp2m.h
@@ -18,7 +18,6 @@
#ifndef __ASM_X86_ALTP2M_H
#define __ASM_X86_ALTP2M_H
-#include <xen/types.h>
#include <xen/sched.h> /* for struct vcpu, struct domain */
#include <asm/hvm/vcpu.h> /* for vcpu_altp2m */
@@ -38,4 +37,7 @@ static inline uint16_t altp2m_vcpu_idx(const struct vcpu *v)
return vcpu_altp2m(v).p2midx;
}
+int altp2m_domain_init(struct domain *d);
+void altp2m_domain_teardown(struct domain *d);
+
#endif /* __ASM_X86_ALTP2M_H */
diff --git a/xen/include/asm-x86/hvm/vmx/vmx.h b/xen/include/asm-x86/hvm/vmx/vmx.h
index 4cdd9b1..4d247b5 100644
--- a/xen/include/asm-x86/hvm/vmx/vmx.h
+++ b/xen/include/asm-x86/hvm/vmx/vmx.h
@@ -561,6 +561,9 @@ void ept_p2m_uninit(struct p2m_domain *p2m);
void ept_walk_table(struct domain *d, unsigned long gfn);
bool_t ept_handle_misconfig(uint64_t gpa);
void setup_ept_dump(void);
+void p2m_init_altp2m_ept( struct domain *d, unsigned int i);
+/* Locate an alternate p2m by its EPTP */
+unsigned int p2m_find_altp2m_by_eptp(struct domain *d, uint64_t eptp);
void update_guest_eip(void);
diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
index 9fc9ead..c138522 100644
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -23,8 +23,8 @@
* along with this program; If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef _XEN_P2M_H
-#define _XEN_P2M_H
+#ifndef _XEN_ASM_X86_P2M_H
+#define _XEN_ASM_X86_P2M_H
#include <xen/config.h>
#include <xen/paging.h>
@@ -784,9 +784,6 @@ static inline struct p2m_domain *p2m_get_altp2m(struct vcpu *v)
return v->domain->arch.altp2m_p2m[index];
}
-/* Locate an alternate p2m by its EPTP */
-unsigned int p2m_find_altp2m_by_eptp(struct domain *d, uint64_t eptp);
-
/* Switch alternate p2m for a single vcpu */
bool_t p2m_switch_vcpu_altp2m_by_id(struct vcpu *v, unsigned int idx);
@@ -848,7 +845,7 @@ static inline unsigned int p2m_get_iommu_flags(p2m_type_t p2mt)
return flags;
}
-#endif /* _XEN_P2M_H */
+#endif /* _XEN_ASM_X86_P2M_H */
/*
* Local variables:
--
2.7.4
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-09-07 22:04 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-07 22:04 [PATCH Altp2m cleanup v4 0/4] Cleaning up altp2m code Paul Lai
2016-09-07 22:04 ` [PATCH Altp2m cleanup v4 1/4] x86/HVM: adjust feature checking in MSR intercept handling Paul Lai
2016-09-08 10:32 ` Jan Beulich
2016-09-08 15:38 ` Lai, Paul C
2016-09-07 22:04 ` [PATCH Altp2m cleanup v4 2/4] altp2m cleanup work Paul Lai
2016-09-08 14:46 ` Jan Beulich
2016-09-08 15:50 ` Lai, Paul C
2016-09-08 16:06 ` Tamas K Lengyel
2016-09-08 16:45 ` Lai, Paul C
2016-09-12 10:47 ` George Dunlap
2016-09-13 17:38 ` Lai, Paul
2016-09-14 13:39 ` George Dunlap
2016-09-07 22:04 ` Paul Lai [this message]
2016-09-08 15:02 ` [PATCH Altp2m cleanup v4 3/4] Move altp2m specific functions to altp2m files Jan Beulich
2016-09-08 18:04 ` Lai, Paul C
2016-09-07 22:04 ` [PATCH Altp2m cleanup v4 4/4] Making altp2m struct dynamically allocated Paul Lai
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=1473285866-6868-4-git-send-email-paul.c.lai@intel.com \
--to=paul.c.lai@intel.com \
--cc=george.dunlap@citrix.com \
--cc=jbeulich@suse.com \
--cc=ravi.sahita@intel.com \
--cc=xen-devel@lists.xensource.com \
/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 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).