Revert "domctl: improve locking during domain destruction"

This reverts commit 228ab9992f.

Performance analysis has shown that dropping the domctl lock during
domain destruction greatly increases the contention in the heap_lock,
thus making parallel destruction of domains slower.

The following lockperf data shows the difference between the current
code and the reverted one:

lock:  3342357(2.268295505s), block:  3263853(18.556650797s)
lock:  2788704(0.362311723s), block:   222681( 0.091152276s)

Those figures are from Dmitry Isaikin, and are gathered after
destroying 5 2GB HVM guests in parallel:

https://lists.xenproject.org/archives/html/xen-devel/2021-09/msg01515.html

Given the current point in the release, revert the commit and
reinstate holding the domctl lock during domain destruction. Further
work should be done in order to re-add more fine grained locking to
the domain destruction path once a proper solution to avoid the
heap_lock contention is found.

Reported-by: Hongyan Xia <hongyxia@amazon.com>
Reported-by: Dmitry Isaikin <isaikin-dmitry@yandex.ru>
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Julien Grall <jgrall@amazon.com>
This commit is contained in:
Roger Pau Monné authored and Jan Beulich committed 2021-12-03 11:19:16 +01:00
1 parent 2f531c122e
commit d0887cc6b1
2 files changed
+3 -14

No files matched your search

+2 -10
View File
@@ -917,21 +917,13 @@ int domain_kill(struct domain *d)
if ( d == current->domain )
return -EINVAL;
/* Protected by d->domain_lock. */
/* Protected by domctl_lock. */
switch ( d->is_dying )
{
case DOMDYING_alive:
domain_unlock(d);
domain_pause(d);
domain_lock(d);
/*
* With the domain lock dropped, d->is_dying may have changed. Call
* ourselves recursively if so, which is safe as then we won't come
* back here.
*/
if ( d->is_dying != DOMDYING_alive )
return domain_kill(d);
d->is_dying = DOMDYING_dying;
spin_barrier(&d->domain_lock);
argo_destroy(d);
vnuma_destroy(d->vnuma);
domain_set_outstanding_pages(d, 0);
+1 -4
View File
@@ -497,14 +497,11 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
break;
case XEN_DOMCTL_destroydomain:
domctl_lock_release();
domain_lock(d);
ret = domain_kill(d);
domain_unlock(d);
if ( ret == -ERESTART )
ret = hypercall_create_continuation(
__HYPERVISOR_domctl, "h", u_domctl);
goto domctl_out_unlock_domonly;
break;
case XEN_DOMCTL_setnodeaffinity:
{
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.