Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Step:FrontRunner
xen.25150
5e5001ee-x86-p2m-PoD-accounting-in-gpae.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 5e5001ee-x86-p2m-PoD-accounting-in-gpae.patch of Package xen.25150
# Commit aea270e3f7c0db696c88a0e94b1ece7abd339c84 # Date 2020-02-21 17:14:38 +0100 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> x86/p2m: fix PoD accounting in guest_physmap_add_entry() The initial observation was that the mfn_valid() check comes too late: Neither mfn_add() nor mfn_to_page() (let alone de-referencing the result of the latter) are valid for MFNs failing this check. Move it up and - noticing that there's no caller doing so - also add an assertion that this should never produce "false" here. In turn this would have meant that the "else" to that if() could now go away, which didn't seem right at all. And indeed, considering callers like memory_exchange() or various grant table functions, the PoD accounting should have been outside of that if() from the very beginning. Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com> --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -864,6 +864,12 @@ guest_physmap_add_entry(struct domain *d if ( p2m_is_foreign(t) ) return -EINVAL; + if ( !mfn_valid(mfn) ) + { + ASSERT_UNREACHABLE(); + return -EINVAL; + } + p2m_lock(p2m); P2M_DEBUG("adding gfn=%#lx mfn=%#lx\n", gfn_x(gfn), mfn_x(mfn)); @@ -963,12 +969,15 @@ guest_physmap_add_entry(struct domain *d } /* Now, actually do the two-way mapping */ - if ( mfn_valid(mfn) ) + rc = p2m_set_entry(p2m, gfn, mfn, page_order, t, p2m->default_access); + if ( rc == 0 ) { - rc = p2m_set_entry(p2m, gfn, mfn, page_order, t, - p2m->default_access); - if ( rc ) - goto out; /* Failed to update p2m, bail without updating m2p. */ +#ifdef CONFIG_HVM + pod_lock(p2m); + p2m->pod.entry_count -= pod_count; + BUG_ON(p2m->pod.entry_count < 0); + pod_unlock(p2m); +#endif if ( !p2m_is_grant(t) ) { @@ -977,24 +986,7 @@ guest_physmap_add_entry(struct domain *d gfn_x(gfn_add(gfn, i))); } } - else - { - gdprintk(XENLOG_WARNING, "Adding bad mfn to p2m map (%#lx -> %#lx)\n", - gfn_x(gfn), mfn_x(mfn)); - rc = p2m_set_entry(p2m, gfn, INVALID_MFN, page_order, - p2m_invalid, p2m->default_access); -#ifdef CONFIG_HVM - if ( rc == 0 ) - { - pod_lock(p2m); - p2m->pod.entry_count -= pod_count; - BUG_ON(p2m->pod.entry_count < 0); - pod_unlock(p2m); - } -#endif - } -out: p2m_unlock(p2m); return rc;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor