Eric Blake <eblake@xxxxxxxxxx> writes: > Libvirt would like to be able to distinguish between a SHUTDOWN > event triggered solely by guest request and one triggered by a > SIGTERM or other action on the host. While qemu_kill_report() is > already able to tell whether a shutdown was triggered by a host > signal (but NOT by a host UI event, such as clicking the X on > the window), that information was then lost after being printed > to stderr. The previous patch prepped things to use an enum > internally; now it's time to wire it up through all callers, and > to extend the SHUTDOWN and RESET events to report the details. > > Enhance the shutdown request path to take a parameter of which > way it is being triggered, and update ALL callers. It would have > been less churn to keep the common case with no arguments as > meaning guest-triggered, and only modified the host-triggered > code paths, via a wrapper function, but then we'd still have to > audit that I didn't miss any host-triggered spots; changing the > signature forces us to double-check that I correctly categorized > all callers. > > Since command line options can change whether a guest reset request > causes an actual reset vs. a shutdown, it's easy to also add the > information to the RESET event, even though libvirt has not yet > expressed a need to know that. > > For the moment, we keep the enum ShutdownCause for internal use > only, and merely expose a single boolean of 'guest':true|false > to the QMP client; this is because we don't yet have evidence that > the further distinctions will be useful, or whether the addition > of new enum members would cause problems to clients coded to an > older version of the enum. > > Update expected iotest outputs to match the new data. > > Here is output from 'virsh qemu-monitor-event --loop' with the > patch installed: > > event SHUTDOWN at 1492639680.731251 for domain fedora_13: {"guest":true} > event STOP at 1492639680.732116 for domain fedora_13: <null> > event SHUTDOWN at 1492639680.732830 for domain fedora_13: {"guest":false} > > Note that libvirt runs qemu with -no-quit: the first SHUTDOWN event > was triggered by an action I took directly in the guest (shutdown -h), > at which point qemu stops the vcpus and waits for libvirt to do any > final cleanups; the second SHUTDOWN event is the result of libvirt > sending SIGTERM now that it has completed cleanup. > > The replay driver needs a followup patch if we want to be able to > faithfully replay the difference between a host- and guest-initiated > shutdown (for now, the replayed event is always attributed to host). I'd prefer to get this right from the start, but that requires input from replay guys. Scandalously, replay/ is not covered by MAINTAINERS. scripts/get_maintainers.pl blames it on Pavel Dovgalyuk (cc'ed), and git shows recent activity. Pavel, please post a suitable patch to MAINTAINERS, and please help us figure out what to do about replaying reset here. > See also https://bugzilla.redhat.com/1384007 > > Signed-off-by: Eric Blake <eblake@xxxxxxxxxx>