Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-15-SP1:GA
xen.16553
5a33a12f-domctl-improve-locking-during-domain-d...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 5a33a12f-domctl-improve-locking-during-domain-destruction.patch of Package xen.16553
References: bsc#1035442 # Commit 228ab9992ffb1d8f9d2475f2581e68b2913acb88 # Date 2017-12-15 11:17:19 +0100 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> domctl: improve locking during domain destruction There is no need to hold the global domctl lock across domain_kill() - the domain lock is fully sufficient here, and parallel cleanup after multiple domains performs quite a bit better this way. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> Index: xen-4.10.1-testing/xen/common/domain.c =================================================================== --- xen-4.10.1-testing.orig/xen/common/domain.c +++ xen-4.10.1-testing/xen/common/domain.c @@ -619,13 +619,21 @@ int domain_kill(struct domain *d) if ( d == current->domain ) return -EINVAL; - /* Protected by domctl_lock. */ + /* Protected by d->domain_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); evtchn_destroy(d); gnttab_release_mappings(d); tmem_destroy(d->tmem_client); Index: xen-4.10.1-testing/xen/common/domctl.c =================================================================== --- xen-4.10.1-testing.orig/xen/common/domctl.c +++ xen-4.10.1-testing/xen/common/domctl.c @@ -665,11 +665,14 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xe 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); - break; + goto domctl_out_unlock_domonly; case XEN_DOMCTL_setnodeaffinity: {
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