From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752858AbdFNPGP (ORCPT ); Wed, 14 Jun 2017 11:06:15 -0400 Received: from mx1.redhat.com ([209.132.183.28]:32812 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751934AbdFNPGM (ORCPT ); Wed, 14 Jun 2017 11:06:12 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 79A01723CD Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=longman@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 79A01723CD From: Waiman Long To: Tejun Heo , Li Zefan , Johannes Weiner , Peter Zijlstra , Ingo Molnar Cc: cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com, pjt@google.com, luto@amacapital.net, efault@gmx.de, torvalds@linux-foundation.org, Waiman Long Subject: [RFC PATCH-cgroup 5/6] cgroup: Skip dying css in cgroup_apply_control_{enable,disable} Date: Wed, 14 Jun 2017 11:05:36 -0400 Message-Id: <1497452737-11125-6-git-send-email-longman@redhat.com> In-Reply-To: <1497452737-11125-1-git-send-email-longman@redhat.com> References: <1497452737-11125-1-git-send-email-longman@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 14 Jun 2017 15:06:06 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org While constantly turning on and off controllers, it is possible to trigger the dying CSS warnings in cgroup_apply_control_enable() and cgroup_apply_control_disable(). The current code, however, proceeds after the warning leading to other secondary warnings and maybe even data corruption, like cgroup: cgroup_addrm_files: failed to add current, err=-17 To avoid the secondary errors, the dying CSS is now ignored or skipped so as not to cause other problem. Signed-off-by: Waiman Long --- kernel/cgroup/cgroup.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index f0bea32..2a5bd49 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -2846,12 +2846,24 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp) for_each_subsys(ss, ssid) { struct cgroup_subsys_state *css = cgroup_css(dsct, ss); - WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt)); - if (!(cgroup_ss_mask(dsct, false) & (1 << ss->id)) || (dsct->bypass_ss_mask & (1 << ss->id))) continue; + /* + * If the css is dying, we will just skip it after + * warning. + */ + if (css && (css->flags & CSS_DYING)) { + char name[NAME_MAX+1]; + + cgroup_name(cgrp, name, NAME_MAX); + pr_warn("%s: %s css of cgroup %s is dying!\n", + __func__, ss->name, name); + WARN_ON_ONCE(1); + continue; + } + if (!css) { css = css_create(dsct, ss); if (IS_ERR(css)) @@ -2893,9 +2905,7 @@ static void cgroup_apply_control_disable(struct cgroup *cgrp) for_each_subsys(ss, ssid) { struct cgroup_subsys_state *css = cgroup_css(dsct, ss); - WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt)); - - if (!css) + if (!css || (css->flags & CSS_DYING)) continue; if (css->parent && -- 1.8.3.1