Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp1306786imm; Thu, 4 Oct 2018 11:20:44 -0700 (PDT) X-Google-Smtp-Source: ACcGV63etxSAWZCOByPU0SyaJPIkH8K5I8r8rfilblc7SKLd65Ur7PPrvNeLA/ymEwEPYAZhwbh2 X-Received: by 2002:a62:6948:: with SMTP id e69-v6mr8007525pfc.166.1538677244733; Thu, 04 Oct 2018 11:20:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538677244; cv=none; d=google.com; s=arc-20160816; b=ZUb6aOyrSsL8BBDRb+zejVcEYegKN3EaDhcV9hIb4pj7568p5axnr791JbYO4Huds6 G9Ioyq3XLGpO9GDzA9fdEP9rWgAZKpwWtOTidI488kAzbW5kGqX+NMv0G7t/ePgi9PMD v0Uey86QVLsBH079tqOUHXwClfNPBeaZqBXvOmiIOh4SCaFcN8SIDiMocizPAXBg3KUC trRKy1UPobJ2KIqFeN2WSkuZwf9A03zDZdqLZVSvzwaclp6EqZQkiZeqsrdS5zzRrIru whAYsMAZ5hVLjDCPXwTttYbKQkrNdZ5Wjfl/vzrmY0nC5YWoFmPQyKbQ/2tHM92K9bml IQFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=9pskbhcFdCYR+O0197LXRxHX3xRpKTYxebBKC2f8iQg=; b=Bv1ApT0iCacAfA2fX9W4iYSujhULtraTSGnCPImcutSrxnOc9X9UWb2c5/OeO4xbW9 2BQU69JYOV0Ya13cTm+JJcNjcGXafNCiiQxWeYm/41KaphouYvJ3yDsijqvLmA5GejY+ bWZVBLA4ig47P2QENSqCuo9fXfSsC4EHb59wiFAmDKe0uErTnehMAE/15dM9r/JqaHwO wTiu21PVuOz7zBL7e07ZQqzXoPt+5ifVbkANcydi7MrwXvF0JJf+YzTiCGkv01BM3Fvy mRRQwtbfSUkVAsJFLcaGQ4n1/JwKkr7Z9qkzhvCVQRQOJi4GK7gPRgJ00lhX17VEVbDh H9PA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=V2i6+QJo; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l14-v6si5703926pgi.34.2018.10.04.11.20.28; Thu, 04 Oct 2018 11:20:44 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=V2i6+QJo; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728026AbeJEBOs (ORCPT + 99 others); Thu, 4 Oct 2018 21:14:48 -0400 Received: from mail-yw1-f65.google.com ([209.85.161.65]:42690 "EHLO mail-yw1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727407AbeJEBOs (ORCPT ); Thu, 4 Oct 2018 21:14:48 -0400 Received: by mail-yw1-f65.google.com with SMTP id a197-v6so4157968ywh.9; Thu, 04 Oct 2018 11:20:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=9pskbhcFdCYR+O0197LXRxHX3xRpKTYxebBKC2f8iQg=; b=V2i6+QJobPY/bjEjCTvpU2v+tHjxiaslwIuJeCO4QRbFsQeV9Vf3fv9rSEvRBg7KJx j1b+LXGp+wTyo0TGTsxcQzXezM59pVWA7dkjQy5e+ZWQG/wsg42enBdcLel6xb0WnQJA ChdtIVYpGbCTD4AlsRuUeRlZrxOiLbfzd9ATakDrozkxKsCPPO1PDddjF/PtWKL0529P ql61Uij+ASr76FX9rX5nVFa7s2ScHJ06cdoaKcypphlLYOL2BMIm3kluFsEz94KoPECK 2KMYrnYtZb9L7lm6gbabKQRDcuCBNP/uxyHkvDlgCfitIWohJTfYTs/KYcHuebALYkv3 SMlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :references:mime-version:content-disposition:in-reply-to:user-agent; bh=9pskbhcFdCYR+O0197LXRxHX3xRpKTYxebBKC2f8iQg=; b=VlW2PcrP4fYJ3f+/Q7L/iRhwq1eQqSY3g1M62Fqyl0yqcPy/I5/TbS81sdBL9V+gQB mfOi8Zf+pAmJ5qNA5zKrfG/1fwy0xrBm5mOWefN/dI0U9xxXnj1P2ffOrrravmh/Tp80 eht81gLlWR5OsGqn2TW7oOZrChBCohYoQMxxOJLJys7aP1WbBcZZ7J1cyyhpzbt5HMNf +YwGeiBNSWVjf8yt/zS8qHddqovWKTaIaU7UDrd+TheJJLmN3FZugjyjh53azAhGn8bN TKXx2dNyU+JrfXzKJ+bIENjU0dvgusTSsvNPeQ5ZOBrSMAadOHU4YacTSz59Y2KSfPwy 54nw== X-Gm-Message-State: ABuFfoj8esghIwlFa6WpOPcJ4F8KQYLyrMXGVnw+ZjbLdGkzG0PwG394 bZYOmZMVbCWVAEDSuDCPC5LuUZWr X-Received: by 2002:a81:7307:: with SMTP id o7-v6mr4272865ywc.183.1538677220979; Thu, 04 Oct 2018 11:20:20 -0700 (PDT) Received: from localhost ([2620:10d:c091:200::5:60ea]) by smtp.gmail.com with ESMTPSA id q1-v6sm1930152ywa.92.2018.10.04.11.20.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Oct 2018 11:20:19 -0700 (PDT) Date: Thu, 4 Oct 2018 11:20:17 -0700 From: Tejun Heo To: "Michael Kerrisk (man-pages)" Cc: lkml , "open list:CONTROL GROUP (CGROUP)" , "Serge E. Hallyn" , Amin Jamali , Joao De Almeida Pereira Subject: Re: Cgroup v2 bug: "domain invalid" node can't be converted to "threaded" Message-ID: <20181004182017.GK270328@devbig004.ftw2.facebook.com> References: <20181002210741.GJ270328@devbig004.ftw2.facebook.com> <0cf4f9de-70d2-cf94-12d2-283759638e20@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <0cf4f9de-70d2-cf94-12d2-283759638e20@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello, On Thu, Oct 04, 2018 at 08:14:55PM +0200, Michael Kerrisk (man-pages) wrote: > On 10/02/2018 11:07 PM, Tejun Heo wrote: > > Hello, Michael. > > > > Great catch. Can you please verify whether the following patch fixes > > the issue? > > > > Thanks. > Against which kernel version should this apply? I get these build > errors on kernel 4.18: lol, sorry about that. The header change ended up in the wrong patch. Updated patch follows. Thanks. ------ 8< ------ Subject: cgroup: Fix dom_cgrp propagation when enabling threaded mode A cgroup which is already a threaded domain may be converted into a threaded cgroup if the prerequisite conditions are met. When this happens, all threaded descendant should also have their ->dom_cgrp updated to the new threaded domain cgroup. Unfortunately, this propagation was missing leading to the following failure. # cd /sys/fs/cgroup/unified # cat cgroup.subtree_control # show that no controllers are enabled # mkdir -p mycgrp/a/b/c # echo threaded > mycgrp/a/b/cgroup.type At this point, the hierarchy looks as follows: mycgrp [d] a [dt] b [t] c [inv] Now let's make node "a" threaded (and thus "mycgrp" s made "domain threaded"): # echo threaded > mycgrp/a/cgroup.type By this point, we now have a hierarchy that looks as follows: mycgrp [dt] a [t] b [t] c [inv] But, when we try to convert the node "c" from "domain invalid" to "threaded", we get ENOTSUP on the write(): # echo threaded > mycgrp/a/b/c/cgroup.type sh: echo: write error: Operation not supported This patch fixes the problem by * Moving the opencoded ->dom_cgrp save and restoration in cgroup_enable_threaded() into cgroup_{save|restore}_control() so that mulitple cgroups can be handled. * Updating all threaded descendants' ->dom_cgrp to point to the new dom_cgrp when enabling threaded mode. Signed-off-by: Tejun Heo Reported-by: "Michael Kerrisk (man-pages)" Link: https://lore.kernel.org/r/CAKgNAkhHYCMn74TCNiMJ=ccLd7DcmXSbvw3CbZ1YREeG7iJM5g@mail.gmail.com Fixes: 454000adaa2a ("cgroup: introduce cgroup->dom_cgrp and threaded css_set handling") Cc: stable@vger.kernel.org # v4.14+ --- include/linux/cgroup-defs.h | 1 + kernel/cgroup/cgroup.c | 25 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) --- a/include/linux/cgroup-defs.h +++ b/include/linux/cgroup-defs.h @@ -412,6 +412,7 @@ struct cgroup { * specific task are charged to the dom_cgrp. */ struct cgroup *dom_cgrp; + struct cgroup *old_dom_cgrp; /* used while enabling threaded */ /* per-cpu recursive resource statistics */ struct cgroup_rstat_cpu __percpu *rstat_cpu; --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -2836,11 +2836,12 @@ restart: } /** - * cgroup_save_control - save control masks of a subtree + * cgroup_save_control - save control masks and dom_cgrp of a subtree * @cgrp: root of the target subtree * - * Save ->subtree_control and ->subtree_ss_mask to the respective old_ - * prefixed fields for @cgrp's subtree including @cgrp itself. + * Save ->subtree_control, ->subtree_ss_mask and ->dom_cgrp to the + * respective old_ prefixed fields for @cgrp's subtree including @cgrp + * itself. */ static void cgroup_save_control(struct cgroup *cgrp) { @@ -2850,6 +2851,7 @@ static void cgroup_save_control(struct c cgroup_for_each_live_descendant_pre(dsct, d_css, cgrp) { dsct->old_subtree_control = dsct->subtree_control; dsct->old_subtree_ss_mask = dsct->subtree_ss_mask; + dsct->old_dom_cgrp = dsct->dom_cgrp; } } @@ -2875,11 +2877,12 @@ static void cgroup_propagate_control(str } /** - * cgroup_restore_control - restore control masks of a subtree + * cgroup_restore_control - restore control masks and dom_cgrp of a subtree * @cgrp: root of the target subtree * - * Restore ->subtree_control and ->subtree_ss_mask from the respective old_ - * prefixed fields for @cgrp's subtree including @cgrp itself. + * Restore ->subtree_control, ->subtree_ss_mask and ->dom_cgrp from the + * respective old_ prefixed fields for @cgrp's subtree including @cgrp + * itself. */ static void cgroup_restore_control(struct cgroup *cgrp) { @@ -2889,6 +2892,7 @@ static void cgroup_restore_control(struc cgroup_for_each_live_descendant_post(dsct, d_css, cgrp) { dsct->subtree_control = dsct->old_subtree_control; dsct->subtree_ss_mask = dsct->old_subtree_ss_mask; + dsct->dom_cgrp = dsct->old_dom_cgrp; } } @@ -3196,6 +3200,8 @@ static int cgroup_enable_threaded(struct { struct cgroup *parent = cgroup_parent(cgrp); struct cgroup *dom_cgrp = parent->dom_cgrp; + struct cgroup *dsct; + struct cgroup_subsys_state *d_css; int ret; lockdep_assert_held(&cgroup_mutex); @@ -3225,12 +3231,13 @@ static int cgroup_enable_threaded(struct */ cgroup_save_control(cgrp); - cgrp->dom_cgrp = dom_cgrp; + cgroup_for_each_live_descendant_pre(dsct, d_css, cgrp) + if (dsct == cgrp || cgroup_is_threaded(dsct)) + dsct->dom_cgrp = dom_cgrp; + ret = cgroup_apply_control(cgrp); if (!ret) parent->nr_threaded_children++; - else - cgrp->dom_cgrp = cgrp; cgroup_finalize_control(cgrp, ret); return ret;