[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/P2M: derive HVM-only variant from __get_gfn_type_access()
commit aa70b8959915b67b4e7a2516f743ab6ffe0f8a1b Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Fri Apr 8 14:46:30 2022 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Apr 8 14:46:30 2022 +0200 x86/P2M: derive HVM-only variant from __get_gfn_type_access() Introduce an inline wrapper dealing with the non-translated-domain case, while stripping that logic from the main function, which gets renamed to p2m_get_gfn_type_access(). HVM-only callers can then directly use the main function. Along with renaming the main function also make its and the new inline helper's GFN parameters type-safe. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: George Dunlap <george.dunlap@xxxxxxxxxx> --- xen/arch/x86/hvm/svm/svm.c | 4 ++-- xen/arch/x86/include/asm/p2m.h | 26 ++++++++++++++++++++++---- xen/arch/x86/mm/mem_access.c | 5 +++-- xen/arch/x86/mm/mem_sharing.c | 16 ++++++++-------- xen/arch/x86/mm/p2m.c | 35 ++++++++++++----------------------- 5 files changed, 47 insertions(+), 39 deletions(-) diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 64a45045da..2455835eda 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -1712,7 +1712,7 @@ static void svm_do_nested_pgfault(struct vcpu *v, } _d; p2m = p2m_get_p2m(v); - mfn = __get_gfn_type_access(p2m, gfn, &p2mt, &p2ma, 0, NULL, 0); + mfn = p2m_get_gfn_type_access(p2m, _gfn(gfn), &p2mt, &p2ma, 0, NULL, 0); _d.gpa = gpa; _d.qualification = 0; @@ -1737,7 +1737,7 @@ static void svm_do_nested_pgfault(struct vcpu *v, if ( p2m == NULL ) { p2m = p2m_get_p2m(v); - mfn = __get_gfn_type_access(p2m, gfn, &p2mt, &p2ma, 0, NULL, 0); + mfn = p2m_get_gfn_type_access(p2m, _gfn(gfn), &p2mt, &p2ma, 0, NULL, 0); } gdprintk(XENLOG_ERR, "SVM violation gpa %#"PRIpaddr", mfn %#lx, type %i\n", diff --git a/xen/arch/x86/include/asm/p2m.h b/xen/arch/x86/include/asm/p2m.h index 44c953c83a..789d5a4464 100644 --- a/xen/arch/x86/include/asm/p2m.h +++ b/xen/arch/x86/include/asm/p2m.h @@ -459,10 +459,27 @@ void p2m_unlock_and_tlb_flush(struct p2m_domain *p2m); * After calling any of the variants below, caller needs to use * put_gfn. ****/ -mfn_t __nonnull(3, 4) __get_gfn_type_access( - struct p2m_domain *p2m, unsigned long gfn, p2m_type_t *t, +mfn_t __nonnull(3, 4) p2m_get_gfn_type_access( + struct p2m_domain *p2m, gfn_t gfn, p2m_type_t *t, p2m_access_t *a, p2m_query_t q, unsigned int *page_order, bool_t locked); +static inline mfn_t __nonnull(3, 4) _get_gfn_type_access( + struct p2m_domain *p2m, gfn_t gfn, p2m_type_t *t, + p2m_access_t *a, p2m_query_t q, unsigned int *page_order, bool_t locked) +{ + if ( !p2m || !paging_mode_translate(p2m->domain) ) + { + /* + * Not necessarily true, but for non-translated guests we claim + * it's the most generic kind of memory. + */ + *t = p2m_ram_rw; + return _mfn(gfn_x(gfn)); + } + + return p2m_get_gfn_type_access(p2m, gfn, t, a, q, page_order, locked); +} + /* Read a particular P2M table, mapping pages as we go. Most callers * should _not_ call this directly; use the other get_gfn* functions * below unless you know you want to walk a p2m that isn't a domain's @@ -474,7 +491,7 @@ static inline mfn_t __nonnull(3, 4) get_gfn_type_access( struct p2m_domain *p2m, unsigned long gfn, p2m_type_t *t, p2m_access_t *a, p2m_query_t q, unsigned int *page_order) { - return __get_gfn_type_access(p2m, gfn, t, a, q, page_order, true); + return _get_gfn_type_access(p2m, _gfn(gfn), t, a, q, page_order, true); } /* General conversion function from gfn to mfn */ @@ -515,7 +532,8 @@ static inline mfn_t get_gfn_query_unlocked(struct domain *d, p2m_type_t *t) { p2m_access_t a; - return __get_gfn_type_access(p2m_get_hostp2m(d), gfn, t, &a, 0, NULL, 0); + return _get_gfn_type_access(p2m_get_hostp2m(d), _gfn(gfn), t, &a, 0, + NULL, 0); } /* Atomically look up a GFN and take a reference count on the backing page. diff --git a/xen/arch/x86/mm/mem_access.c b/xen/arch/x86/mm/mem_access.c index 7750b81cd4..f3aed9fcc9 100644 --- a/xen/arch/x86/mm/mem_access.c +++ b/xen/arch/x86/mm/mem_access.c @@ -299,8 +299,9 @@ static int set_mem_access(struct domain *d, struct p2m_domain *p2m, { p2m_access_t _a; p2m_type_t t; - mfn_t mfn = __get_gfn_type_access(p2m, gfn_x(gfn), &t, &_a, - P2M_ALLOC, NULL, false); + mfn_t mfn = p2m_get_gfn_type_access(p2m, gfn, &t, &_a, + P2M_ALLOC, NULL, false); + rc = p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, t, a, -1); } diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c index 15e6a7ed81..703b1c06dc 100644 --- a/xen/arch/x86/mm/mem_sharing.c +++ b/xen/arch/x86/mm/mem_sharing.c @@ -478,12 +478,12 @@ do { \ #undef assign_pointers /* Now do the gets. */ - *first_mfn = __get_gfn_type_access(p2m_get_hostp2m(rval->first_domain), - gfn_x(rval->first_gfn), first_t, - first_a, q, NULL, lock); - *second_mfn = __get_gfn_type_access(p2m_get_hostp2m(rval->second_domain), - gfn_x(rval->second_gfn), second_t, - second_a, q, NULL, lock); + *first_mfn = p2m_get_gfn_type_access(p2m_get_hostp2m(rval->first_domain), + rval->first_gfn, first_t, + first_a, q, NULL, lock); + *second_mfn = p2m_get_gfn_type_access(p2m_get_hostp2m(rval->second_domain), + rval->second_gfn, second_t, + second_a, q, NULL, lock); } static void put_two_gfns(const struct two_gfns *arg) @@ -936,8 +936,8 @@ static int nominate_page(struct domain *d, gfn_t gfn, if ( !ap2m ) continue; - amfn = __get_gfn_type_access(ap2m, gfn_x(gfn), &ap2mt, &ap2ma, - 0, NULL, false); + amfn = p2m_get_gfn_type_access(ap2m, gfn, &ap2mt, &ap2ma, + 0, NULL, false); if ( mfn_valid(amfn) && (!mfn_eq(amfn, mfn) || ap2ma != p2ma) ) { altp2m_list_unlock(d); diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index c3653b013d..169f733d83 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -286,25 +286,13 @@ void p2m_unlock_and_tlb_flush(struct p2m_domain *p2m) mm_write_unlock(&p2m->lock); } -mfn_t __get_gfn_type_access(struct p2m_domain *p2m, unsigned long gfn_l, - p2m_type_t *t, p2m_access_t *a, p2m_query_t q, - unsigned int *page_order, bool_t locked) -{ #ifdef CONFIG_HVM - mfn_t mfn; - gfn_t gfn = _gfn(gfn_l); - if ( !p2m || !paging_mode_translate(p2m->domain) ) - { -#endif - /* - * Not necessarily true, but for non-translated guests we claim - * it's the most generic kind of memory. - */ - *t = p2m_ram_rw; - return _mfn(gfn_l); -#ifdef CONFIG_HVM - } +mfn_t p2m_get_gfn_type_access(struct p2m_domain *p2m, gfn_t gfn, + p2m_type_t *t, p2m_access_t *a, p2m_query_t q, + unsigned int *page_order, bool_t locked) +{ + mfn_t mfn; /* Unshare makes no sense without populate. */ if ( q & P2M_UNSHARE ) @@ -329,8 +317,8 @@ mfn_t __get_gfn_type_access(struct p2m_domain *p2m, unsigned long gfn_l, * Try to unshare. If we fail, communicate ENOMEM without * sleeping. */ - if ( mem_sharing_unshare_page(p2m->domain, gfn_l) < 0 ) - mem_sharing_notify_enomem(p2m->domain, gfn_l, false); + if ( mem_sharing_unshare_page(p2m->domain, gfn_x(gfn)) < 0 ) + mem_sharing_notify_enomem(p2m->domain, gfn_x(gfn), false); mfn = p2m->get_entry(p2m, gfn, t, a, q, page_order, NULL); } @@ -343,9 +331,10 @@ mfn_t __get_gfn_type_access(struct p2m_domain *p2m, unsigned long gfn_l, } return mfn; -#endif } +#endif /* CONFIG_HVM */ + void __put_gfn(struct p2m_domain *p2m, unsigned long gfn) { if ( !p2m || !paging_mode_translate(p2m->domain) ) @@ -377,7 +366,7 @@ struct page_info *p2m_get_page_from_gfn( { /* Fast path: look up and get out */ p2m_read_lock(p2m); - mfn = __get_gfn_type_access(p2m, gfn_x(gfn), t, a, 0, NULL, 0); + mfn = p2m_get_gfn_type_access(p2m, gfn, t, a, 0, NULL, 0); if ( p2m_is_any_ram(*t) && mfn_valid(mfn) && !((q & P2M_UNSHARE) && p2m_is_shared(*t)) ) { @@ -1775,8 +1764,8 @@ int altp2m_get_effective_entry(struct p2m_domain *ap2m, gfn_t gfn, mfn_t *mfn, unsigned int page_order; int rc; - *mfn = __get_gfn_type_access(hp2m, gfn_x(gfn), t, a, - P2M_ALLOC | P2M_UNSHARE, &page_order, 0); + *mfn = p2m_get_gfn_type_access(hp2m, gfn, t, a, P2M_ALLOC | P2M_UNSHARE, + &page_order, 0); rc = -ESRCH; if ( !mfn_valid(*mfn) || *t != p2m_ram_rw ) -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |