From: Sean Christopherson <seanjc@google.com>
To: Vipin Sharma <vipinsh@google.com>
Cc: pbonzini@redhat.com, dmatlack@google.com, kvm@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] KVM: Move VM's worker kthreads back to the original cgroups before exiting.
Date: Tue, 14 Dec 2021 17:16:31 +0000 [thread overview]
Message-ID: <YbjRb0XR7neyX/Gy@google.com> (raw)
In-Reply-To: <20211214050708.4040200-1-vipinsh@google.com>
On Tue, Dec 14, 2021, Vipin Sharma wrote:
> VM worker kthreads can linger in the VM process's cgroup for sometime
> after KVM temrinates the VM process.
>
> KVM terminates the worker kthreads by calling kthread_stop() which waits
> on the signal generated by exit_mm() in do_exit() during kthread's exit.
> However, these kthreads are removed from the cgroup using cgroup_exit()
> call which happens after exit_mm() in do_exit(). A VM process can
> terminate between the time window of exit_mm() to cgroup_exit(), leaving
> only worker kthreads in the cgroup.
>
> Moving worker kthreads back to the original cgroup (kthreadd_task's
> cgroup) makes sure that cgroup is empty as soon as the main VM process
> is terminated.
>
> Signed-off-by: Vipin Sharma <vipinsh@google.com>
> ---
> virt/kvm/kvm_main.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index b0f7e6eb00ff..edd304a18f16 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -5785,7 +5785,7 @@ static int kvm_vm_worker_thread(void *context)
> init_context = NULL;
>
> if (err)
> - return err;
> + goto out;
>
> /* Wait to be woken up by the spawner before proceeding. */
> kthread_parkme();
> @@ -5793,6 +5793,15 @@ static int kvm_vm_worker_thread(void *context)
> if (!kthread_should_stop())
> err = thread_fn(kvm, data);
>
> +out:
> + /*
> + * We need to move the kthread back to its original cgroups, so that it
> + * doesn't linger in the cgroups of the user process after that has
> + * already terminated. exit_mm() in do_exit() signals kthread_stop() to
> + * return, whereas, removal of the task from the cgroups happens in
> + * cgroup_exit() which happens after exit_mm().
> + */
> + WARN_ON(cgroup_attach_task_all(kthreadd_task, current));
As the build bot noted, kthreadd_task isn't exported, and I doubt you'll convince
folks to let you export it.
Why is it problematic for the kthread to linger in the cgroup? Conceptually, it's
not really wrong.
> return err;
> }
>
>
> base-commit: d8f6ef45a623d650f9b97e11553adb4978f6aa70
> --
> 2.34.1.173.g76aa8bc2d0-goog
>
next prev parent reply other threads:[~2021-12-14 17:16 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-14 5:07 [PATCH] KVM: Move VM's worker kthreads back to the original cgroups before exiting Vipin Sharma
2021-12-14 15:46 ` kernel test robot
2021-12-14 15:46 ` kernel test robot
2021-12-14 16:14 ` Lai Jiangshan
2021-12-22 20:14 ` Vipin Sharma
2021-12-14 17:16 ` Sean Christopherson [this message]
2021-12-15 3:58 ` Vipin Sharma
2021-12-14 17:44 ` kernel test robot
2021-12-14 17:44 ` kernel test robot
2021-12-15 18:27 ` Paolo Bonzini
2021-12-22 20:12 ` Vipin Sharma
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YbjRb0XR7neyX/Gy@google.com \
--to=seanjc@google.com \
--cc=dmatlack@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=vipinsh@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.