From aef9198f67350910494edb38b64b1c5e71a32e4e Mon Sep 17 00:00:00 2001 Message-Id: From: =?UTF-8?q?J=C3=A1n=20Tomko?= Date: Thu, 5 Aug 2021 13:49:46 +0200 Subject: [PATCH] util: virPidFileForceCleanupPath: add group argument MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a version of virPidFileForceCleanupPath that takes a 'group' bool argument and propagate it all the way down to virProcessKillPainfullyDelay. Signed-off-by: Ján Tomko Reviewed-by: Michal Privoznik (cherry picked from commit ff7b8043b68ff8e03008a9328dccb0b310d8f7a2) Signed-off-by: Ján Tomko https://bugzilla.redhat.com/show_bug.cgi?id=1940276 Message-Id: Reviewed-by: Michal Privoznik --- src/libvirt_private.syms | 1 + src/qemu/qemu_process.c | 3 ++- src/util/virpidfile.c | 15 +++++++++++++-- src/util/virpidfile.h | 2 ++ src/util/virprocess.c | 17 ++++++++++++----- src/util/virprocess.h | 3 ++- 6 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 8b892cf255..c80e690da4 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3037,6 +3037,7 @@ virPidFileConstructPath; virPidFileDelete; virPidFileDeletePath; virPidFileForceCleanupPath; +virPidFileForceCleanupPathFull; virPidFileRead; virPidFileReadIfAlive; virPidFileReadPath; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 521fda57da..6ef8ebd83e 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7700,7 +7700,8 @@ qemuProcessKill(virDomainObj *vm, unsigned int flags) * to be safe against stalls by the kernel freeing up the resources */ return virProcessKillPainfullyDelay(vm->pid, !!(flags & VIR_QEMU_PROCESS_KILL_FORCE), - vm->def->nhostdevs * 2); + vm->def->nhostdevs * 2, + false); } diff --git a/src/util/virpidfile.c b/src/util/virpidfile.c index c6389c1869..7069f8343d 100644 --- a/src/util/virpidfile.c +++ b/src/util/virpidfile.c @@ -514,7 +514,7 @@ virPidFileConstructPath(bool privileged, * Returns 0 if the pidfile was successfully cleaned up, -1 otherwise. */ int -virPidFileForceCleanupPath(const char *path) +virPidFileForceCleanupPathFull(const char *path, bool group) { pid_t pid = 0; int fd = -1; @@ -529,10 +529,15 @@ virPidFileForceCleanupPath(const char *path) 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) @@ -544,3 +549,9 @@ virPidFileForceCleanupPath(const char *path) return 0; } + +int +virPidFileForceCleanupPath(const char *path) +{ + return virPidFileForceCleanupPathFull(path, false); +} diff --git a/src/util/virpidfile.h b/src/util/virpidfile.h index 370a59892e..fd8013c41e 100644 --- a/src/util/virpidfile.h +++ b/src/util/virpidfile.h @@ -73,4 +73,6 @@ int virPidFileConstructPath(bool privileged, const char *progname, char **pidfile); +int virPidFileForceCleanupPathFull(const char *path, + bool group) ATTRIBUTE_NONNULL(1); int virPidFileForceCleanupPath(const char *path) ATTRIBUTE_NONNULL(1); diff --git a/src/util/virprocess.c b/src/util/virprocess.c index 1bc840120a..0b57522936 100644 --- a/src/util/virprocess.c +++ b/src/util/virprocess.c @@ -406,15 +406,15 @@ pid_t virProcessGroupGet(pid_t pid) * wait longer than the default. */ int -virProcessKillPainfullyDelay(pid_t pid, bool force, unsigned int extradelay) +virProcessKillPainfullyDelay(pid_t pid, bool force, unsigned int extradelay, bool group) { size_t i; /* This is in 1/5th seconds since polling is on a 0.2s interval */ unsigned int polldelay = (force ? 200 : 75) + (extradelay*5); const char *signame = "TERM"; - VIR_DEBUG("vpid=%lld force=%d extradelay=%u", - (long long)pid, force, extradelay); + VIR_DEBUG("vpid=%lld force=%d extradelay=%u group=%d", + (long long)pid, force, extradelay, group); /* This loop sends SIGTERM, then waits a few iterations (10 seconds) * to see if it dies. If the process still hasn't exited, and @@ -429,6 +429,8 @@ virProcessKillPainfullyDelay(pid_t pid, bool force, unsigned int extradelay) */ for (i = 0; i < polldelay; i++) { int signum; + int rc; + if (i == 0) { signum = SIGTERM; /* kindly suggest it should exit */ } else if (i == 50 && force) { @@ -447,7 +449,12 @@ virProcessKillPainfullyDelay(pid_t pid, bool force, unsigned int extradelay) signum = 0; /* Just check for existence */ } - if (virProcessKill(pid, signum) < 0) { + if (group) + rc = virProcessGroupKill(pid, signum); + else + rc = virProcessKill(pid, signum); + + if (rc < 0) { if (errno != ESRCH) { virReportSystemError(errno, _("Failed to terminate process %lld with SIG%s"), @@ -470,7 +477,7 @@ virProcessKillPainfullyDelay(pid_t pid, bool force, unsigned int extradelay) int virProcessKillPainfully(pid_t pid, bool force) { - return virProcessKillPainfullyDelay(pid, force, 0); + return virProcessKillPainfullyDelay(pid, force, 0, false); } #if WITH_SCHED_GETAFFINITY diff --git a/src/util/virprocess.h b/src/util/virprocess.h index 9d7c0f479a..9910331a0c 100644 --- a/src/util/virprocess.h +++ b/src/util/virprocess.h @@ -58,7 +58,8 @@ pid_t virProcessGroupGet(pid_t pid); int virProcessKillPainfully(pid_t pid, bool force); int virProcessKillPainfullyDelay(pid_t pid, bool force, - unsigned int extradelay); + unsigned int extradelay, + bool group); int virProcessSetAffinity(pid_t pid, virBitmap *map, bool quiet); -- 2.32.0