mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/shadow: drop (replace) bogus assertions
The addition of a call to shadow_blow_tables() from shadow_teardown() has resulted in the "no vcpus" related assertion becoming triggerable: If domain_create() fails with at least one page successfully allocated in the course of shadow_enable(), or if domain_create() succeeds and the domain is then killed without ever invoking XEN_DOMCTL_max_vcpus. Note that in-tree tests (test-resource and test-tsx) do exactly the latter of these two. The assertion's comment was bogus anyway: Shadow mode has been getting enabled before allocation of vCPU-s for quite some time. Convert the assertion to a conditional: As long as there are no vCPU-s, there's nothing to blow away. Fixes:e7aa55c0aa("x86/p2m: free the paging memory pool preemptively") Reported-by: Andrew Cooper <andrew.cooper3@citrix.com> A similar assertion/comment pair exists in _shadow_prealloc(); the comment is similarly bogus, and the assertion could in principle trigger e.g. when shadow_alloc_p2m_page() is called early enough. Replace those at the same time by a similar early return, here indicating failure to the caller (which will generally lead to the domain being crashed in shadow_prealloc()). Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Roger Pau Monné <roger.pau@citrix.com> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com> master commit:a92dc2bb30master date: 2022-10-24 15:46:11 +0200
This commit is contained in:
1 parent
1c354767d5
commit
6222bb8bd7
1 file changed
+6
-4
@@ -942,8 +942,9 @@ static bool __must_check _shadow_prealloc(struct domain *d, unsigned int pages)
|
||||
/* No reclaim when the domain is dying, teardown will take care of it. */
|
||||
return false;
|
||||
|
||||
/* Shouldn't have enabled shadows if we've no vcpus. */
|
||||
ASSERT(d->vcpu && d->vcpu[0]);
|
||||
/* Nothing to reclaim when there are no vcpus yet. */
|
||||
if ( !d->vcpu[0] )
|
||||
return false;
|
||||
|
||||
/* Stage one: walk the list of pinned pages, unpinning them */
|
||||
perfc_incr(shadow_prealloc_1);
|
||||
@@ -1031,8 +1032,9 @@ static void shadow_blow_tables(struct domain *d)
|
||||
mfn_t smfn;
|
||||
int i;
|
||||
|
||||
/* Shouldn't have enabled shadows if we've no vcpus. */
|
||||
ASSERT(d->vcpu && d->vcpu[0]);
|
||||
/* Nothing to do when there are no vcpus yet. */
|
||||
if ( !d->vcpu[0] )
|
||||
return;
|
||||
|
||||
/* Pass one: unpin all pinned pages */
|
||||
foreach_pinned_shadow(d, sp, t)
|
||||
|
||||