On 7/19/24 3:29 PM, Daniel P. Berrangé wrote:
> +static int
> +qemuProcessInShutdownStartMonitor(virDomainObj *vm)
> +{
> + qemuDomainObjPrivate *priv = vm->privateData;
> + qemuProcessInShutdownEventData *data;
> + int pidfd;
> + int ret = -1;
> +
> + VIR_DEBUG("vm=%p name=%s pid=%lld pidMonitored=%d",
> + vm, vm->def->name, (long long)vm->pid,
> + priv->pidMonitored);
> +
> + if (priv->pidMonitored >= 0) {
> + VIR_DEBUG("Monitoring qemu in-shutdown process %i already set up",
vm->pid);
> + goto cleanup;
> + }
> +
> + pidfd = syscall(SYS_pidfd_open, vm->pid, 0);
> + if (pidfd < 0) {
> + if (errno == ESRCH) /* process has already terminated */
> + ret = 1;
> + goto cleanup;
> + }
> +
> + data = qemuProcessInShutdownEventDataNew(vm, pidfd);
> + if ((priv->pidMonitored = virEventAddHandle(pidfd,
> + VIR_EVENT_HANDLE_READABLE,
> + qemuProcessInShutdownPidfdCb,
> + data,
> +
(virFreeCallback)qemuProcessInShutdownEventDataFree)) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("failed to monitor qemu in-shutdown process %1$i"),
> + vm->pid);
> + qemuProcessInShutdownEventDataFree(data);
> + goto cleanup;
> + }
> + VIR_DEBUG("Monitoring qemu in-shutdown process %i for termination",
vm->pid);
> + ret = 0;
> +
> + cleanup:
> + return ret;
> +}
This will need some #ifdef-ery because I believe SYS_pidfd_open won't
exist on all Linux versions we need, and certainly won't exist on
non-Linux, and nor will syscall() fro that matter.
Ups, I forgot about that. Sending a v3 out.
--
Mit freundlichen Grüßen/Kind regards
Boris Fiuczynski
IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Wolfgang Wendt
Geschäftsführung: David Faller
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294