[libvirt PATCH 5/6] qemu: virtiofs: kill the whole process group
Masayoshi Mizuma
msys.mizuma at gmail.com
Wed Aug 4 22:37:42 UTC 2021
On Tue, Aug 03, 2021 at 05:13:44PM +0200, 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 at redhat.com>
Thank you for your patches! They work well.
Please feel free to add:
Tested-by: Masayoshi Mizuma <m.mizuma at jp.fujitsu.com>
Thanks!
Masa
> ---
> 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)
> 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) {
> --
> 2.31.1
>
More information about the libvir-list
mailing list