From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 097C2C433EF for ; Tue, 14 Dec 2021 05:07:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229823AbhLNFHY (ORCPT ); Tue, 14 Dec 2021 00:07:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45460 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229757AbhLNFHX (ORCPT ); Tue, 14 Dec 2021 00:07:23 -0500 Received: from mail-pj1-x1049.google.com (mail-pj1-x1049.google.com [IPv6:2607:f8b0:4864:20::1049]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 15AADC061574 for ; Mon, 13 Dec 2021 21:07:23 -0800 (PST) Received: by mail-pj1-x1049.google.com with SMTP id g14-20020a17090a578e00b001a79264411cso9829836pji.3 for ; Mon, 13 Dec 2021 21:07:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:message-id:mime-version:subject:from:to:cc; bh=aMtF/xTKjH/hDNL2f6HsS53Q5whzzCvMecLOYsTP6Zk=; b=cPYmX14JCXSXYqmHaDC39xhOgIcPcpQY5jZ6afSXI0DDclhgnZ67Tl1rOYdHNTFGNp RKfaSoDLdxvNm9JJyd9so/QtOqyiDch7IbGdeXBZUvbB/GT5TORsLHvZK9xgyfzk0d+G Bal9Gx3rjEp4D7qrMXfiXBHj5KfZitgBYiri3WuS5Pvb9VW3e6JHn4X+X8MQxXHifN+5 2Ylk0ou2U3QW7mJ6xLp6lADbp+gLHvsXO6Fqfv2mhAFTQ64sBHu4XfPSTTKJikpMcRK9 F2B0OvZnc2YBIu/CAfKLPP9eWHhQZqhix/eDJvSEzOA6bbx9QGDveXIFW3DLp9PKzRAV WfpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=aMtF/xTKjH/hDNL2f6HsS53Q5whzzCvMecLOYsTP6Zk=; b=79Aqg69egyiY2ff3vH4yrHdxy7J7WdEiM9MSvs3l7wMq0w4cpe1cFe/Dgn1BEeeYIj IJeK3Mu99Qm6ohY8BQvm8DH2bBeTya76kHqb/9GdI0W//sLyq90B6GU/3F9u9M7CFcwb LFHOt6DfNhiten9OnUeFU9ILsTRCngqIGBJ1pBd9k/QOJYo6Wvwruar6v3i0QdYCrZzi 1C8p7rcBFx3pfAH/h6LipcwvJhYSnetUdbwceSP/8G7txc+0SXUmbMgYhWo6BuAJ1RUT tfVUqDK0k5dGopKxM6m9ZimQ3EHIUNZKnpFu/30hJz3L7rzLzgBrmIi5KDOo64vBl/zn 4wDg== X-Gm-Message-State: AOAM530W+4eFqQYa8dFEPcsDwn5Hn300+AzazRLHAfeRSWPRp/fxF0OI q0jRQKzZLALgTYdJotcMxGmDsw0UFJdG X-Google-Smtp-Source: ABdhPJz9eu52CKWxSKlp3gTNE0TTa5wWXsMsMgjt95pV/PWcPjzAAY+i/y9WmfloZO/Ew4JHYwaV0KXNbzXg X-Received: from vipinsh.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:36b0]) (user=vipinsh job=sendgmr) by 2002:a17:902:b097:b0:141:ec7d:a055 with SMTP id p23-20020a170902b09700b00141ec7da055mr2955600plr.3.1639458442549; Mon, 13 Dec 2021 21:07:22 -0800 (PST) Date: Tue, 14 Dec 2021 05:07:08 +0000 Message-Id: <20211214050708.4040200-1-vipinsh@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.34.1.173.g76aa8bc2d0-goog Subject: [PATCH] KVM: Move VM's worker kthreads back to the original cgroups before exiting. From: Vipin Sharma To: pbonzini@redhat.com, seanjc@google.com Cc: dmatlack@google.com, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Vipin Sharma Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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)); return err; } base-commit: d8f6ef45a623d650f9b97e11553adb4978f6aa70 -- 2.34.1.173.g76aa8bc2d0-goog