Received: by 10.223.164.221 with SMTP id h29csp493555wrb; Fri, 27 Oct 2017 01:05:58 -0700 (PDT) X-Google-Smtp-Source: ABhQp+Qo+b+Mq2M/fdBE1xnd1GjPCgH5MBGoYTqpL+Y3lB1j7tbeIr3Eb+xEEKiSh2t+EkKa+4nc X-Received: by 10.98.186.11 with SMTP id k11mr8055694pff.141.1509091558649; Fri, 27 Oct 2017 01:05:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1509091558; cv=none; d=google.com; s=arc-20160816; b=JbGYxbWZX2WSDVS9Qmnt/sY6guxw0rYeWorrE1vRbwlCmfGUQZ8INzP6k1dL55k3Yg tDncil6DmPLySHJ+eRtuHDgBr+Cn86RLkDAtR07wN2chEUzBayGmM6ddx1MiIBht85LD sj6vVbCZT1Wt9bBUVlppriaFu9KnGDzsQikdw7sj6E34yAe/UkrzJgkLbyPnRhnMN2tA iF5wrxxGdk4BkW6zBSKefr7IWNS3MYrc3DDkSWO0iTraGcGSfLXGY33J0dOJYWgA4I3n Wt2rbCh/zWz2LAyhBhWfVYqDm2hgFLfV4sKk4NH8PZok38lX6X3DZ/HHxoNyMCyA0rPg TCtw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dmarc-filter :dkim-signature:dkim-signature:arc-authentication-results; bh=O8f2QpMlHseWT6FBueZVHLPyI7K59uuGSLjkushlqR8=; b=Fr1UDcZ07pQdpJE3whHfkqiGeTtQhbG6UOgsnoaIaBVjpvFoGdtr4cMu9namVzEUpG rB0qNBP06ffcbpslPG444oD9dAfdEuyJMcRyLKcXtyf/UpiVRdsPIYxo8a/29ogweN+m m7OXDkl3v2zyMMeb/WnT7SiKNOhSer0KFj9bNnVvEZG+Ulq2FTnShqB7ujrpWxy8oJov ipGYJWAfRqrlFyxinfbgytcu7o69yewnqJ51f/lj3qnxBNeo8nz7NTbU6nQqnzWjTvwp KaKQoE1wQ7o7dzyBqCuVzln1GHoYAeFC7zt/wUdGG0BX9EBP7GohDhyjUd6VYzoq1WBv QPHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=Qp4nOZ9/; dkim=pass header.i=@codeaurora.org header.s=default header.b=i0lFeNB0; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h64si4546019pge.382.2017.10.27.01.05.44; Fri, 27 Oct 2017 01:05:58 -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=pass header.i=@codeaurora.org header.s=default header.b=Qp4nOZ9/; dkim=pass header.i=@codeaurora.org header.s=default header.b=i0lFeNB0; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751072AbdJ0IED (ORCPT + 99 others); Fri, 27 Oct 2017 04:04:03 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:40340 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752003AbdJ0IDr (ORCPT ); Fri, 27 Oct 2017 04:03:47 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 4212860116; Fri, 27 Oct 2017 08:03:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1509091427; bh=w5+f/o8m1u3ByRyiviaZBUjfK/qVwJij9VQLJoM1m6I=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=Qp4nOZ9/C/f2l81Tj1EvZfFrAOrA3+hZTTdWJvUzop38y2NkilMnupRGHqGma+U7i MZadX6QaL3efa2q80srwLyNeg2vWvGT5zANwJC6TdmXSURzV/tliG8tk9pqYCLjZBL i6K+8WwdO1IkmuZqH2MjogvLohVMoaaPpKtG9q5Q= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from [10.204.79.19] (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: prsood@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 9026860116; Fri, 27 Oct 2017 08:03:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1509091426; bh=w5+f/o8m1u3ByRyiviaZBUjfK/qVwJij9VQLJoM1m6I=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=i0lFeNB0jEy/f3IfWqjUNpStOl8pnHratONfpbPhJGyA+Py3FJKL6SRkk//pIMXaI z6STfLayEgPPrWybAYQwSRNamiGXPO/cmRK/4c1b4UgWEDI+xWuLjC6pipv55Spxbp aJpqRyoRm9KO6VL2mNJSmGd/Z1cnJY5L0XolrmNM= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 9026860116 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=prsood@codeaurora.org Subject: Re: [PATCH] cgroup/cpuset: remove circular dependency deadlock To: Waiman Long , peterz@infradead.org, tj@kernel.org, lizefan@huawei.com, mingo@kernel.org, boqun.feng@gmail.com, tglx@linutronix.de Cc: cgroups@vger.kernel.org, sramana@codeaurora.org, linux-kernel@vger.kernel.org References: <20171025093041.GO3165@worktop.lehotels.local> <1509018722-30359-1-git-send-email-prsood@codeaurora.org> From: Prateek Sood Message-ID: <45cdac2f-4462-e5b5-d724-8cca58e3932a@codeaurora.org> Date: Fri, 27 Oct 2017 13:33:41 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 10/26/2017 07:35 PM, Waiman Long wrote: > On 10/26/2017 07:52 AM, Prateek Sood wrote: >> Remove circular dependency deadlock in a scenario where hotplug of CPU is >> being done while there is updation in cgroup and cpuset triggered from >> userspace. >> >> Process A => kthreadd => Process B => Process C => Process A >> >> Process A >> cpu_subsys_offline(); >> cpu_down(); >> _cpu_down(); >> percpu_down_write(&cpu_hotplug_lock); //held >> cpuhp_invoke_callback(); >> workqueue_offline_cpu(); >> wq_update_unbound_numa(); >> kthread_create_on_node(); >> wake_up_process(); //wakeup kthreadd >> flush_work(); >> wait_for_completion(); >> >> kthreadd >> kthreadd(); >> kernel_thread(); >> do_fork(); >> copy_process(); >> percpu_down_read(&cgroup_threadgroup_rwsem); >> __rwsem_down_read_failed_common(); //waiting >> >> Process B >> kernfs_fop_write(); >> cgroup_file_write(); >> cgroup_procs_write(); >> percpu_down_write(&cgroup_threadgroup_rwsem); //held >> cgroup_attach_task(); >> cgroup_migrate(); >> cgroup_migrate_execute(); >> cpuset_can_attach(); >> mutex_lock(&cpuset_mutex); //waiting >> >> Process C >> kernfs_fop_write(); >> cgroup_file_write(); >> cpuset_write_resmask(); >> mutex_lock(&cpuset_mutex); //held >> update_cpumask(); >> update_cpumasks_hier(); >> rebuild_sched_domains_locked(); >> get_online_cpus(); >> percpu_down_read(&cpu_hotplug_lock); //waiting >> >> Eliminating deadlock by reversing the locking order for cpuset_mutex and >> cpu_hotplug_lock. > > General comments: > > Please add a version number of your patch. I have seen multiple versions > of this patch and have lost track how many are there as there is no > version number information. In addition, there are changes beyond just > swapping the lock order and they are not documented in this change log. > I would like to see you discuss about those additional changes here as well. Thanks for the comments Longman. I will introduce patch versioning and update commit text to document extra changes. Explaintaion for extra changes in this patch: After inverting the locking sequence of cpu_hotplug_lock and cpuset_mutex, cpuset_hotplug_workfn() related functionality can be done synchronously from the context doing cpu hotplug. Extra changes in this patch intend to remove queuing of cpuset_hotplug_workfn() as a work item for cpu hotplug path. For memory hotplug it still gets queued as a work item. This suggestion came in from Peter. Peter could you please elaborate if I have missed anything. > >> void rebuild_sched_domains(void) >> { >> + cpus_read_lock(); >> mutex_lock(&cpuset_mutex); >> - rebuild_sched_domains_locked(); >> + rebuild_sched_domains_cpuslocked(); >> mutex_unlock(&cpuset_mutex); >> + cpus_read_unlock(); >> } > > I saw a lot of instances where cpus_read_lock() and mutex_lock() come > together. Maybe some new lock/unlock helper functions may help. Ok, I will introduce a single wrapper for locking and unlocking of both locks > >> @@ -2356,25 +2354,29 @@ static void cpuset_hotplug_workfn(struct work_struct *work) >> } >> >> /* rebuild sched domains if cpus_allowed has changed */ >> - if (cpus_updated || force_rebuild) { >> - force_rebuild = false; >> - rebuild_sched_domains(); >> + if (cpus_updated) { >> + if (use_cpu_hp_lock) >> + rebuild_sched_domains(); >> + else { >> + /* When called during cpu hotplug cpu_hotplug_lock >> + * is held by the calling thread, not >> + * not cpuhp_thread_fun >> + */ > > ??? The comment is not clear. Following is the scenario that is described by the comment Process A _cpu_down() cpus_write_lock() //cpu_hotplug_lock held cpuhp_kick_ap_work() cpuhp_kick_ap() wake_up_process() // wake up cpuhp_thread_fun wait_for_ap_thread() //wait for hotplug thread to signal completion cpuhp_thread_fun() cpuhp_invoke_callback() sched_cpu_deactivate() cpuset_cpu_inactive() cpuset_update_active_cpus() cpuset_hotplug(false) \\ do not use cpu_hotplug_lock from _cpu_down() path I will update the comment in next version of patch to elaborate more. > > Cheers, > Longman > -- Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc., is a member of Code Aurora Forum, a Linux Foundation Collaborative Project From 1582329255294856720@xxx Thu Oct 26 14:06:10 +0000 2017 X-GM-THRID: 1577859769769316492 X-Gmail-Labels: Inbox,Category Forums