
On 8/3/21 5:13 PM, Ján Tomko wrote:
Send TERM/KILL to virtiofsd and its child processes too and do not exit until they are all dead.
https://bugzilla.redhat.com/show_bug.cgi?id=1940276
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_virtiofs.c | 2 +- src/util/virpidfile.c | 7 ++++++- src/util/virprocess.c | 5 ++++- 3 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_virtiofs.c b/src/qemu/qemu_virtiofs.c index edaedf0304..15c05479c8 100644 --- a/src/qemu/qemu_virtiofs.c +++ b/src/qemu/qemu_virtiofs.c @@ -281,7 +281,7 @@ qemuVirtioFSStop(virQEMUDriver *driver G_GNUC_UNUSED, if (!(pidfile = qemuVirtioFSCreatePidFilename(vm, fs->info.alias))) goto cleanup;
- if (virPidFileForceCleanupPath(pidfile) < 0) { + if (virPidFileForceCleanupPathFull(pidfile, true) < 0) { VIR_WARN("Unable to kill virtiofsd process"); } else { if (QEMU_DOMAIN_FS_PRIVATE(fs)->vhostuser_fs_sock)
This is the only hunk that should be in this commit. The rest should have been squashed to the previous one.
diff --git a/src/util/virpidfile.c b/src/util/virpidfile.c index b75f441008..7069f8343d 100644 --- a/src/util/virpidfile.c +++ b/src/util/virpidfile.c @@ -529,10 +529,15 @@ virPidFileForceCleanupPathFull(const char *path, bool group) if (fd < 0) { virResetLastError();
+ if (pid > 1 && group) + pid = virProcessGroupGet(pid); + /* Only kill the process if the pid is valid one. 0 means * there is somebody else doing the same pidfile cleanup * machinery. */ - if (pid) + if (group) + virProcessKillPainfullyDelay(pid, true, 0, true); + else if (pid) virProcessKillPainfully(pid, true);
if (virPidFileDeletePath(path) < 0) diff --git a/src/util/virprocess.c b/src/util/virprocess.c index a92aa8aac9..d946ac37f4 100644 --- a/src/util/virprocess.c +++ b/src/util/virprocess.c @@ -449,7 +449,10 @@ virProcessKillPainfullyDelay(pid_t pid, bool force, unsigned int extradelay, boo signum = 0; /* Just check for existence */ }
- rc = virProcessKill(pid, signum); + if (group) + rc = virProcessGroupKill(pid, signum); + else + rc = virProcessKill(pid, signum);
if (rc < 0) { if (errno != ESRCH) {