xl: Allow shutdown wait for domain death

`xl shutdown -w` waits for the first of either domain shutdown or death.
Shutdown is the halting of the guest operating system, and death is the
freeing of domain resources.

Allow specifying -w multiple times to wait for only domain death.  This
is useful in scripts so that all resources are free before the script
continues.

Signed-off-by: Jason Andryuk <jandryuk@gmail.com>
Reviewed-by: Ian Jackson <ian.jackson@eu.citrix.com>
Release-acked-by: Paul Durrant <paul@xen.org>
This commit is contained in:
Jason Andryuk authored and Ian Jackson committed 2020-06-18 16:58:56 +01:00
1 parent 25636ed707
commit f0dca895a5
2 files changed
+14 -7

No files matched your search

+3 -1
View File
@@ -743,7 +743,9 @@ of a Xen system.
=item B<-w>, B<--wait>
Wait for the domain to complete shutdown before returning.
Wait for the domain to complete shutdown before returning. If given once,
the wait is for domain shutdown or domain death. If given multiple times,
the wait is for domain death only.
=item B<-F>
+11 -6
View File
@@ -162,7 +162,8 @@ static void shutdown_domain(uint32_t domid,
}
}
static void wait_for_domain_deaths(libxl_evgen_domain_death **deathws, int nr)
static void wait_for_domain_deaths(libxl_evgen_domain_death **deathws, int nr,
int wait_for_shutdown_or_death)
{
int rc, count = 0;
LOG("Waiting for %d domains", nr);
@@ -183,8 +184,12 @@ static void wait_for_domain_deaths(libxl_evgen_domain_death **deathws, int nr)
case LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN:
LOG("Domain %d has been shut down, reason code %d",
event->domid, event->u.domain_shutdown.shutdown_reason);
libxl_evdisable_domain_death(ctx, deathws[event->for_user]);
count++;
if (wait_for_shutdown_or_death) {
libxl_evdisable_domain_death(ctx, deathws[event->for_user]);
count++;
} else {
LOG("Domain %d continue waiting for death", event->domid);
}
break;
default:
LOG("Unexpected event type %d", event->type);
@@ -214,7 +219,7 @@ static int main_shutdown_or_reboot(int do_reboot, int argc, char **argv)
all = 1;
break;
case 'w':
wait_for_it = 1;
wait_for_it++;
break;
case 'F':
fallback_trigger = 1;
@@ -246,7 +251,7 @@ static int main_shutdown_or_reboot(int do_reboot, int argc, char **argv)
}
if (deathws) {
wait_for_domain_deaths(deathws, nrdeathws);
wait_for_domain_deaths(deathws, nrdeathws, wait_for_it == 1);
free(deathws);
}
@@ -258,7 +263,7 @@ static int main_shutdown_or_reboot(int do_reboot, int argc, char **argv)
fn(domid, wait_for_it ? &deathw : NULL, 0, fallback_trigger);
if (wait_for_it)
wait_for_domain_deaths(&deathw, 1);
wait_for_domain_deaths(&deathw, 1, wait_for_it == 1);
}
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.