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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3D635E77180 for ; Wed, 11 Dec 2024 15:41:14 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9D1856B0092; Wed, 11 Dec 2024 10:41:13 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 980ED6B0093; Wed, 11 Dec 2024 10:41:13 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 821AC6B0095; Wed, 11 Dec 2024 10:41:13 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 5EBFE6B0092 for ; Wed, 11 Dec 2024 10:41:13 -0500 (EST) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 1688E4301E for ; Wed, 11 Dec 2024 15:41:13 +0000 (UTC) X-FDA: 82883091270.23.5D8506E Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf16.hostedemail.com (Postfix) with ESMTP id 941B5180006 for ; Wed, 11 Dec 2024 15:40:47 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Nc7sYBQH; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf16.hostedemail.com: domain of frederic@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=frederic@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1733931661; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=2C1DesTlD5IAw4irhlcOAfgC9IFycDCvt73b0GVaSrw=; b=lWc3q8nRM1uMmCEF8TB0afh9Dov7g9/QS/N3/c76PWriATt3/RxosUI2uOR2uugU/FVDuX YCNy/vIelgEGqmsJaJa5ZJYweKFYzqIt5NyYVNflKV53jyg5sKbVEnoxPUCffq+F9NFg80 I//z1hwsyHghaOcJNBDS0pdiurWz1LA= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1733931661; a=rsa-sha256; cv=none; b=V/Qts6MmVsLZh+fz4UTxKqbx+DmD40QdgWP8Ix5Hu5V7943Vf3hszqVRBFZpHAGfA2/y/o BuYvpQGctdag8AakolhETyGAWwsHlrR7guYj6enlsatH/ycvTmvqD3kPKnZ2vax3dWtI74 U9lCMnoEOt9loS7o4Ar13MHHvLP7ed4= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Nc7sYBQH; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf16.hostedemail.com: domain of frederic@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=frederic@kernel.org Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id B36E85C041E; Wed, 11 Dec 2024 15:40:27 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A2DA0C4CEDD; Wed, 11 Dec 2024 15:41:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1733931669; bh=2qfuTV6k+A8iDq1teARtVDQzBAoKchz+tMTAsMIX4+E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Nc7sYBQHWsneHm+RDymrniaj4mitPN7j7ea2YdKP9niGyvkp1gXpfHct8rHMa0YrG f6feb1+HULCsQIuaNNjRvMFIisKqI5UDVEynQ6L5LQorZ7Z4wG2lAGhay7NKO1y+cZ aGyNBpPV21LSFM/FPM+6Itrf7nXwHXtZoCi83bikfpV03LmnrcEb+3dQhBHJ9DVuOq F/EcAj7YWWA1devSxAGgVuSlW7rRIm4sjiHDLig0WcerfXUSeH/wrXyX9k3PN5c6Xb +6R/3najAYR04xWmYNvgUQ6yrWiHnlSeTdr+8FYOUhYju18hmYs9M/HtOtrTv8Z8Ck 1kcjrlunevEMA== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Andrew Morton , Kees Cook , Peter Zijlstra , Thomas Gleixner , Michal Hocko , Vlastimil Babka , linux-mm@kvack.org, "Paul E. McKenney" , Neeraj Upadhyay , Joel Fernandes , Boqun Feng , Zqiang , rcu@vger.kernel.org, Uladzislau Rezki Subject: [PATCH 11/19] kthread: Make sure kthread hasn't started while binding it Date: Wed, 11 Dec 2024 16:40:24 +0100 Message-ID: <20241211154035.75565-12-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20241211154035.75565-1-frederic@kernel.org> References: <20241211154035.75565-1-frederic@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: 84p8i34o78qd3nboyrkj5cwo8zwu6xy6 X-Rspamd-Queue-Id: 941B5180006 X-Rspam-User: X-Rspamd-Server: rspam01 X-HE-Tag: 1733931647-759300 X-HE-Meta: U2FsdGVkX1/4jwOu2+AWvO1YXc1N06fE5T9ZVJ2ds4yg+C5YTa6Xg7yuSaTlcy7ZmbXiwMuBytNbJVLEL2tp2NdcOdlkZRxVNTrOtnT0y9NQNLha6T+gftXqwgj91eQrerfLOOTqO4KAF/TNgMi9jSEdOtCPjVWtdrctfIirEba8JKDyhYgpBYrkkesLZwAzw5GcBGpCsuhspr775aNodZrmLKoLt2CmRSlXRky21gL2Nad7OzKXLfikMDn+SUxEScFVojeJxoyqe+s4ZdlE29KzMPCvA30Rw1Q2Fzw39uQENFqDjNTAoKO8Mry6UEXGiybMn3os2gZyBM66/LYK3e8NAeZYZDOmGXqjLq6mq4BqmkF27xKQtMyNBKCku3umY/mairqwThof+YS4FKMevSvhhbO3uCHor1ULuPhNJJpyIn2E4YOauWNMjHj2l8ngDLOtW9UybujExQaHJM0WFnOo3B07X4SPaqmvSHwKRqcDyFBPYQb8N+7B0UkkIW2dtQd5pmrKlLX9tl+/dHZjikzUTxbasFyi7Yc8sOXsTTDfEkjOldFXYkbxImTzq9wvsSk+oQIAfsaw0dyPLWZU429v6RPjew4036EkP6t5Pinx/pwtayms3Myc+y/2h8rE1lZc1uT47DmQXE+A9gI/KvuE7pgeiCGaWsrokRHBFEOjkNFrjKTTOs1L40lqSwtzXD9Pp29VfjNHZBfZgADeN9Cr5rh7wHN8oQRAQujgLJ61/+412N5UevKcgNIAhtW9/aPNn0nWpCJ+oK2P21ttfwcN0hgI5shuNhxRDP1UlBZHHDNFxMyPKSAiGVV5D93qx4UvbWdRkQr9bOcZTW/thvgP3cjPsiwgJ+mcawbn1xDu0ONRmR2qE4UV61JOy+sN+s/VMokdlgOPYzxrHTLAuE2p77fhH2bSbNKuXKHaaY4WnpxaigcgvBpLZY7mq0m5xg9XxH7qVkvtcPUNUWG rYGlrb5C wESpsuSXxODDK4LqQt1VhD3KYwYHSvU793fa0CKa1swLbuFdkrp2cPMrhyVaNSb6i65x58zsnWQh7m3pqER5/sHsuROXcfD2IOdkeKbb8/8OJG3hOX7myp9xC3x2RwBtnUNRp8dDQi5l51onX5eaKa25WZXNmEGCd5R90TZWh0fW9KyqsPZnGNYPCxCr0oGNPGuwawtDtSuy/CDwM+PJYN4fhPAAnKOzqPrROciA8fBbffd3hxOEcGTV48ZpmoQw6Kcqf1cS3sGnalHT7RldYvQd1aD7FpJX26BXOHlbPz5SmBqP/n/dqUWtx6g== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Make sure the kthread is sleeping in the schedule_preempt_disabled() call before calling its handler when kthread_bind[_mask]() is called on it. This provides a sanity check verifying that the task is not randomly blocked later at some point within its function handler, in which case it could be just concurrently awaken, leaving the call to do_set_cpus_allowed() without any effect until the next voluntary sleep. Rely on the wake-up ordering to ensure that the newly introduced "started" field returns the expected value: TASK A TASK B ------ ------ READ kthread->started wake_up_process(B) rq_lock() ... rq_unlock() // RELEASE schedule() rq_lock() // ACQUIRE // schedule task B rq_unlock() WRITE kthread->started Similarly, writing kthread->started before subsequent voluntary sleeps will be visible after calling wait_task_inactive() in __kthread_bind_mask(), reporting potential misuse of the API. Upcoming patches will make further use of this facility. Acked-by: Vlastimil Babka Signed-off-by: Frederic Weisbecker --- kernel/kthread.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kernel/kthread.c b/kernel/kthread.c index a5ac612b1609..b6f9ce475a4f 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -53,6 +53,7 @@ struct kthread_create_info struct kthread { unsigned long flags; unsigned int cpu; + int started; int result; int (*threadfn)(void *); void *data; @@ -382,6 +383,8 @@ static int kthread(void *_create) schedule_preempt_disabled(); preempt_enable(); + self->started = 1; + ret = -EINTR; if (!test_bit(KTHREAD_SHOULD_STOP, &self->flags)) { cgroup_kthread_ready(); @@ -540,7 +543,9 @@ static void __kthread_bind(struct task_struct *p, unsigned int cpu, unsigned int void kthread_bind_mask(struct task_struct *p, const struct cpumask *mask) { + struct kthread *kthread = to_kthread(p); __kthread_bind_mask(p, mask, TASK_UNINTERRUPTIBLE); + WARN_ON_ONCE(kthread->started); } /** @@ -554,7 +559,9 @@ void kthread_bind_mask(struct task_struct *p, const struct cpumask *mask) */ void kthread_bind(struct task_struct *p, unsigned int cpu) { + struct kthread *kthread = to_kthread(p); __kthread_bind(p, cpu, TASK_UNINTERRUPTIBLE); + WARN_ON_ONCE(kthread->started); } EXPORT_SYMBOL(kthread_bind); -- 2.46.0