From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on archive.lwn.net X-Spam-Level: X-Spam-Status: No, score=-5.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=unavailable autolearn_force=no version=3.4.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by archive.lwn.net (Postfix) with ESMTP id F3F487D043 for ; Tue, 29 May 2018 00:55:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755870AbeE2AzP (ORCPT ); Mon, 28 May 2018 20:55:15 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:32966 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755808AbeE2AzO (ORCPT ); Mon, 28 May 2018 20:55:14 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B8E5F401EF04; Tue, 29 May 2018 00:55:13 +0000 (UTC) Received: from llong.remote.csb (ovpn-121-110.rdu2.redhat.com [10.10.121.110]) by smtp.corp.redhat.com (Postfix) with ESMTP id 830092024CA1; Tue, 29 May 2018 00:55:12 +0000 (UTC) Subject: Re: [PATCH v8 2/6] cpuset: Add new v2 cpuset.sched.domain flag To: Juri Lelli Cc: Tejun Heo , Li Zefan , Johannes Weiner , Peter Zijlstra , Ingo Molnar , cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@fb.com, pjt@google.com, luto@amacapital.net, Mike Galbraith , torvalds@linux-foundation.org, Roman Gushchin References: <1526590545-3350-1-git-send-email-longman@redhat.com> <1526590545-3350-3-git-send-email-longman@redhat.com> <20180522125750.GA31040@localhost.localdomain> From: Waiman Long Organization: Red Hat Message-ID: <595ad976-6859-95bc-179f-88e11ba98dbf@redhat.com> Date: Mon, 28 May 2018 20:55:13 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.0 MIME-Version: 1.0 In-Reply-To: <20180522125750.GA31040@localhost.localdomain> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Language: en-US X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Tue, 29 May 2018 00:55:13 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Tue, 29 May 2018 00:55:13 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'longman@redhat.com' RCPT:'' Sender: linux-doc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-doc@vger.kernel.org On 05/22/2018 08:57 AM, Juri Lelli wrote: > Hi, > > On 17/05/18 16:55, Waiman Long wrote: > > [...] > >> /** >> + * update_isolated_cpumask - update the isolated_cpus mask of parent cpuset >> + * @cpuset: The cpuset that requests CPU isolation >> + * @oldmask: The old isolated cpumask to be removed from the parent >> + * @newmask: The new isolated cpumask to be added to the parent >> + * Return: 0 if successful, an error code otherwise >> + * >> + * Changes to the isolated CPUs are not allowed if any of CPUs changing >> + * state are in any of the child cpusets of the parent except the requesting >> + * child. >> + * >> + * If the sched_domain flag changes, either the oldmask (0=>1) or the >> + * newmask (1=>0) will be NULL. >> + * >> + * Called with cpuset_mutex held. >> + */ >> +static int update_isolated_cpumask(struct cpuset *cpuset, >> + struct cpumask *oldmask, struct cpumask *newmask) >> +{ >> + int retval; >> + int adding, deleting; >> + cpumask_var_t addmask, delmask; >> + struct cpuset *parent = parent_cs(cpuset); >> + struct cpuset *sibling; >> + struct cgroup_subsys_state *pos_css; >> + int old_count = parent->isolation_count; >> + bool dying = cpuset->css.flags & CSS_DYING; >> + >> + /* >> + * Parent must be a scheduling domain with non-empty cpus_allowed. >> + */ >> + if (!is_sched_domain(parent) || cpumask_empty(parent->cpus_allowed)) >> + return -EINVAL; >> + >> + /* >> + * The oldmask, if present, must be a subset of parent's isolated >> + * CPUs. >> + */ >> + if (oldmask && !cpumask_empty(oldmask) && (!parent->isolation_count || >> + !cpumask_subset(oldmask, parent->isolated_cpus))) { >> + WARN_ON_ONCE(1); >> + return -EINVAL; >> + } >> + >> + /* >> + * A sched_domain state change is not allowed if there are >> + * online children and the cpuset is not dying. >> + */ >> + if (!dying && (!oldmask || !newmask) && >> + css_has_online_children(&cpuset->css)) >> + return -EBUSY; >> + >> + if (!zalloc_cpumask_var(&addmask, GFP_KERNEL)) >> + return -ENOMEM; >> + if (!zalloc_cpumask_var(&delmask, GFP_KERNEL)) { >> + free_cpumask_var(addmask); >> + return -ENOMEM; >> + } >> + >> + if (!old_count) { >> + if (!zalloc_cpumask_var(&parent->isolated_cpus, GFP_KERNEL)) { >> + retval = -ENOMEM; >> + goto out; >> + } >> + old_count = 1; >> + } >> + >> + retval = -EBUSY; >> + adding = deleting = false; >> + if (newmask) >> + cpumask_copy(addmask, newmask); >> + if (oldmask) >> + deleting = cpumask_andnot(delmask, oldmask, addmask); >> + if (newmask) >> + adding = cpumask_andnot(addmask, newmask, delmask); >> + >> + if (!adding && !deleting) >> + goto out_ok; >> + >> + /* >> + * The cpus to be added must be in the parent's effective_cpus mask >> + * but not in the isolated_cpus mask. >> + */ >> + if (!cpumask_subset(addmask, parent->effective_cpus)) >> + goto out; >> + if (parent->isolation_count && >> + cpumask_intersects(parent->isolated_cpus, addmask)) >> + goto out; >> + >> + /* >> + * Check if any CPUs in addmask or delmask are in a sibling cpuset. >> + * An empty sibling cpus_allowed means it is the same as parent's >> + * effective_cpus. This checking is skipped if the cpuset is dying. >> + */ >> + if (dying) >> + goto updated_isolated_cpus; >> + >> + cpuset_for_each_child(sibling, pos_css, parent) { >> + if ((sibling == cpuset) || !(sibling->css.flags & CSS_ONLINE)) >> + continue; >> + if (cpumask_empty(sibling->cpus_allowed)) >> + goto out; >> + if (adding && >> + cpumask_intersects(sibling->cpus_allowed, addmask)) >> + goto out; >> + if (deleting && >> + cpumask_intersects(sibling->cpus_allowed, delmask)) >> + goto out; >> + } > Just got the below by echoing 1 into cpuset.sched.domain of a sibling with > "isolated" cpuset.cpus. Guess you are missing proper locking about here > above. > > --->8--- > [ 7509.905005] ============================= > [ 7509.905009] WARNING: suspicious RCU usage > [ 7509.905014] 4.17.0-rc5+ #11 Not tainted > [ 7509.905017] ----------------------------- > [ 7509.905023] /home/juri/work/kernel/linux/kernel/cgroup/cgroup.c:3826 cgroup_mutex or RCU read lock required! > [ 7509.905026] > other info that might help us debug this: The cause is missing rcu_lock/rcu_unlock in section of the code. It will be fixed in the next version. Cheers, Longman -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html