From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 62D9115B57C for ; Mon, 16 Sep 2024 22:49:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526976; cv=none; b=RUFxX+37n3wkjOCI4ravx7Bqnedlx3K/ayz0R5aNO5cf/VJ7USuXmeh3mrNU/jAwTo3nmxUYl4YPhMLXuzRgW8713b2JUZM5LSghmIgy8b3quds6Qrskec1+aLmiPwn+RJ6Bx4I/xoB321VUGuLmvEKUzb+KnthRFbkGAmpJp7k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526976; c=relaxed/simple; bh=0P3cw1hR9bRTtfA3GkNVPSqmTI3laEGRCvS0ucnfa+o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qrJVr9prQvm6hjEoali8khn4uK2m36x9foURAyX8l+32B8Oj6GspWTXN23jVbTtFxks2gCoZzfDZhd3LNa1lf4IxBMKXrfY6BEis6xcC2aHpAOZPQY7lqWAH7LPP0dXlca3Lcm3uKfMaWQ/BjxtfQS3mOvsDbIRppkZOpQ+lAJs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eGeYvanq; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="eGeYvanq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AFA79C4CEC5; Mon, 16 Sep 2024 22:49:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726526975; bh=0P3cw1hR9bRTtfA3GkNVPSqmTI3laEGRCvS0ucnfa+o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eGeYvanql6Br+UdwFEhFyLgvO0ID7xr5o0ZW2NwP+6N0n7XpmiJZOgkmhOjZkI6Uj YMBmJj1+6FM6ute8bBCSY4BTzFPsw+bq12Up6mxhrPNKPfqsnMeUMBoBan/qVYZ2XF CmU9i0CmDKfgtBcjIKkYUnnnhW1YknTojcYzKAyo86D7+WaOGhEZXGWe4f69Tyskoz WXQGsn+tyBKJUHPAELkAI8gNj4tQfrsvOFlVPdNxdJu+PGcNMwfJJGENS8CMfMEi0X TDP09T+F5EV4RvY3+ou0CFJixTMqSK8pJTy6bROMUP02AqBMg9xDrExeL15Rg2GAox lDOSXQKve1kWQ== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Russell King , linux-arm-kernel@lists.infradead.org, Andrew Morton , Peter Zijlstra , Thomas Gleixner , Dave Martin , Nicolas Pitre Subject: [PATCH 01/19] arm/bL_switcher: Use kthread_run_on_cpu() Date: Tue, 17 Sep 2024 00:49:05 +0200 Message-ID: <20240916224925.20540-2-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the proper API instead of open coding it. Reviewed-by: Dave Martin Acked-by: Nicolas Pitre Signed-off-by: Frederic Weisbecker --- arch/arm/common/bL_switcher.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/arch/arm/common/bL_switcher.c b/arch/arm/common/bL_switcher.c index 9a9aa53547a6..d1e82a318e3b 100644 --- a/arch/arm/common/bL_switcher.c +++ b/arch/arm/common/bL_switcher.c @@ -307,13 +307,11 @@ static struct task_struct *bL_switcher_thread_create(= int cpu, void *arg) { struct task_struct *task; =20 - task =3D kthread_create_on_node(bL_switcher_thread, arg, - cpu_to_node(cpu), "kswitcher_%d", cpu); - if (!IS_ERR(task)) { - kthread_bind(task, cpu); - wake_up_process(task); - } else + task =3D kthread_run_on_cpu(bL_switcher_thread, arg, + cpu, "kswitcher_%d"); + if (IS_ERR(task)) pr_err("%s failed for CPU %d\n", __func__, cpu); + return task; } =20 --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED5AB14BFBF for ; Mon, 16 Sep 2024 22:49:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526980; cv=none; b=FxJ5h+RhNAap3/NFbE1sFO4cLJf9inFZCVzjKNpEyeofnFt78+TdCGeMixMHjwlVwGB3fECKvAUjsw0fL22pMQHEUpTDByFZDr3JzHDHiw3EMQod4ktjtWi+aWyZsjpQv6x0ntYfiLUXXfOoDi3OHwHSYRPjjvzOd1IqoYNwjGI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526980; c=relaxed/simple; bh=IoZPaCv863UIRZr027aVdH0TUkaWU86goti0yjIS6gg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bAxuM+u7somQ4lX5+5r+/6QQl/xeLoEGH8TEZNNo4kyqVPn71Le6SIhTj1v3rd03onDawQ7zEoqarn+QLCHZVOQV/AEmKnzstgQ1k6YukL8WID5oW6FLtyDwtAD0uHRNkVAJZLYG6y+9bnxXtX0wpQXTNRJKiQqBt6ICUuS4DSY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DUBFuQWt; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DUBFuQWt" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5C780C4AF0B; Mon, 16 Sep 2024 22:49:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726526979; bh=IoZPaCv863UIRZr027aVdH0TUkaWU86goti0yjIS6gg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DUBFuQWtRy2rJuwxloWCe2KUZI/Rn9O5vmvS88Tougo3Z3sRMOu76gUEo1PNT4J7k 3C0nKiJ1zzshPdh5rtJjS10ASrIKTAB5xBx2BC+3lmGotRs/HIvciK0vfTOcfU4qNh LL19liBIdS3JQ8fjj21D1rYOqevGJTSVo9Lw5f8NGDs5r4VhkkSKYdxkfPeXNXLRLM q7kbJUfV5ScF8jz1Kz99wQwg+cnWuvMta3MfgCYW62PHJf0PMAaYQMuZXPTSqfQ+Fr lSF9XgSx2XhShE4abLEfXEuVinpsJLPFfgeORcI0oEpGUjybASuHWq8/Ab8vMIHknf gq2y89QJzJAmw== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Fenghua Yu , Reinette Chatre , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 02/19] x86/resctrl: Use kthread_run_on_cpu() Date: Tue, 17 Sep 2024 00:49:06 +0200 Message-ID: <20240916224925.20540-3-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the proper API instead of open coding it. Acked-by: Reinette Chatre Signed-off-by: Frederic Weisbecker --- arch/x86/kernel/cpu/resctrl/pseudo_lock.c | 28 +++++++---------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/arch/x86/kernel/cpu/resctrl/pseudo_lock.c b/arch/x86/kernel/cp= u/resctrl/pseudo_lock.c index e69489d48625..ae1f0c28eee6 100644 --- a/arch/x86/kernel/cpu/resctrl/pseudo_lock.c +++ b/arch/x86/kernel/cpu/resctrl/pseudo_lock.c @@ -1205,20 +1205,14 @@ static int pseudo_lock_measure_cycles(struct rdtgro= up *rdtgrp, int sel) plr->cpu =3D cpu; =20 if (sel =3D=3D 1) - thread =3D kthread_create_on_node(measure_cycles_lat_fn, plr, - cpu_to_node(cpu), - "pseudo_lock_measure/%u", - cpu); + thread =3D kthread_run_on_cpu(measure_cycles_lat_fn, plr, + cpu, "pseudo_lock_measure/%u"); else if (sel =3D=3D 2) - thread =3D kthread_create_on_node(measure_l2_residency, plr, - cpu_to_node(cpu), - "pseudo_lock_measure/%u", - cpu); + thread =3D kthread_run_on_cpu(measure_l2_residency, plr, + cpu, "pseudo_lock_measure/%u"); else if (sel =3D=3D 3) - thread =3D kthread_create_on_node(measure_l3_residency, plr, - cpu_to_node(cpu), - "pseudo_lock_measure/%u", - cpu); + thread =3D kthread_run_on_cpu(measure_l3_residency, plr, + cpu, "pseudo_lock_measure/%u"); else goto out; =20 @@ -1226,8 +1220,6 @@ static int pseudo_lock_measure_cycles(struct rdtgroup= *rdtgrp, int sel) ret =3D PTR_ERR(thread); goto out; } - kthread_bind(thread, cpu); - wake_up_process(thread); =20 ret =3D wait_event_interruptible(plr->lock_thread_wq, plr->thread_done =3D=3D 1); @@ -1315,18 +1307,14 @@ int rdtgroup_pseudo_lock_create(struct rdtgroup *rd= tgrp) =20 plr->thread_done =3D 0; =20 - thread =3D kthread_create_on_node(pseudo_lock_fn, rdtgrp, - cpu_to_node(plr->cpu), - "pseudo_lock/%u", plr->cpu); + thread =3D kthread_run_on_cpu(pseudo_lock_fn, rdtgrp, + plr->cpu, "pseudo_lock/%u"); if (IS_ERR(thread)) { ret =3D PTR_ERR(thread); rdt_last_cmd_printf("Locking thread returned error %d\n", ret); goto out_cstates; } =20 - kthread_bind(thread, plr->cpu); - wake_up_process(thread); - ret =3D wait_event_interruptible(plr->lock_thread_wq, plr->thread_done =3D=3D 1); if (ret < 0) { --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B59FA14D452 for ; Mon, 16 Sep 2024 22:49:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526981; cv=none; b=Q1UG5XRgCHXw5o0WeW/ubwSeaFbZOd9d4AFfqMrTzXjdvlThMZ8J58/Qc8H7LRHhzvrA6u1FVQHaWXkLh+hKkZ2X3QBwQ5sStNnb0gAP36MKkRr7UCjwCMwsliKnAG3rswD63X8Ct3g4aWpKhYBC9HZa1i+4pHq1o8Da/6+Ek7s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526981; c=relaxed/simple; bh=FNDnC4NnSKXZi0fBd7+r+3GeRTH7g/FrYIGmJ7rL3+g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=f8kKVEbsmmdRHTgIgqAS5qsXBWvHebG9ClznQ2uXKleEc0xfiGxGXhIulei/taBtob2X5uh0p+OLV/nwFsgjHv1clIePRTNX8KLUjq+Z2Juju4km8X0z5Tnzr0iD9zAgZx4RwVt0tmlxKuHPAD28xLplY6gBOEXyiSJSqajFwCU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EXc2sdfO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EXc2sdfO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EA680C4CEC4; Mon, 16 Sep 2024 22:49:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726526981; bh=FNDnC4NnSKXZi0fBd7+r+3GeRTH7g/FrYIGmJ7rL3+g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EXc2sdfOE6qiBM9xDTexN8GiPSpGHxEhcLHvbtvwkQynNgQBg+c+xqiq+NSFLFt48 b989d78UnoKKgI+TpgHG/reZoFCMXh2hrA18ZprVjpUGns34Esx1QQp6qKjw4SL60A xpnWZp40LlmxGl2u1LLm5qzQDN755Q9QS4uoE1kFihbA4Pt2esTWb6nRmWuQI7IQTk iBqcJl49hTysgS7LRJElQUs3s+Z6+l3ZCW8Ef5xaZJKfJgyLaRcJu46HNaRxnPo9ms xpSIJoJcI4pk68PN7R0Eo0CUSdp2j8jwrIcpi7pds+9q42TpkSVWH8mW2W/Wxuy3Mg lt6eA15iUNSaQ== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Dinh Nguyen , Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 03/19] firmware: stratix10-svc: Use kthread_run_on_cpu() Date: Tue, 17 Sep 2024 00:49:07 +0200 Message-ID: <20240916224925.20540-4-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the proper API instead of open coding it. Signed-off-by: Frederic Weisbecker --- drivers/firmware/stratix10-svc.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/drivers/firmware/stratix10-svc.c b/drivers/firmware/stratix10-= svc.c index 528f37417aea..4cf5bd5647a4 100644 --- a/drivers/firmware/stratix10-svc.c +++ b/drivers/firmware/stratix10-svc.c @@ -967,18 +967,15 @@ int stratix10_svc_send(struct stratix10_svc_chan *cha= n, void *msg) /* first client will create kernel thread */ if (!chan->ctrl->task) { chan->ctrl->task =3D - kthread_create_on_node(svc_normal_to_secure_thread, - (void *)chan->ctrl, - cpu_to_node(cpu), - "svc_smc_hvc_thread"); + kthread_run_on_cpu(svc_normal_to_secure_thread, + (void *)chan->ctrl, + cpu, "svc_smc_hvc_thread"); if (IS_ERR(chan->ctrl->task)) { dev_err(chan->ctrl->dev, "failed to create svc_smc_hvc_thread\n"); kfree(p_data); return -EINVAL; } - kthread_bind(chan->ctrl->task, cpu); - wake_up_process(chan->ctrl->task); } =20 pr_debug("%s: sent P-va=3D%p, P-com=3D%x, P-size=3D%u\n", __func__, --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31A4816A949; Mon, 16 Sep 2024 22:49:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526985; cv=none; b=k/cTj8cLcjoAYrr6+GohIP7HrBjM0a9AaeTEfDT5b0l1XOfWd1UWlW8lOWVNNG3titPW/7Q4cYwTCcqIZrwhQ3hwPB3vvx+nmfFpqSoIJhSrjDasgPXLMX90RFuq+GEytAIMTnJIzTSI95NYpXDqI26jRUrlWtV5qdv5mjr0SuQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526985; c=relaxed/simple; bh=cdyOFZ56rRxPsoxfyH8Hg6jYWPKMlf0Eg+/EbRKiEBw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NszvkMcyC6mGpe+jCSOolX/r1tgL0yxXeYNmXadXL78HfMSciJM4jafM2G+lbr484VZv4KD3wKJJno9jO99s4L7pC1pc1iJ44Vp+19CasJ9m+ovc/PeeA9EeSTWJaXT5Iop4UblE0DNXqYKgTPJjhvrkecNWuzupzLhh4PwMLvg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jhbkAqjU; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jhbkAqjU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0FE7FC4CECD; Mon, 16 Sep 2024 22:49:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726526984; bh=cdyOFZ56rRxPsoxfyH8Hg6jYWPKMlf0Eg+/EbRKiEBw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jhbkAqjUCBfYUyFOBkoUh/V1dg7EhwkBohNbuqnZxRC04cARGGh+oA+I97cuaxJBd pUt/n3YlqvIQouasX0w1k8sPdVAp8uNwAnFzR+apwXU0Jv5GTmsn8rfq7Hl6PU8nQk cjUaPEm5AOTJpojnHFmdi04cyw/K6z8YsOutDxVVAmO9erNlQO2SfZLY2d1LMAa0bk OpAiE70Mj0njik3Oqc3LKSU9dH3Ig/uovJNaJeP9+l92PJycuyQv0EG9NqOxiDFZOs EKyFHoaOVu3nOuIcfGdiBw3586YG3Oa5iHrm4aKYXRgaql9+5aFlyCVw2SvNDmxdwG O0/VSFL3hxXTQ== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Saurav Kashyap , Javed Hasan , GR-QLogic-Storage-Upstream@marvell.com, "James E.J. Bottomley" , "Martin K. Petersen" , linux-scsi@vger.kernel.org, Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 04/19] scsi: bnx2fc: Use kthread_create_on_cpu() Date: Tue, 17 Sep 2024 00:49:08 +0200 Message-ID: <20240916224925.20540-5-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the proper API instead of open coding it. However it looks like bnx2fc_percpu_io_thread() kthread could be replaced by the use of a high prio workqueue instead. Signed-off-by: Frederic Weisbecker --- drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc= _fcoe.c index 1078c20c5ef6..789c155b939d 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c @@ -2610,14 +2610,11 @@ static int bnx2fc_cpu_online(unsigned int cpu) =20 p =3D &per_cpu(bnx2fc_percpu, cpu); =20 - thread =3D kthread_create_on_node(bnx2fc_percpu_io_thread, - (void *)p, cpu_to_node(cpu), - "bnx2fc_thread/%d", cpu); + thread =3D kthread_create_on_cpu(bnx2fc_percpu_io_thread, + (void *)p, cpu, "bnx2fc_thread/%d"); if (IS_ERR(thread)) return PTR_ERR(thread); =20 - /* bind thread to the cpu */ - kthread_bind(thread, cpu); p->iothread =3D thread; wake_up_process(thread); return 0; --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E919F171E76; Mon, 16 Sep 2024 22:49:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526988; cv=none; b=gx6NXzChn3KlpmHuFHY+vtjn28hie4SKEBStwH2b05q5WhGn4ajzleZMTISCjiKSC+TWjUVnB4+QdGi+sM0udSrfQNw7FxyaJp7DnRdZanuMVZe5mB1GwNG9JeR3qpw7YAvCjrT/H6EVKI7/4GGj2oJ+BcEQrtAvpu1dC2LjvX0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526988; c=relaxed/simple; bh=LFXpL5/nrAXstPiOj0IbxTit69TGzKOpoS47R1I/bUE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tY5Qw/QFRR0ywHChQQvbEdTA83XXXPafjCNJwCk7VfO0G1gPZrDtLd1c2yQfEfjfydsuF5ZnuVaK9mGMs854ZNf3tqDJIFWPNsHTNkPPDINFg46JB8x/f2m5ZD5ermiGk/4yKIMqhm3SMdVEUG7aw/U6UJ0HOKo0aAIdUwMBwrQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uRQdGMs9; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uRQdGMs9" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 37984C4CEC5; Mon, 16 Sep 2024 22:49:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726526987; bh=LFXpL5/nrAXstPiOj0IbxTit69TGzKOpoS47R1I/bUE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uRQdGMs9El42oHS8FlP1L+Cffh1xjv7mPFiZD1wzTaJP4YYNUWyWan2aBB203A0CU 8mvvOCVFHgJ1c6E7swTlTbR9QEIg+oSvO6rKMqsPtiNKgJPEaC7IsLEWvjE4H6YoRe pILtCpvgvt6snr9/Eg4V8QvfoAnp0BZbuXfu7SmTRQgyM9nTHz/MrfzcfnIS0IFM2w 57XrqndQn8CJCw1RXzOZ459Avbfce6iivA3fzJF4EYqDRvB8CQw89RUl38BIkPrnDC rMikcDonK2+BEhcSWIOu/QW29rlgwnJVLPYM9VzDVHtJE2AIoi1ycWgVpmiaRvB08O DwZVRAsmYTtoQ== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Nilesh Javali , Manish Rangankar , GR-QLogic-Storage-Upstream@marvell.com, "James E.J. Bottomley" , "Martin K. Petersen" , linux-scsi@vger.kernel.org, Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 05/19] scsi: bnx2i: Use kthread_create_on_cpu() Date: Tue, 17 Sep 2024 00:49:09 +0200 Message-ID: <20240916224925.20540-6-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the proper API instead of open coding it. However it looks like bnx2i_percpu_io_thread() kthread could be replaced by the use of a high prio workqueue instead. Signed-off-by: Frederic Weisbecker --- drivers/scsi/bnx2i/bnx2i_init.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/scsi/bnx2i/bnx2i_init.c b/drivers/scsi/bnx2i/bnx2i_ini= t.c index 872ad37e2a6e..cecc3a026762 100644 --- a/drivers/scsi/bnx2i/bnx2i_init.c +++ b/drivers/scsi/bnx2i/bnx2i_init.c @@ -415,14 +415,11 @@ static int bnx2i_cpu_online(unsigned int cpu) =20 p =3D &per_cpu(bnx2i_percpu, cpu); =20 - thread =3D kthread_create_on_node(bnx2i_percpu_io_thread, (void *)p, - cpu_to_node(cpu), - "bnx2i_thread/%d", cpu); + thread =3D kthread_create_on_cpu(bnx2i_percpu_io_thread, (void *)p, + cpu, "bnx2i_thread/%d"); if (IS_ERR(thread)) return PTR_ERR(thread); =20 - /* bind thread to the cpu */ - kthread_bind(thread, cpu); p->iothread =3D thread; wake_up_process(thread); return 0; --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C95C017BEB4; Mon, 16 Sep 2024 22:49:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526990; cv=none; b=BodaQG3Z/Niwh69uOQyog/EMAPtKVW+gY9UMkdM/xhGeuKVYrlGicenTRz+WTiKm0BU/P3dDDM1tLV63LEe5wOP3dgHokPyUfuoLdsXUdTp3DEutPxr/t2n2rgxuKoV2jFEdpy9w15nEE5vYMd7Ixj1hapRagp5rBj37oCn2SJg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526990; c=relaxed/simple; bh=0D4ZBeW2hHDtitqEqj91MoEj//vAjJvVBf06g/Chc4c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X0BvzCQ05UKM86fYuDhKvpf6iifDUZrGEpar0mKO94s7PYlF7OfsYFMNAA3tICC86w6Y75V8TwB677ANQsqXwlFbST8ArrHcGdthRk76YR0rKGxPFOn+5Qmsp3MUONfeXwECQyNbSYgI8EEOkj9/xDqxDZvUYRO7EW8+FC+RqZs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aVngEs9m; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="aVngEs9m" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E9E92C4CECF; Mon, 16 Sep 2024 22:49:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726526990; bh=0D4ZBeW2hHDtitqEqj91MoEj//vAjJvVBf06g/Chc4c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aVngEs9mjRSKnKxtAVgyhhxICPhb5CAkw2hWHpwKNmdU8bVj8bK9Jcu20lJ+MItuG VuxTcl4p3wiFpCijxYql2y4+zq+QFXieYxVYUHDhxsrknoLekqQN7Pf4PYO8+7enQP dcAXEECTj01n6fzSGWm0bRWbzBUQ2SwDYrTdMdWjDTuHytyD6Rl30KO6RCzcFns2lf eFtrgfI3Q5G6jBps5ObVKYA1gZyRLFoelq+mv5akYi6NoK5RaPd6I7bzktqocIQCh4 jESMZu9xwAcz1eZLnFJLT7EV8z/uW2I6h7Dta5MY+u5JjAuDNK02ENPhSum/m/t9bD vOR4J0iF/LVJg== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Nilesh Javali , Manish Rangankar , GR-QLogic-Storage-Upstream@marvell.com, "James E.J. Bottomley" , "Martin K. Petersen" , linux-scsi@vger.kernel.org, Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 06/19] scsi: qedi: Use kthread_create_on_cpu() Date: Tue, 17 Sep 2024 00:49:10 +0200 Message-ID: <20240916224925.20540-7-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the proper API instead of open coding it. However it looks like qedi_percpu_io_thread() kthread could be replaced by the use of a high prio workqueue instead. Signed-off-by: Frederic Weisbecker --- drivers/scsi/qedi/qedi_main.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c index cd0180b1f5b9..f30e27bb2233 100644 --- a/drivers/scsi/qedi/qedi_main.c +++ b/drivers/scsi/qedi/qedi_main.c @@ -1960,13 +1960,11 @@ static int qedi_cpu_online(unsigned int cpu) struct qedi_percpu_s *p =3D this_cpu_ptr(&qedi_percpu); struct task_struct *thread; =20 - thread =3D kthread_create_on_node(qedi_percpu_io_thread, (void *)p, - cpu_to_node(cpu), - "qedi_thread/%d", cpu); + thread =3D kthread_create_on_cpu(qedi_percpu_io_thread, (void *)p, + cpu, "qedi_thread/%d"); if (IS_ERR(thread)) return PTR_ERR(thread); =20 - kthread_bind(thread, cpu); p->iothread =3D thread; wake_up_process(thread); return 0; --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 22031184526 for ; Mon, 16 Sep 2024 22:49:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526993; cv=none; b=plJmsBdsyZwiNzoJ3WPLssBgRYc+RgYCHfAHlTparRVHqVFiaOi+wUyU+PUM3/sfLXnuZmVCvZEKn5OFcIEkOH0l0aNr8LdJLZS70QyrgVG/HlUrTSfDPzzX9v2halNzN6QDOTSwaeFXTgVEW5om2IWJbJV9MEJPH1Qva2kA2Pk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526993; c=relaxed/simple; bh=bRL09e91cC7LQEEs/ysPp5d5gcrpXYKGy36AOC6GrXg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KHSaAhYuEHYK8of6h5nAqxniVIkdK7YF1U637OFYMLrvLLyLx79vzFQQ0O/UxiSFRHAKph4VOAsqzLdeXVKRPNmuZEkJutF6tze4YBzy4RYZpdXN578v7BHWybukZmCHGqKBNGThoTK33M7i+Wl+o2VRSBZogtZs2o1EYt+bdzk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=a1Xe10Sj; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="a1Xe10Sj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D31DFC4CEC4; Mon, 16 Sep 2024 22:49:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726526992; bh=bRL09e91cC7LQEEs/ysPp5d5gcrpXYKGy36AOC6GrXg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=a1Xe10SjRDFp1Tnjo4rEV1qSSh5I/fFYmkJvMjVN/tBBFXbHuDqfW2ZKpbL9bTGkv U7tz8C47kArBx6KohU4yk94kVLrNEyfFFoMtu3sI1rGeB601xnuvrdFUb86o5jzxaw pXK9Bd6V1qDtIWeD9jqJCTq9qnaq9XQo//DpeB/mhKF+NNXs+gr/abL/4fyQmiGxSq mF4B31rqHLk0PajC+YeepD7dpn398dZY0XD8DZ9EJZmJhGVNOybAq569O4+8DOqx4+ 6VPjKNaq3VbbLRUMck9HsrMHITLQNGh6AadX2R8FQiIm+M39JtECZI8lyhca0jGq8O B0iU4+iN5HyLQ== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , linuxppc-dev@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 07/19] soc/qman: test: Use kthread_run_on_cpu() Date: Tue, 17 Sep 2024 00:49:11 +0200 Message-ID: <20240916224925.20540-8-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the proper API instead of open coding it. However it looks like kthreads here could be replaced by the use of a per-cpu workqueue instead. Signed-off-by: Frederic Weisbecker --- drivers/soc/fsl/qbman/qman_test_stash.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/soc/fsl/qbman/qman_test_stash.c b/drivers/soc/fsl/qbma= n/qman_test_stash.c index b7e8e5ec884c..f4d3c2146f4f 100644 --- a/drivers/soc/fsl/qbman/qman_test_stash.c +++ b/drivers/soc/fsl/qbman/qman_test_stash.c @@ -108,14 +108,12 @@ static int on_all_cpus(int (*fn)(void)) .fn =3D fn, .started =3D ATOMIC_INIT(0) }; - struct task_struct *k =3D kthread_create(bstrap_fn, &bstrap, - "hotpotato%d", cpu); + struct task_struct *k =3D kthread_run_on_cpu(bstrap_fn, &bstrap, + cpu, "hotpotato%d"); int ret; =20 if (IS_ERR(k)) return -ENOMEM; - kthread_bind(k, cpu); - wake_up_process(k); /* * If we call kthread_stop() before the "wake up" has had an * effect, then the thread may exit with -EINTR without ever --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EEA29187348 for ; Mon, 16 Sep 2024 22:49:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526995; cv=none; b=iRDT6eDMiOk80TwxDPF7bjnys0XSo9j3Zsmn9caoJAFuHnrs+/DnIRmo+nqDjxxjoIWhYlGLYEi3UU40yrjexZNvEtwVFcx97WBO/hk+FWjMCJlXpQDuVMfhcY5oGcgDTdLU0EyVueOGkbvNywldZ60cG4c9BIlmATcG1sugIYQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526995; c=relaxed/simple; bh=SrPlU9tOI0Lf76otTW5ESwvT98+pgbNcqxervWYqjX4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rPI6SAl1gqXviwzIsndIxx9/tWvC1wqUWAaGrGqpt61C806KKOcADCqW8hWuXulAGlk7rzoPWhRgVO2jP/oY8ZTB0uFzBzXp3HxGCbGBtJ/hqWhkucV54ujVBB7ZRHxjIHjF1wF+tUBso0fmMZQ/pVJoGnZEhzXhgSV6WeNVcP8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HQtkQA6p; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HQtkQA6p" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4DEF3C4CECC; Mon, 16 Sep 2024 22:49:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726526994; bh=SrPlU9tOI0Lf76otTW5ESwvT98+pgbNcqxervWYqjX4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HQtkQA6poUDwgB5xEWIt215FswGm/yvybfI6UR88rN3iXO1gJU5nOMmpV0sn9wVAX 6/vuWFPV+5+JVZpnTnJr1KqkWV4m3v1RuLIXlFoK1IH4znBmGaBFIoH5zMF9HrqAAJ p1mnDM8Inc/2hJq3iX3Vg03GY+iJpWJfqf0RgpZ21wOrfRv1hrsOu3CDS2EGz89qG7 vYCfrp/PuP+7ArKlOfchOCXqTim9YL8rkak+VwoUVJIft1lhRvUYSXMZ0CA5Clr++Y RV8xbsLwCLeuTh/DjcVOmXoEHdNpRTy1rjR+C/KDGI0g0ToTlTt8pCEOiGyxlDpBM8 NZ3S5DVN17Hyg== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Kees Cook , Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 08/19] kallsyms: Use kthread_run_on_cpu() Date: Tue, 17 Sep 2024 00:49:12 +0200 Message-ID: <20240916224925.20540-9-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the proper API instead of open coding it. Signed-off-by: Frederic Weisbecker --- kernel/kallsyms_selftest.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kernel/kallsyms_selftest.c b/kernel/kallsyms_selftest.c index 873f7c445488..cf4af5728307 100644 --- a/kernel/kallsyms_selftest.c +++ b/kernel/kallsyms_selftest.c @@ -435,13 +435,11 @@ static int __init kallsyms_test_init(void) { struct task_struct *t; =20 - t =3D kthread_create(test_entry, NULL, "kallsyms_test"); + t =3D kthread_run_on_cpu(test_entry, NULL, 0, "kallsyms_test"); if (IS_ERR(t)) { pr_info("Create kallsyms selftest task failed\n"); return PTR_ERR(t); } - kthread_bind(t, 0); - wake_up_process(t); =20 return 0; } --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5FF52188A25 for ; Mon, 16 Sep 2024 22:49:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526998; cv=none; b=cLyJDQxOkYe0/op9Y5N/9JNmWGWpe6nxV5Mj42WVznbUwTPsgxpE/vL3t45x+GOLo3KMyfItHC+OdrKz6TapPKaYTjuKLWvYSJZLWAkbwJGSDrAWTyRgRYl796ap/sCZWDtvie5tiOM1ntItgHrd/YbBLQAKiugJrfM934bDw74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526998; c=relaxed/simple; bh=enUW/S4YDEZ+sWMYpYh7lWNjBrgDbZHgQprFKIrO1Q4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JD4e/0jun8FLGSRQiMFwFV+CyEy9klUbXyvZ2kfTqlMHH/MWowOFWaBtWH7ncnQGOuCw7UK9Cktc1ydSbc7qOIclHnMPHvyv/Y/2BiQhKUybMc4DrNr//u+le2M6ORtD6JjFJIVTiV1hHGSZ8h819gThohh/H1BI7WhY8aXYzu0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Fb+VYvmy; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Fb+VYvmy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 59A09C4CEC4; Mon, 16 Sep 2024 22:49:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726526996; bh=enUW/S4YDEZ+sWMYpYh7lWNjBrgDbZHgQprFKIrO1Q4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Fb+VYvmyhR3W0frVOqdOcDIeAteNDf+9E+56TntWv0yx7pnE8WQqeR7TLTVqDoqzP MMcKuPLeOzOPfKav1ZprRkyR+BPR7ZZEWSsxOdlBnncvdmLaHa7V2s7ns7HH91Ru7q ZpipYpj+Q9E/zl4fkNRxU0BHE6ufuUoTUgOdo+Cm3rT91aD90HcK1dqPZttSpPBHdg zxR+nRGOsWKd4K/9xteKP2or8UB9m1BsDFvSDI7gc04TfqxhbdnZGG2q+TPSECvfcu W3pipW1uBOmpVjFe/pK4DtneoP2KfyD3jSLeLUnj9uHl4eXR6M5B705zbRfrfgkhkJ pN4sgksHtpAfg== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Matt Wu , Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 09/19] lib: test_objpool: Use kthread_run_on_cpu() Date: Tue, 17 Sep 2024 00:49:13 +0200 Message-ID: <20240916224925.20540-10-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the proper API instead of open coding it. Reviewed-by: Matt Wu Signed-off-by: Frederic Weisbecker --- lib/test_objpool.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/lib/test_objpool.c b/lib/test_objpool.c index bfdb81599832..2c09dd91e731 100644 --- a/lib/test_objpool.c +++ b/lib/test_objpool.c @@ -371,14 +371,10 @@ static int ot_start_sync(struct ot_test *test) if (!cpu_online(cpu)) continue; =20 - work =3D kthread_create_on_node(ot_thread_worker, item, - cpu_to_node(cpu), "ot_worker_%d", cpu); - if (IS_ERR(work)) { + work =3D kthread_run_on_cpu(ot_thread_worker, item, + cpu, "ot_worker_%d"); + if (IS_ERR(work)) pr_err("failed to create thread for cpu %d\n", cpu); - } else { - kthread_bind(work, cpu); - wake_up_process(work); - } } =20 /* wait a while to make sure all threads waiting at start line */ @@ -562,14 +558,9 @@ static int ot_start_async(struct ot_test *test) if (!cpu_online(cpu)) continue; =20 - work =3D kthread_create_on_node(ot_thread_worker, item, - cpu_to_node(cpu), "ot_worker_%d", cpu); - if (IS_ERR(work)) { + work =3D kthread_run_on_cpu(ot_thread_worker, item, cpu, "ot_worker_%d"); + if (IS_ERR(work)) pr_err("failed to create thread for cpu %d\n", cpu); - } else { - kthread_bind(work, cpu); - wake_up_process(work); - } } =20 /* wait a while to make sure all threads waiting at start line */ --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9AB361891B9 for ; Mon, 16 Sep 2024 22:49:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526999; cv=none; b=CZlK37fzfXMEGGRF/iVqKtjDnm7khU2hYS5q7+gB12SoqGl307UZMG6QFQjfJQhgYyGKaHXn9l3KyW7Bg3ChZtom5sgGaqSIL8Ks9ra7FdEI0QPrZC5lzL0fuS2pqufIImh6ymnoBIkR5jaH9NRI+hq/0vprkIZxXeEwRLuLpRg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726526999; c=relaxed/simple; bh=p/q0EU8DcqVLYtmwEd+ypSMBsQxYazAACPSnm1FO+Ww=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=i41Ya6c4k/PiuPNDyl7rkKHeC+6f/IEn9gazBoXObEv5zhwTMqiZ2RhiATlzgw+jLGsobFDsP0yytCZZZwzWK/3qxaynbgZv6uxJ/nRokExBCjUdRXFTQMytC1k2MTeq6Zpf0Zms+lHwlaJ6F2JZmpkaL8B7sH/xXqJfPbsOvU4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=k50xj4ss; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="k50xj4ss" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 64843C4CEC5; Mon, 16 Sep 2024 22:49:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726526999; bh=p/q0EU8DcqVLYtmwEd+ypSMBsQxYazAACPSnm1FO+Ww=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=k50xj4sszX/tnOTuGB7qZJzCMkel38bEGF0zMnx4DfiMi7GrPwvVf94CO+zHZfZ/f Dx2bdZukA2MC45mWYoLGjQ2CeQKTuMIkOGqwkvwXQ73CF86QfMOu7jaecRrKtQqMYS MCKYVObv16CTM4ELxHH0NbV86otfW1X3KqoTd/koujbE+O1m51KJ5nxoCLMEfwyH02 DNQjnQymfhY26lMlxYFDuKrKwPiR4Bj15X0Tsm0MUe8ydoJi7BRSTz3yAAIvfPbM+E KbIxKP9J+Quz6qbgU2IFxR8QeMeSp/sXaLjcKQNazgmPC4FX9C6HXwUKLiuvf5QKDL Wmi8Lki5d7Tvg== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 10/19] net: pktgen: Use kthread_create_on_node() Date: Tue, 17 Sep 2024 00:49:14 +0200 Message-ID: <20240916224925.20540-11-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the proper API instead of open coding it. Signed-off-by: Frederic Weisbecker --- net/core/pktgen.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 197a50ef8e2e..4312692c490c 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -3883,17 +3883,14 @@ static int __net_init pktgen_create_thread(int cpu,= struct pktgen_net *pn) list_add_tail(&t->th_list, &pn->pktgen_threads); init_completion(&t->start_done); =20 - p =3D kthread_create_on_node(pktgen_thread_worker, - t, - cpu_to_node(cpu), - "kpktgend_%d", cpu); + p =3D kthread_create_on_cpu(pktgen_thread_worker, t, cpu, "kpktgend_%d"); if (IS_ERR(p)) { pr_err("kthread_create_on_node() failed for cpu %d\n", t->cpu); list_del(&t->th_list); kfree(t); return PTR_ERR(p); } - kthread_bind(p, cpu); + t->tsk =3D p; =20 pe =3D proc_create_data(t->tsk->comm, 0600, pn->proc_dir, --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3D6C914BFBF; Mon, 16 Sep 2024 22:50:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527003; cv=none; b=CjM8Asc8btaNJ6pIpp7kWGpWUy42N4ke5z71GCWH6nwUOPszczjaFE771hEry5H+Mc0lzR3gKLBRD0lP5pE2yrGCvV2xis5VAKSUYeB0mWOIKnnKmhETAxkvqivZ7J/ZhcU/xnRjlDSPFeEZEC/nYAK9QvznSrU5lD5GSxXwZFI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527003; c=relaxed/simple; bh=sbJMoxIqu4qr1nD/+Ksno6FjhK0vmuAI9ZNJjfPGBuI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=krFASRKusHxneAVQXBwlqsz5HFKTk+er0HdULsTZCiTpP2v2DXnCTn3f/pTEeUTtDtxX1Nm3A3Dx0GsPg93J6WBxPMX/zdJ4zdUaalS1hn7ZIR5UcOp1VN5Dha+OSFINUzy2I433IsMr9MqDNRhzjiF7da3wT/JZlqVz75nbZPg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nRLAXb/Q; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nRLAXb/Q" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AAB21C4CECC; Mon, 16 Sep 2024 22:49:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726527002; bh=sbJMoxIqu4qr1nD/+Ksno6FjhK0vmuAI9ZNJjfPGBuI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nRLAXb/Qy6nANXMBkUtDMV6bPI7XGa+ARiNyBck4/MFprVyaKt2CssHmWQE0gtmxt qlPRfGIFG2mKyThl6aB/HQrTcLkSeZg9zwzTm+v+Mu6O8hWpCV7eE4E8xZynKD/kfP bb+OHznYw6umYjFoFjztRzkc89/FWva73yWbEBLrVbnzQFJTKH/0MREoqSs6mRgu5l kifMAWClluK9fMjTGYXhWwaqoLZMZIFN/6dVGbsemJacgbqtar1+tnVjPGavfWjBbQ NmJ+9iSLA6lO2ZCl7l8A3RBTZ9KnPoBWRM5U32Ye3nQSFrmE3pcpLnAeX+OOKQhYQk gWH/sCQ25r2Jg== 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 Subject: [PATCH 11/19] kthread: Make sure kthread hasn't started while binding it Date: Tue, 17 Sep 2024 00:49:15 +0200 Message-ID: <20240916224925.20540-12-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 f7be976ff88a..ecb719f54f7a 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(); =20 + self->started =3D 1; + ret =3D -EINTR; if (!test_bit(KTHREAD_SHOULD_STOP, &self->flags)) { cgroup_kthread_ready(); @@ -540,7 +543,9 @@ static void __kthread_bind(struct task_struct *p, unsig= ned int cpu, unsigned int =20 void kthread_bind_mask(struct task_struct *p, const struct cpumask *mask) { + struct kthread *kthread =3D to_kthread(p); __kthread_bind_mask(p, mask, TASK_UNINTERRUPTIBLE); + WARN_ON_ONCE(kthread->started); } =20 /** @@ -554,7 +559,9 @@ void kthread_bind_mask(struct task_struct *p, const str= uct cpumask *mask) */ void kthread_bind(struct task_struct *p, unsigned int cpu) { + struct kthread *kthread =3D to_kthread(p); __kthread_bind(p, cpu, TASK_UNINTERRUPTIBLE); + WARN_ON_ONCE(kthread->started); } EXPORT_SYMBOL(kthread_bind); =20 --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9BB1116131A; Mon, 16 Sep 2024 22:50:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527006; cv=none; b=eyei1QsRKhnFlzMJhlqiphXn6FIOqvIARMpvLIl+y7nlwifXBjO6hgYap6UNMDhlRUXRewb//bBkaxBwYkNouqo8rczcs55uOGFBMPyx58tpAgNFr5Ctd/FxweXKcMQXLUeI8S2pO2tDfSztS6P4HlWA2hB70ugQFNA6lowmq3Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527006; c=relaxed/simple; bh=JA4X4dy4oru7fCID/2hM1LtEhfcBkOK7fx/W7lIKfx8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nDKbG6s6GIid7wmD7CDWz8CbbwvR/J6VWekMRKFWNgWfhavvwnlOsKGaiCB5H+abPvOpBlykinHu9vHj1sG/Ko7FH0/nSB4/x0/WMXyldD0k28D+9tvyMhDm+l6/nHBqS6AGc5W/3UnX5IAtKYIlTreZTnCiv0s0yReqsDlG5qw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=S51p9HZa; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="S51p9HZa" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 24037C4CEC4; Mon, 16 Sep 2024 22:50:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726527006; bh=JA4X4dy4oru7fCID/2hM1LtEhfcBkOK7fx/W7lIKfx8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S51p9HZantjy015saAGW9URigenWXkheTkQ+MZrSa6aBz+VPUZZarWpliXuXnD5Aj IOY9EKnKwsbADPN7lV1wKNOq4tJ9lMFp4Nr4i4+9oJcmE9VUw35AYwIhFKvRuotS1H Tf7QEYBaqa2Fr1LDmmeyV5/F6xPtuwxspKk6MdK1AqEl6QMyWZ1HV6ZLlmmOqpDX1g LJKaj+MHZWmH/q9Rl/W34No0ub3GpwifhQRetbJ0aQRlKc+fenQ8Wg672Nq0JysVT7 K6j3Rul03wDWD/L4frWL0Us7YuVEXCuNNLbgCT3rSubRIhDJl8eKSc+z72NtYXNs4U LeSlKi31Nc0gQ== 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 Subject: [PATCH 12/19] kthread: Default affine kthread to its preferred NUMA node Date: Tue, 17 Sep 2024 00:49:16 +0200 Message-ID: <20240916224925.20540-13-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Kthreads attached to a preferred NUMA node for their task structure allocation can also be assumed to run preferrably within that same node. A more precise affinity is usually notified by calling kthread_create_on_cpu() or kthread_bind[_mask]() before the first wakeup. For the others, a default affinity to the node is desired and sometimes implemented with more or less success when it comes to deal with hotplug events and nohz_full / CPU Isolation interactions: - kcompactd is affine to its node and handles hotplug but not CPU Isolation - kswapd is affine to its node and ignores hotplug and CPU Isolation - A bunch of drivers create their kthreads on a specific node and don't take care about affining further. Handle that default node affinity preference at the generic level instead, provided a kthread is created on an actual node and doesn't apply any specific affinity such as a given CPU or a custom cpumask to bind to before its first wake-up. This generic handling is aware of CPU hotplug events and CPU isolation such that: * When a housekeeping CPU goes up and is part of the node of a given kthread, it is added to its applied affinity set (and possibly the default last resort online housekeeping set is removed from the set). * When a housekeeping CPU goes down while it was part of the node of a kthread, it is removed from the kthread's applied affinity. The last resort is to affine the kthread to all online housekeeping CPUs. Acked-by: Vlastimil Babka Signed-off-by: Frederic Weisbecker --- include/linux/cpuhotplug.h | 1 + kernel/kthread.c | 120 ++++++++++++++++++++++++++++++++++++- 2 files changed, 120 insertions(+), 1 deletion(-) diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h index 9316c39260e0..89d852538b72 100644 --- a/include/linux/cpuhotplug.h +++ b/include/linux/cpuhotplug.h @@ -240,6 +240,7 @@ enum cpuhp_state { CPUHP_AP_WORKQUEUE_ONLINE, CPUHP_AP_RANDOM_ONLINE, CPUHP_AP_RCUTREE_ONLINE, + CPUHP_AP_KTHREADS_ONLINE, CPUHP_AP_BASE_CACHEINFO_ONLINE, CPUHP_AP_ONLINE_DYN, CPUHP_AP_ONLINE_DYN_END =3D CPUHP_AP_ONLINE_DYN + 40, diff --git a/kernel/kthread.c b/kernel/kthread.c index ecb719f54f7a..eee5925e7725 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -35,6 +35,10 @@ static DEFINE_SPINLOCK(kthread_create_lock); static LIST_HEAD(kthread_create_list); struct task_struct *kthreadd_task; =20 +static struct cpumask kthread_online_mask; +static LIST_HEAD(kthreads_hotplug); +static DEFINE_MUTEX(kthreads_hotplug_lock); + struct kthread_create_info { /* Information passed to kthread() from kthreadd. */ @@ -53,6 +57,7 @@ struct kthread_create_info struct kthread { unsigned long flags; unsigned int cpu; + unsigned int node; int started; int result; int (*threadfn)(void *); @@ -64,6 +69,8 @@ struct kthread { #endif /* To store the full name if task comm is truncated. */ char *full_name; + struct task_struct *task; + struct list_head hotplug_node; }; =20 enum KTHREAD_BITS { @@ -122,8 +129,11 @@ bool set_kthread_struct(struct task_struct *p) =20 init_completion(&kthread->exited); init_completion(&kthread->parked); + INIT_LIST_HEAD(&kthread->hotplug_node); p->vfork_done =3D &kthread->exited; =20 + kthread->task =3D p; + kthread->node =3D tsk_fork_get_node(current); p->worker_private =3D kthread; return true; } @@ -314,6 +324,13 @@ void __noreturn kthread_exit(long result) { struct kthread *kthread =3D to_kthread(current); kthread->result =3D result; + if (!list_empty(&kthread->hotplug_node)) { + mutex_lock(&kthreads_hotplug_lock); + list_del(&kthread->hotplug_node); + /* Make sure the kthread never gets re-affined globally */ + set_cpus_allowed_ptr(current, housekeeping_cpumask(HK_TYPE_KTHREAD)); + mutex_unlock(&kthreads_hotplug_lock); + } do_exit(0); } EXPORT_SYMBOL(kthread_exit); @@ -339,6 +356,45 @@ void __noreturn kthread_complete_and_exit(struct compl= etion *comp, long code) } EXPORT_SYMBOL(kthread_complete_and_exit); =20 +static void kthread_fetch_affinity(struct kthread *k, struct cpumask *mask) +{ + if (k->node =3D=3D NUMA_NO_NODE) { + cpumask_copy(mask, housekeeping_cpumask(HK_TYPE_KTHREAD)); + } else { + /* + * The node cpumask is racy when read from kthread() but: + * - a racing CPU going down won't be present in kthread_online_mask + * - a racing CPU going up will be handled by kthreads_online_cpu() + */ + cpumask_and(mask, cpumask_of_node(k->node), &kthread_online_mask); + cpumask_and(mask, mask, housekeeping_cpumask(HK_TYPE_KTHREAD)); + if (cpumask_empty(mask)) + cpumask_copy(mask, housekeeping_cpumask(HK_TYPE_KTHREAD)); + } +} + +static int kthread_affine_node(void) +{ + struct kthread *kthread =3D to_kthread(current); + cpumask_var_t affinity; + + WARN_ON_ONCE(kthread_is_per_cpu(current)); + + if (!zalloc_cpumask_var(&affinity, GFP_KERNEL)) + return -ENOMEM; + + mutex_lock(&kthreads_hotplug_lock); + WARN_ON_ONCE(!list_empty(&kthread->hotplug_node)); + list_add_tail(&kthread->hotplug_node, &kthreads_hotplug); + kthread_fetch_affinity(kthread, affinity); + set_cpus_allowed_ptr(current, affinity); + mutex_unlock(&kthreads_hotplug_lock); + + free_cpumask_var(affinity); + + return 0; +} + static int kthread(void *_create) { static const struct sched_param param =3D { .sched_priority =3D 0 }; @@ -369,7 +425,6 @@ static int kthread(void *_create) * back to default in case they have been changed. */ sched_setscheduler_nocheck(current, SCHED_NORMAL, ¶m); - set_cpus_allowed_ptr(current, housekeeping_cpumask(HK_TYPE_KTHREAD)); =20 /* OK, tell user we're spawned, wait for stop or wakeup */ __set_current_state(TASK_UNINTERRUPTIBLE); @@ -385,6 +440,9 @@ static int kthread(void *_create) =20 self->started =3D 1; =20 + if (!(current->flags & PF_NO_SETAFFINITY)) + kthread_affine_node(); + ret =3D -EINTR; if (!test_bit(KTHREAD_SHOULD_STOP, &self->flags)) { cgroup_kthread_ready(); @@ -779,6 +837,66 @@ int kthreadd(void *unused) return 0; } =20 +static int kthreads_hotplug_update(void) +{ + cpumask_var_t affinity; + struct kthread *k; + int err; + + if (list_empty(&kthreads_hotplug)) + return 0; + + if (!zalloc_cpumask_var(&affinity, GFP_KERNEL)) + return -ENOMEM; + + err =3D 0; + + list_for_each_entry(k, &kthreads_hotplug, hotplug_node) { + if (WARN_ON_ONCE((k->task->flags & PF_NO_SETAFFINITY) || + kthread_is_per_cpu(k->task))) { + err =3D -EINVAL; + continue; + } + kthread_fetch_affinity(k, affinity); + set_cpus_allowed_ptr(k->task, affinity); + } + + free_cpumask_var(affinity); + + return err; +} + +static int kthreads_offline_cpu(unsigned int cpu) +{ + int ret =3D 0; + + mutex_lock(&kthreads_hotplug_lock); + cpumask_clear_cpu(cpu, &kthread_online_mask); + ret =3D kthreads_hotplug_update(); + mutex_unlock(&kthreads_hotplug_lock); + + return ret; +} + +static int kthreads_online_cpu(unsigned int cpu) +{ + int ret =3D 0; + + mutex_lock(&kthreads_hotplug_lock); + cpumask_set_cpu(cpu, &kthread_online_mask); + ret =3D kthreads_hotplug_update(); + mutex_unlock(&kthreads_hotplug_lock); + + return ret; +} + +static int kthreads_init(void) +{ + return cpuhp_setup_state(CPUHP_AP_KTHREADS_ONLINE, "kthreads:online", + kthreads_online_cpu, kthreads_offline_cpu); +} +early_initcall(kthreads_init); + void __kthread_init_worker(struct kthread_worker *worker, const char *name, struct lock_class_key *key) --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 58DDB166302 for ; Mon, 16 Sep 2024 22:50:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527010; cv=none; b=ghIWVcTO5nON1AEBz6zaPyBHRFDH4yrga4CKCmQT51cnhMzFZXjEuh68Jt2zIJxJwR8aQQ6MXxTDd0xViKIcFf1uPZLP9n7lt6g0kCsTmd2fk0XJLrsfsQBb7rglknB+2py5JN0bXUwO03IY87jk0zXw7BB0GCG8SdUNEC0c2M8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527010; c=relaxed/simple; bh=1dQPDIVHNJsgLLnrV38mW03au9nJKUebQ1/0avtuUj4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=F+6zn94JzYmpNCwNcIe4h2h9+QmpmuvUAdNfFxdzq/9ZOPqiNg+ca/VGGIeVCcsigEgaRKDLRf/ui5zBylh14Mr6UO1noLxjtsQK1QBVM3o0CANFjIB+hDJi8zUxk9DGtGiul2T6Rz9mIiYYqzR6fUafInxIN9AICjA9amnV47w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qhfUIBhA; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qhfUIBhA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DD651C4CEC5; Mon, 16 Sep 2024 22:50:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726527008; bh=1dQPDIVHNJsgLLnrV38mW03au9nJKUebQ1/0avtuUj4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qhfUIBhAeAVryTWFiKasVSqw5MFlegVH7koZBy6i2ei3w5rs8Wnm9dgPRZQY4GDBn 4fl51kEz1frYX0j0VM2HioDgBcg+TJ0VbJNqf7v5DAUecT62MfuIu1iQ9MOXCqtyhz kurDRtRmFVva0mvmG1HVc1GfZrty3Rw+4o7YdbDB/Z0BIzlxsgDu8eBec0XdMRcH8J 7I4B2oDHu940+26pUyy3x2sRof5wlBHNnu1AsPJqoY+hGfQRBpns2jzyH/9Z+OM1yl M60rhPxS4I0t6UkNl5fbahTaUUHYUzC+ZRrQ2o6O7IKYV/JkFERinmCYez1pOlXFAE jeMI4sONDWy7w== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Michal Hocko , Vlastimil Babka , Andrew Morton , linux-mm@kvack.org, Peter Zijlstra , Thomas Gleixner Subject: [PATCH 13/19] mm: Create/affine kcompactd to its preferred node Date: Tue, 17 Sep 2024 00:49:17 +0200 Message-ID: <20240916224925.20540-14-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Kcompactd is dedicated to a specific node. As such it wants to be preferrably affine to it, memory and CPUs-wise. Use the proper kthread API to achieve that. As a bonus it takes care of CPU-hotplug events and CPU-isolation on its behalf. Acked-by: Vlastimil Babka Signed-off-by: Frederic Weisbecker Acked-by: Michal Hocko --- mm/compaction.c | 43 +++---------------------------------------- 1 file changed, 3 insertions(+), 40 deletions(-) diff --git a/mm/compaction.c b/mm/compaction.c index eb95e9b435d0..69742555f2e5 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -3179,15 +3179,9 @@ void wakeup_kcompactd(pg_data_t *pgdat, int order, i= nt highest_zoneidx) static int kcompactd(void *p) { pg_data_t *pgdat =3D (pg_data_t *)p; - struct task_struct *tsk =3D current; long default_timeout =3D msecs_to_jiffies(HPAGE_FRAG_CHECK_INTERVAL_MSEC); long timeout =3D default_timeout; =20 - const struct cpumask *cpumask =3D cpumask_of_node(pgdat->node_id); - - if (!cpumask_empty(cpumask)) - set_cpus_allowed_ptr(tsk, cpumask); - set_freezable(); =20 pgdat->kcompactd_max_order =3D 0; @@ -3258,10 +3252,12 @@ void __meminit kcompactd_run(int nid) if (pgdat->kcompactd) return; =20 - pgdat->kcompactd =3D kthread_run(kcompactd, pgdat, "kcompactd%d", nid); + pgdat->kcompactd =3D kthread_create_on_node(kcompactd, pgdat, nid, "kcomp= actd%d", nid); if (IS_ERR(pgdat->kcompactd)) { pr_err("Failed to start kcompactd on node %d\n", nid); pgdat->kcompactd =3D NULL; + } else { + wake_up_process(pgdat->kcompactd); } } =20 @@ -3279,30 +3275,6 @@ void __meminit kcompactd_stop(int nid) } } =20 -/* - * It's optimal to keep kcompactd on the same CPUs as their memory, but - * not required for correctness. So if the last cpu in a node goes - * away, we get changed to run anywhere: as the first one comes back, - * restore their cpu bindings. - */ -static int kcompactd_cpu_online(unsigned int cpu) -{ - int nid; - - for_each_node_state(nid, N_MEMORY) { - pg_data_t *pgdat =3D NODE_DATA(nid); - const struct cpumask *mask; - - mask =3D cpumask_of_node(pgdat->node_id); - - if (cpumask_any_and(cpu_online_mask, mask) < nr_cpu_ids) - /* One of our CPUs online: restore mask */ - if (pgdat->kcompactd) - set_cpus_allowed_ptr(pgdat->kcompactd, mask); - } - return 0; -} - static int proc_dointvec_minmax_warn_RT_change(const struct ctl_table *tab= le, int write, void *buffer, size_t *lenp, loff_t *ppos) { @@ -3362,15 +3334,6 @@ static struct ctl_table vm_compaction[] =3D { static int __init kcompactd_init(void) { int nid; - int ret; - - ret =3D cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, - "mm/compaction:online", - kcompactd_cpu_online, NULL); - if (ret < 0) { - pr_err("kcompactd: failed to register hotplug callbacks.\n"); - return ret; - } =20 for_each_node_state(nid, N_MEMORY) kcompactd_run(nid); --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6BB2216F858 for ; Mon, 16 Sep 2024 22:50:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527011; cv=none; b=eAjoMg8Mk62hRZ//78svtaEnAuWycerdXxAfINHn0NOUCbaMgf4dlS6ZGs29x+9LuZLl9aGWsaOwBHStcc9xAVlqzr7EZ1DY+8WEcQyYgv2camo/VtcCJSHrwNnK8JSBGNEZpIfG9td4yyTMX1SHFjyDoWcpn8hstZJGfXawVMY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527011; c=relaxed/simple; bh=G//HPzoeqfpZXKC5DLATLC3AcQAMDmNkHz7pJ7brv/M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ZZdMUv9TLsrhHc9m7ceYnJsavhKBqWq8iVBJd2XuxmEFZMFkrOsELjiew3rMtoYSFqg4Gx5FhZvSZ6xJamhl5VuGIMSmsrF0viD09zoDLxD+hxbFzy1C0btIOYvC0Vx9NX8IPRD9KSWw/XhtJjYEXV5OBfkg9OKWTX/AB2ydv9Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HEoC805W; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HEoC805W" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 41614C4CECF; Mon, 16 Sep 2024 22:50:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726527011; bh=G//HPzoeqfpZXKC5DLATLC3AcQAMDmNkHz7pJ7brv/M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HEoC805WXjqBDwxV7eq88XdBPgl/1Aao31aSAp9FLezKIHwvZEL3AKGDJ2vy2zjPT lu51to/xU4m9d8gbzURHBNR24ECfrEl6uPBmhAJ8jiIDQK6w9NuMBoL94o6vkxVAyZ a3Ik8JPEZ2YjOM7fC6rW1Gn27PvEH20ANr9DG/djdGmNPpSkgU262JHq4F476uw6zI 5nzOvJiviekib1ZPhByMT/8Kfz2tOlRfJQSIl62ae/YQ+wohPmqzbee9Ih/c8ihaAI MFXNtAjBEI29GG7vYZEbn4d0evySHTlPDGNYaPXXUry2Ey1hQBT+GWGyp3fI29MXYm KYkRAwyfS2m2Q== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Michal Hocko , Vlastimil Babka , linux-mm@kvack.org, Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 14/19] mm: Create/affine kswapd to its preferred node Date: Tue, 17 Sep 2024 00:49:18 +0200 Message-ID: <20240916224925.20540-15-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable kswapd is dedicated to a specific node. As such it wants to be preferrably affine to it, memory and CPUs-wise. Use the proper kthread API to achieve that. As a bonus it takes care of CPU-hotplug events and CPU-isolation on its behalf. Acked-by: Vlastimil Babka Signed-off-by: Frederic Weisbecker Acked-by: Michal Hocko --- mm/vmscan.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index bd489c1af228..00a7f1e92447 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -7139,10 +7139,6 @@ static int kswapd(void *p) unsigned int highest_zoneidx =3D MAX_NR_ZONES - 1; pg_data_t *pgdat =3D (pg_data_t *)p; struct task_struct *tsk =3D current; - const struct cpumask *cpumask =3D cpumask_of_node(pgdat->node_id); - - if (!cpumask_empty(cpumask)) - set_cpus_allowed_ptr(tsk, cpumask); =20 /* * Tell the memory management that we're a "memory allocator", @@ -7311,13 +7307,15 @@ void __meminit kswapd_run(int nid) =20 pgdat_kswapd_lock(pgdat); if (!pgdat->kswapd) { - pgdat->kswapd =3D kthread_run(kswapd, pgdat, "kswapd%d", nid); + pgdat->kswapd =3D kthread_create_on_node(kswapd, pgdat, nid, "kswapd%d",= nid); if (IS_ERR(pgdat->kswapd)) { /* failure at boot is fatal */ pr_err("Failed to start kswapd on node %d=EF=BC=8Cret=3D%ld\n", nid, PTR_ERR(pgdat->kswapd)); BUG_ON(system_state < SYSTEM_RUNNING); pgdat->kswapd =3D NULL; + } else { + wake_up_process(pgdat->kswapd); } } pgdat_kswapd_unlock(pgdat); --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B8DA2165F1F; Mon, 16 Sep 2024 22:50:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527015; cv=none; b=aVHsHqOxTBDrjHlaJs9p8pZ+E1kroLHxvXZzpEXSDGiw6goH/2QKPohtPKNCPOD7w2md0rOmi1TcPesH46keZ9/xYEPqgq7qNJtEpHUm079/qzsp6467bWPdmsCfOYZFRRtf80vzKkXmDOilRs78DKvlRERcPsB63ZYbDG//Wlg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527015; c=relaxed/simple; bh=P7lEwaOzaXjSDSuqvPYP44l3AVedPSv4yEdx2INBc1w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=H2hVz2/9QGvsVN7ucI7bS1T/ENnyUZ/m+tI1Qh15Oi6kvYxJNVryme1pBV0DYf5J1XS3xei2CltBW76iDid2QeEXpWLpiMsb5EiDqZ6BoZ9HWyZBurat182F2blDPtRYGSaR+7LXQqSxAnECAuQy6eiQjtsQDWgCDs+mToDx4Ms= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bTMAEhtm; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bTMAEhtm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EFFBCC4CECF; Mon, 16 Sep 2024 22:50:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726527015; bh=P7lEwaOzaXjSDSuqvPYP44l3AVedPSv4yEdx2INBc1w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bTMAEhtmDWTkAFtjFel6YnKlcx7X0ChO155prgrysl4heaF1ThwtNHRBhS4FO/DMM Ux5mxG2+CwHUJikekDXLAo4L4K4bNG9uz7jITDTDSvgK2DxUPM0fo2+DEZfAouY9ER dilkbmfRl7MYxnJMDZ11VXPlKYkkalgBDZV6bZnjDvFwiTujQapfYK51U/C0ShCdW1 lx8J950jAJ+ntD//LV9vqIGtJdqw6YAFUc/xD6iR00Zgh8IUPefYuxyXgEYBIznB3j O5+kRWjvVyhwf2J8vpIrrvV4C9Dky08LtfS9rNk4jcM3laxTPz7u9Qr8g0dJkvNEOY MJ7YO6yx3PMcA== 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 Subject: [PATCH 15/19] kthread: Implement preferred affinity Date: Tue, 17 Sep 2024 00:49:19 +0200 Message-ID: <20240916224925.20540-16-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Affining kthreads follow either of four existing different patterns: 1) Per-CPU kthreads must stay affine to a single CPU and never execute relevant code on any other CPU. This is currently handled by smpboot code which takes care of CPU-hotplug operations. 2) Kthreads that _have_ to be affine to a specific set of CPUs and can't run anywhere else. The affinity is set through kthread_bind_mask() and the subsystem takes care by itself to handle CPU-hotplug operations. 3) Kthreads that prefer to be affine to a specific NUMA node. That preferred affinity is applied by default when an actual node ID is passed on kthread creation, provided the kthread is not per-CPU and no call to kthread_bind_mask() has been issued before the first wake-up. 4) Similar to the previous point but kthreads have a preferred affinity different than a node. It is set manually like any other task and CPU-hotplug is supposed to be handled by the relevant subsystem so that the task is properly reaffined whenever a given CPU from the preferred affinity comes up or down. Also care must be taken so that the preferred affinity doesn't cross housekeeping cpumask boundaries. Provide a function to handle the last usecase, mostly reusing the current node default affinity infrastructure. kthread_affine_preferred() is introduced, to be used just like kthread_bind_mask(), right after kthread creation and before the first wake up. The kthread is then affine right away to the cpumask passed through the API if it has online housekeeping CPUs. Otherwise it will be affine to all online housekeeping CPUs as a last resort. As with node affinity, it is aware of CPU hotplug events such that: * When a housekeeping CPU goes up and is part of the preferred affinity of a given kthread, it is added to its applied affinity set (and possibly the default last resort online housekeeping set is removed from the set). * When a housekeeping CPU goes down while it was part of the preferred affinity of a kthread, it is removed from the kthread's applied affinity. The last resort is to affine the kthread to all online housekeeping CPUs. Acked-by: Vlastimil Babka Signed-off-by: Frederic Weisbecker --- include/linux/kthread.h | 1 + kernel/kthread.c | 69 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/include/linux/kthread.h b/include/linux/kthread.h index b11f53c1ba2e..30209bdf83a2 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h @@ -85,6 +85,7 @@ kthread_run_on_cpu(int (*threadfn)(void *data), void *dat= a, void free_kthread_struct(struct task_struct *k); void kthread_bind(struct task_struct *k, unsigned int cpu); void kthread_bind_mask(struct task_struct *k, const struct cpumask *mask); +int kthread_affine_preferred(struct task_struct *p, const struct cpumask *= mask); int kthread_stop(struct task_struct *k); int kthread_stop_put(struct task_struct *k); bool kthread_should_stop(void); diff --git a/kernel/kthread.c b/kernel/kthread.c index eee5925e7725..e4ffc776928a 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -71,6 +71,7 @@ struct kthread { char *full_name; struct task_struct *task; struct list_head hotplug_node; + struct cpumask *preferred_affinity; }; =20 enum KTHREAD_BITS { @@ -330,6 +331,11 @@ void __noreturn kthread_exit(long result) /* Make sure the kthread never gets re-affined globally */ set_cpus_allowed_ptr(current, housekeeping_cpumask(HK_TYPE_KTHREAD)); mutex_unlock(&kthreads_hotplug_lock); + + if (kthread->preferred_affinity) { + kfree(kthread->preferred_affinity); + kthread->preferred_affinity =3D NULL; + } } do_exit(0); } @@ -358,19 +364,25 @@ EXPORT_SYMBOL(kthread_complete_and_exit); =20 static void kthread_fetch_affinity(struct kthread *k, struct cpumask *mask) { - if (k->node =3D=3D NUMA_NO_NODE) { - cpumask_copy(mask, housekeeping_cpumask(HK_TYPE_KTHREAD)); - } else { + const struct cpumask *pref; + + if (k->preferred_affinity) { + pref =3D k->preferred_affinity; + } else if (k->node !=3D NUMA_NO_NODE) { /* * The node cpumask is racy when read from kthread() but: * - a racing CPU going down won't be present in kthread_online_mask * - a racing CPU going up will be handled by kthreads_online_cpu() */ - cpumask_and(mask, cpumask_of_node(k->node), &kthread_online_mask); - cpumask_and(mask, mask, housekeeping_cpumask(HK_TYPE_KTHREAD)); - if (cpumask_empty(mask)) - cpumask_copy(mask, housekeeping_cpumask(HK_TYPE_KTHREAD)); + pref =3D cpumask_of_node(k->node); + } else { + pref =3D housekeeping_cpumask(HK_TYPE_KTHREAD); } + + cpumask_and(mask, pref, &kthread_online_mask); + cpumask_and(mask, mask, housekeeping_cpumask(HK_TYPE_KTHREAD)); + if (cpumask_empty(mask)) + cpumask_copy(mask, housekeeping_cpumask(HK_TYPE_KTHREAD)); } =20 static int kthread_affine_node(void) @@ -440,7 +452,7 @@ static int kthread(void *_create) =20 self->started =3D 1; =20 - if (!(current->flags & PF_NO_SETAFFINITY)) + if (!(current->flags & PF_NO_SETAFFINITY) && !self->preferred_affinity) kthread_affine_node(); =20 ret =3D -EINTR; @@ -837,6 +849,47 @@ int kthreadd(void *unused) return 0; } =20 +int kthread_affine_preferred(struct task_struct *p, const struct cpumask *= mask) +{ + struct kthread *kthread =3D to_kthread(p); + cpumask_var_t affinity; + unsigned long flags; + int ret; + + if (!wait_task_inactive(p, TASK_UNINTERRUPTIBLE) || kthread->started) { + WARN_ON(1); + return -EINVAL; + } + + WARN_ON_ONCE(kthread->preferred_affinity); + + if (!zalloc_cpumask_var(&affinity, GFP_KERNEL)) + return -ENOMEM; + + kthread->preferred_affinity =3D kzalloc(sizeof(struct cpumask), GFP_KERNE= L); + if (!kthread->preferred_affinity) { + ret =3D -ENOMEM; + goto out; + } + + mutex_lock(&kthreads_hotplug_lock); + cpumask_copy(kthread->preferred_affinity, mask); + WARN_ON_ONCE(!list_empty(&kthread->hotplug_node)); + list_add_tail(&kthread->hotplug_node, &kthreads_hotplug); + kthread_fetch_affinity(kthread, affinity); + + /* It's safe because the task is inactive. */ + raw_spin_lock_irqsave(&p->pi_lock, flags); + do_set_cpus_allowed(p, affinity); + raw_spin_unlock_irqrestore(&p->pi_lock, flags); + + mutex_unlock(&kthreads_hotplug_lock); +out: + free_cpumask_var(affinity); + + return 0; +} + static int kthreads_hotplug_update(void) { cpumask_var_t affinity; --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BD97F185941; Mon, 16 Sep 2024 22:50:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527018; cv=none; b=j6paS4czn7c6lwaOiLOOpAkfQ1QILrSegzug5Tqc6B19fwdsn/IgcsTrNdWlXHpJiXPzhIQHWwe1BoGwxT6Qpo7BPSn3UyLp1He+h7GVvPfNsPCAfFMLb6ExBCmVyNrn8Q5pWfRO2G2nApiS5//6clIcIwJ8WH0am6/DWN0EYYg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527018; c=relaxed/simple; bh=Mw6IdpbwGLq1RISXT+d8VcHFgzrRy+Z/Ckwqp68TP0c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ocSxVQl61NBUYfYIQNGpfuFgwzLQjjRo93C2REyDQFPZaxjQOCma6U5ix8snfZejnkjojxHkHiEg8+/S0V/HK6ZP1FnMjuZ3L6tSajoL+hxjtYtE1hWBDmi0HaE9sMXhbABW3t7Sa5Lu25CwPwMrdG8dnSe1Dpfaze/A8pZtYJM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=epHXqqz3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="epHXqqz3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DE484C4CEC4; Mon, 16 Sep 2024 22:50:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726527018; bh=Mw6IdpbwGLq1RISXT+d8VcHFgzrRy+Z/Ckwqp68TP0c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=epHXqqz3P/8BrDKsd/3NALffjMH7oqmeWMYk5NcM1tn2JN//nXg+2TkkO6JXQG3Q6 12OSX0iDWf2a1QXRS1qpqqR8fvvESIfKXuJlszihEIp7qsefH3D9RTAc42LprUnH/i e9hLDio74cgQ4vpkQ/WfNC2DODkmDU00VUkmtukGRUd0pEShoG+s0YDn6MciALD6dG Jd4qR2VlASNdZ2uzTktkkX0NNEZaPFOcj1ahcelpV4PW4jfSf8bqzdZmXP0GquQ3xu OVvoslSnYnPokqXlhV1l4wzvF5pHKp59J0MRC9RIK0o6mGBt2qo/g2GyLncO0/PaND 9XEws5sgcDHcQ== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , "Paul E. McKenney" , Neeraj Upadhyay , Joel Fernandes , Boqun Feng , Zqiang , rcu@vger.kernel.org, Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 16/19] rcu: Use kthread preferred affinity for RCU boost Date: Tue, 17 Sep 2024 00:49:20 +0200 Message-ID: <20240916224925.20540-17-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that kthreads have an infrastructure to handle preferred affinity against CPU hotplug and housekeeping cpumask, convert RCU boost to use it instead of handling all the constraints by itself. Acked-by: Paul E. McKenney Signed-off-by: Frederic Weisbecker --- kernel/rcu/tree.c | 27 +++++++++++++++++++-------- kernel/rcu/tree_plugin.h | 11 ++--------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index e641cc681901..945e196090ed 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -149,7 +149,6 @@ static int rcu_scheduler_fully_active __read_mostly; =20 static void rcu_report_qs_rnp(unsigned long mask, struct rcu_node *rnp, unsigned long gps, unsigned long flags); -static struct task_struct *rcu_boost_task(struct rcu_node *rnp); static void invoke_rcu_core(void); static void rcu_report_exp_rdp(struct rcu_data *rdp); static void sync_sched_exp_online_cleanup(int cpu); @@ -4932,6 +4931,22 @@ int rcutree_prepare_cpu(unsigned int cpu) return 0; } =20 +static void rcu_thread_affine_rnp(struct task_struct *t, struct rcu_node *= rnp) +{ + cpumask_var_t affinity; + int cpu; + + if (!zalloc_cpumask_var(&affinity, GFP_KERNEL)) + return; + + for_each_leaf_node_possible_cpu(rnp, cpu) + cpumask_set_cpu(cpu, affinity); + + kthread_affine_preferred(t, affinity); + + free_cpumask_var(affinity); +} + /* * Update kthreads affinity during CPU-hotplug changes. * @@ -4951,19 +4966,18 @@ static void rcutree_affinity_setting(unsigned int c= pu, int outgoingcpu) unsigned long mask; struct rcu_data *rdp; struct rcu_node *rnp; - struct task_struct *task_boost, *task_exp; + struct task_struct *task_exp; =20 rdp =3D per_cpu_ptr(&rcu_data, cpu); rnp =3D rdp->mynode; =20 - task_boost =3D rcu_boost_task(rnp); task_exp =3D rcu_exp_par_gp_task(rnp); =20 /* - * If CPU is the boot one, those tasks are created later from early + * If CPU is the boot one, this task is created later from early * initcall since kthreadd must be created first. */ - if (!task_boost && !task_exp) + if (!task_exp) return; =20 if (!zalloc_cpumask_var(&cm, GFP_KERNEL)) @@ -4985,9 +4999,6 @@ static void rcutree_affinity_setting(unsigned int cpu= , int outgoingcpu) if (task_exp) set_cpus_allowed_ptr(task_exp, cm); =20 - if (task_boost) - set_cpus_allowed_ptr(task_boost, cm); - mutex_unlock(&rnp->kthread_mutex); =20 free_cpumask_var(cm); diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h index c569da65b421..d1ff1b982ca2 100644 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h @@ -1216,16 +1216,13 @@ static void rcu_spawn_one_boost_kthread(struct rcu_= node *rnp) raw_spin_lock_irqsave_rcu_node(rnp, flags); rnp->boost_kthread_task =3D t; raw_spin_unlock_irqrestore_rcu_node(rnp, flags); + sp.sched_priority =3D kthread_prio; sched_setscheduler_nocheck(t, SCHED_FIFO, &sp); + rcu_thread_affine_rnp(t, rnp); wake_up_process(t); /* get to TASK_INTERRUPTIBLE quickly. */ } =20 -static struct task_struct *rcu_boost_task(struct rcu_node *rnp) -{ - return READ_ONCE(rnp->boost_kthread_task); -} - #else /* #ifdef CONFIG_RCU_BOOST */ =20 static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags) @@ -1242,10 +1239,6 @@ static void rcu_spawn_one_boost_kthread(struct rcu_n= ode *rnp) { } =20 -static struct task_struct *rcu_boost_task(struct rcu_node *rnp) -{ - return NULL; -} #endif /* #else #ifdef CONFIG_RCU_BOOST */ =20 /* --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8B58018D655; Mon, 16 Sep 2024 22:50:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527021; cv=none; b=iGHZAUkNXaf7N/K4/hLkEDwpW77kLaYFa6ujo36p/48myhqMpXF8yF5fWKEybXkwciJJMOP+7pRxsjMp7JIn73mIhOw5yb0IF59icrEb0gJzUqOSdvP829vWS7TFI4rAQCOGGfl/mwFrGFjPCHV1SQrF9Q7+zqrBKEcbSyOX5/w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527021; c=relaxed/simple; bh=Vfa2GQMSMJUkmFWiPT3a5KnUx1bqXLZVJSQpLVlSik0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=olikNfWA/cckwA7Na0yuvNIlbO5h0hENIJc3aRTSiQ8l5d2sCXfM4Aug5MgnfzpfS5SDi9Y18n86BG7ynzjMtZfBvt3Z177NEre+w+cssd3guXUePhqDuZ3H1nbZEZp1zDGLz0rc0gDiYVE2sdkprYsnRfsPstw4qjiaWBT4v8I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CkT3XC2a; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CkT3XC2a" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CACF6C4CECD; Mon, 16 Sep 2024 22:50:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726527021; bh=Vfa2GQMSMJUkmFWiPT3a5KnUx1bqXLZVJSQpLVlSik0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CkT3XC2aDM8dZXNsSA/mdW3gx0rZpBkyblHn11XfCEJCX2n2TUpVdM6GTQSsFnNqs 68gfdCNxUivKQeTf4LsD3IyxC2HkijooqjGR7Tix3GrgzmN0z7P73ocy5VIMAVUgyD ZSCdAljCW0v7HVqQzjLNbtuDNuhbl3L7nIXJe+LM/z/OUEPweQjtFTW0VHh+pqCtrE 23rwtBFFr7VzPwryNgsaSx5h0DQJgLlPvjSn2EdRdRvMO2wGg6vyBoVQJn2PtXatFX AaJtcp8V1ur1jr/xZoCVYbBA55pcOb5iwisYAtBlckoYkcmWMLzNI/wFnGhraXF0KL hwQJBkHul5p9w== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , "Paul E. McKenney" , Neeraj Upadhyay , Joel Fernandes , Boqun Feng , Zqiang , rcu@vger.kernel.org, Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 17/19] kthread: Unify kthread_create_on_cpu() and kthread_create_worker_on_cpu() automatic format Date: Tue, 17 Sep 2024 00:49:21 +0200 Message-ID: <20240916224925.20540-18-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" kthread_create_on_cpu() uses the CPU argument as an implicit and unique printf argument to add to the format whereas kthread_create_worker_on_cpu() still relies on explicitly passing the printf arguments. This difference in behaviour is error prone and doesn't help standardizing per-CPU kthread names. Unify the behaviours and convert kthread_create_worker_on_cpu() to use the printf behaviour of kthread_create_on_cpu(). Signed-off-by: Frederic Weisbecker --- fs/erofs/zdata.c | 2 +- include/linux/kthread.h | 21 +++++++++++---- kernel/kthread.c | 59 ++++++++++++++++++++++++----------------- 3 files changed, 52 insertions(+), 30 deletions(-) diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c index 424f656cd765..f5c4d9ffac8e 100644 --- a/fs/erofs/zdata.c +++ b/fs/erofs/zdata.c @@ -353,7 +353,7 @@ static void erofs_destroy_percpu_workers(void) static struct kthread_worker *erofs_init_percpu_worker(int cpu) { struct kthread_worker *worker =3D - kthread_create_worker_on_cpu(cpu, 0, "erofs_worker/%u", cpu); + kthread_create_worker_on_cpu(cpu, 0, "erofs_worker/%u"); =20 if (IS_ERR(worker)) return worker; diff --git a/include/linux/kthread.h b/include/linux/kthread.h index 30209bdf83a2..0c66e7c1092a 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h @@ -187,13 +187,24 @@ extern void __kthread_init_worker(struct kthread_work= er *worker, =20 int kthread_worker_fn(void *worker_ptr); =20 -__printf(2, 3) +__printf(3, 4) +struct kthread_worker *kthread_create_worker_on_node(unsigned int flags, + int node, + const char namefmt[], ...); + +#define kthread_create_worker(flags, namefmt, ...) \ +({ \ + struct kthread_worker *__kw \ + =3D kthread_create_worker_on_node(flags, NUMA_NO_NODE, \ + namefmt, ## __VA_ARGS__); \ + if (!IS_ERR(__kw)) \ + wake_up_process(__kw->task); \ + __kw; \ +}) + struct kthread_worker * -kthread_create_worker(unsigned int flags, const char namefmt[], ...); - -__printf(3, 4) struct kthread_worker * kthread_create_worker_on_cpu(int cpu, unsigned int flags, - const char namefmt[], ...); + const char namefmt[]); =20 bool kthread_queue_work(struct kthread_worker *worker, struct kthread_work *work); diff --git a/kernel/kthread.c b/kernel/kthread.c index e4ffc776928a..d318621c6f4f 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -1033,12 +1033,11 @@ int kthread_worker_fn(void *worker_ptr) EXPORT_SYMBOL_GPL(kthread_worker_fn); =20 static __printf(3, 0) struct kthread_worker * -__kthread_create_worker(int cpu, unsigned int flags, - const char namefmt[], va_list args) +__kthread_create_worker_on_node(unsigned int flags, int node, + const char namefmt[], va_list args) { struct kthread_worker *worker; struct task_struct *task; - int node =3D NUMA_NO_NODE; =20 worker =3D kzalloc(sizeof(*worker), GFP_KERNEL); if (!worker) @@ -1046,20 +1045,14 @@ __kthread_create_worker(int cpu, unsigned int flags, =20 kthread_init_worker(worker); =20 - if (cpu >=3D 0) - node =3D cpu_to_node(cpu); - task =3D __kthread_create_on_node(kthread_worker_fn, worker, - node, namefmt, args); + node, namefmt, args); if (IS_ERR(task)) goto fail_task; =20 - if (cpu >=3D 0) - kthread_bind(task, cpu); - worker->flags =3D flags; worker->task =3D task; - wake_up_process(task); + return worker; =20 fail_task: @@ -1070,6 +1063,7 @@ __kthread_create_worker(int cpu, unsigned int flags, /** * kthread_create_worker - create a kthread worker * @flags: flags modifying the default behavior of the worker + * @node: task structure for the thread is allocated on this node * @namefmt: printf-style name for the kthread worker (task). * * Returns a pointer to the allocated worker on success, ERR_PTR(-ENOMEM) @@ -1077,25 +1071,49 @@ __kthread_create_worker(int cpu, unsigned int flags, * when the caller was killed by a fatal signal. */ struct kthread_worker * -kthread_create_worker(unsigned int flags, const char namefmt[], ...) +kthread_create_worker_on_node(unsigned int flags, int node, const char nam= efmt[], ...) { struct kthread_worker *worker; va_list args; =20 va_start(args, namefmt); - worker =3D __kthread_create_worker(-1, flags, namefmt, args); + worker =3D __kthread_create_worker_on_node(flags, node, namefmt, args); va_end(args); =20 + if (worker) + wake_up_process(worker->task); + + return worker; +} +EXPORT_SYMBOL(kthread_create_worker_on_node); + +static __printf(3, 4) struct kthread_worker * +__kthread_create_worker_on_cpu(int cpu, unsigned int flags, + const char namefmt[], ...) +{ + struct kthread_worker *worker; + va_list args; + + va_start(args, namefmt); + worker =3D __kthread_create_worker_on_node(flags, cpu_to_node(cpu), + namefmt, args); + va_end(args); + + if (worker) { + kthread_bind(worker->task, cpu); + wake_up_process(worker->task); + } + return worker; } -EXPORT_SYMBOL(kthread_create_worker); =20 /** * kthread_create_worker_on_cpu - create a kthread worker and bind it * to a given CPU and the associated NUMA node. * @cpu: CPU number * @flags: flags modifying the default behavior of the worker - * @namefmt: printf-style name for the kthread worker (task). + * @namefmt: printf-style name for the thread. Format is restricted + * to "name.*%u". Code fills in cpu number. * * Use a valid CPU number if you want to bind the kthread worker * to the given CPU and the associated NUMA node. @@ -1127,16 +1145,9 @@ EXPORT_SYMBOL(kthread_create_worker); */ struct kthread_worker * kthread_create_worker_on_cpu(int cpu, unsigned int flags, - const char namefmt[], ...) + const char namefmt[]) { - struct kthread_worker *worker; - va_list args; - - va_start(args, namefmt); - worker =3D __kthread_create_worker(cpu, flags, namefmt, args); - va_end(args); - - return worker; + return __kthread_create_worker_on_cpu(cpu, flags, namefmt, cpu); } EXPORT_SYMBOL(kthread_create_worker_on_cpu); =20 --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D2CF518E058; Mon, 16 Sep 2024 22:50:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527023; cv=none; b=XHGivqFXHE4n3tVxpj5GYQ8JPBmfJPrl2aY5r/2B/8vNF03QHdxolcAJLkhLJDZtpHCwuPnRrN+ZXRBP/AfnRHw6dPFUidRiSXJOdPLGBQVU7CLjJpadaL8gGDC97Cqy2Yt9owkSS34V1a6xVws2LwIwMHmKnq65N1TeBf/uY3Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527023; c=relaxed/simple; bh=Z0BL/nRbicZK2KjFGu7rHZUzTzQ2OOUbxkiVW6pvCv0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lbwMGuhEe71FK5L17F6EiXeX0OE5hGxYOtLMiSTS/FzYnagGi3ghZcNNXk7qX4ASoLRUC4/WipNmp3MMJ6of7TZqd21BdUCiB9GRPUp2fgmu5R6Pm056qFXQ1v/c0Qo1f5kGL8i2XOAVnzCSPWAE0PSJe0Vy88XqyVWCO2jDDq4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bLEd1Fsj; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bLEd1Fsj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7B4B5C4CEC4; Mon, 16 Sep 2024 22:50:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726527023; bh=Z0BL/nRbicZK2KjFGu7rHZUzTzQ2OOUbxkiVW6pvCv0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bLEd1FsjhKNJiS3zdeJ2qbMq1d436A9kMkOgBPcjSuqkaax1ENFX4N0Qp4GsLW6l9 I3syCtunVnXLA5TsGAmXBOUg7mO3JrG9wzHI8M+MAzi/pQ0cDaciIcZaMf6heNdXfg KnhgOjFH1kovcHVbKgfDiIBpFlK02MAtDKI7yhB1Z0MqAA/v5+ugmTSnltTehojUbB FAQTY9c8XUrQvujWkwFQygfEDshXjc1FLSAc23OdQk63k2/V01k3PMgZ2UfywcIDaS ohv7t3I+vjxQTbTi0Fr+O2bNZSO0Cyd8bL+wwUW9g5gfqoazIhnDkk1U+hapjlsirr 2BH1A+GRcznJQ== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , "Paul E. McKenney" , Neeraj Upadhyay , Joel Fernandes , Boqun Feng , Zqiang , rcu@vger.kernel.org, Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 18/19] treewide: Introduce kthread_run_worker[_on_cpu]() Date: Tue, 17 Sep 2024 00:49:22 +0200 Message-ID: <20240916224925.20540-19-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" kthread_create() creates a kthread without running it yet. kthread_run() creates a kthread and runs it. On the other hand, kthread_create_worker() creates a kthread worker and runs it. This difference in behaviours is confusing. Also there is no way to create a kthread worker and affine it using kthread_bind_mask() or kthread_affine_preferred() before starting it. Consolidate the behaviours and introduce kthread_run_worker[_on_cpu]() that behaves just like kthread_run(). kthread_create_worker[_on_cpu]() will now only create a kthread worker without starting it. Signed-off-by: Frederic Weisbecker --- arch/x86/kvm/i8254.c | 2 +- crypto/crypto_engine.c | 2 +- drivers/cpufreq/cppc_cpufreq.c | 2 +- drivers/gpu/drm/drm_vblank_work.c | 2 +- .../drm/i915/gem/selftests/i915_gem_context.c | 2 +- drivers/gpu/drm/i915/gt/selftest_execlists.c | 2 +- drivers/gpu/drm/i915/gt/selftest_hangcheck.c | 2 +- drivers/gpu/drm/i915/gt/selftest_slpc.c | 2 +- drivers/gpu/drm/i915/selftests/i915_request.c | 8 ++-- drivers/gpu/drm/msm/disp/msm_disp_snapshot.c | 2 +- drivers/gpu/drm/msm/msm_atomic.c | 2 +- drivers/gpu/drm/msm/msm_gpu.c | 2 +- drivers/gpu/drm/msm/msm_kms.c | 2 +- .../platform/chips-media/wave5/wave5-vpu.c | 2 +- drivers/net/dsa/mv88e6xxx/chip.c | 2 +- drivers/net/ethernet/intel/ice/ice_dpll.c | 2 +- drivers/net/ethernet/intel/ice/ice_gnss.c | 2 +- drivers/net/ethernet/intel/ice/ice_ptp.c | 2 +- drivers/platform/chrome/cros_ec_spi.c | 2 +- drivers/ptp/ptp_clock.c | 2 +- drivers/spi/spi.c | 2 +- drivers/usb/typec/tcpm/tcpm.c | 2 +- drivers/vdpa/vdpa_sim/vdpa_sim.c | 2 +- drivers/watchdog/watchdog_dev.c | 2 +- fs/erofs/zdata.c | 2 +- include/linux/kthread.h | 48 ++++++++++++++++--- kernel/kthread.c | 31 +++--------- kernel/rcu/tree.c | 4 +- kernel/workqueue.c | 2 +- net/dsa/tag_ksz.c | 2 +- net/dsa/tag_ocelot_8021q.c | 2 +- net/dsa/tag_sja1105.c | 2 +- 32 files changed, 82 insertions(+), 65 deletions(-) diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index cd57a517d04a..d7ab8780ab9e 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c @@ -681,7 +681,7 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 fla= gs) pid_nr =3D pid_vnr(pid); put_pid(pid); =20 - pit->worker =3D kthread_create_worker(0, "kvm-pit/%d", pid_nr); + pit->worker =3D kthread_run_worker(0, "kvm-pit/%d", pid_nr); if (IS_ERR(pit->worker)) goto fail_kthread; =20 diff --git a/crypto/crypto_engine.c b/crypto/crypto_engine.c index e60a0eb628e8..c7c16da5e649 100644 --- a/crypto/crypto_engine.c +++ b/crypto/crypto_engine.c @@ -517,7 +517,7 @@ struct crypto_engine *crypto_engine_alloc_init_and_set(= struct device *dev, crypto_init_queue(&engine->queue, qlen); spin_lock_init(&engine->queue_lock); =20 - engine->kworker =3D kthread_create_worker(0, "%s", engine->name); + engine->kworker =3D kthread_run_worker(0, "%s", engine->name); if (IS_ERR(engine->kworker)) { dev_err(dev, "failed to create crypto request pump task\n"); return NULL; diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c index bafa32dd375d..0a567af2f06d 100644 --- a/drivers/cpufreq/cppc_cpufreq.c +++ b/drivers/cpufreq/cppc_cpufreq.c @@ -241,7 +241,7 @@ static void __init cppc_freq_invariance_init(void) if (fie_disabled) return; =20 - kworker_fie =3D kthread_create_worker(0, "cppc_fie"); + kworker_fie =3D kthread_run_worker(0, "cppc_fie"); if (IS_ERR(kworker_fie)) { pr_warn("%s: failed to create kworker_fie: %ld\n", __func__, PTR_ERR(kworker_fie)); diff --git a/drivers/gpu/drm/drm_vblank_work.c b/drivers/gpu/drm/drm_vblank= _work.c index 1752ffb44e1d..9cc71120246f 100644 --- a/drivers/gpu/drm/drm_vblank_work.c +++ b/drivers/gpu/drm/drm_vblank_work.c @@ -277,7 +277,7 @@ int drm_vblank_worker_init(struct drm_vblank_crtc *vbla= nk) =20 INIT_LIST_HEAD(&vblank->pending_work); init_waitqueue_head(&vblank->work_wait_queue); - worker =3D kthread_create_worker(0, "card%d-crtc%d", + worker =3D kthread_run_worker(0, "card%d-crtc%d", vblank->dev->primary->index, vblank->pipe); if (IS_ERR(worker)) diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/driver= s/gpu/drm/i915/gem/selftests/i915_gem_context.c index 89d4dc8b60c6..eb0158e43417 100644 --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c @@ -369,7 +369,7 @@ static int live_parallel_switch(void *arg) if (!data[n].ce[0]) continue; =20 - worker =3D kthread_create_worker(0, "igt/parallel:%s", + worker =3D kthread_run_worker(0, "igt/parallel:%s", data[n].ce[0]->engine->name); if (IS_ERR(worker)) { err =3D PTR_ERR(worker); diff --git a/drivers/gpu/drm/i915/gt/selftest_execlists.c b/drivers/gpu/drm= /i915/gt/selftest_execlists.c index 4202df5b8c12..7da05fd6807f 100644 --- a/drivers/gpu/drm/i915/gt/selftest_execlists.c +++ b/drivers/gpu/drm/i915/gt/selftest_execlists.c @@ -3574,7 +3574,7 @@ static int smoke_crescendo(struct preempt_smoke *smok= e, unsigned int flags) arg[id].batch =3D NULL; arg[id].count =3D 0; =20 - worker[id] =3D kthread_create_worker(0, "igt/smoke:%d", id); + worker[id] =3D kthread_run_worker(0, "igt/smoke:%d", id); if (IS_ERR(worker[id])) { err =3D PTR_ERR(worker[id]); break; diff --git a/drivers/gpu/drm/i915/gt/selftest_hangcheck.c b/drivers/gpu/drm= /i915/gt/selftest_hangcheck.c index 9ce8ff1c04fe..9d3aeb237295 100644 --- a/drivers/gpu/drm/i915/gt/selftest_hangcheck.c +++ b/drivers/gpu/drm/i915/gt/selftest_hangcheck.c @@ -1025,7 +1025,7 @@ static int __igt_reset_engines(struct intel_gt *gt, threads[tmp].engine =3D other; threads[tmp].flags =3D flags; =20 - worker =3D kthread_create_worker(0, "igt/%s", + worker =3D kthread_run_worker(0, "igt/%s", other->name); if (IS_ERR(worker)) { err =3D PTR_ERR(worker); diff --git a/drivers/gpu/drm/i915/gt/selftest_slpc.c b/drivers/gpu/drm/i915= /gt/selftest_slpc.c index 4ecc4ae74a54..e218b229681f 100644 --- a/drivers/gpu/drm/i915/gt/selftest_slpc.c +++ b/drivers/gpu/drm/i915/gt/selftest_slpc.c @@ -489,7 +489,7 @@ static int live_slpc_tile_interaction(void *arg) return -ENOMEM; =20 for_each_gt(gt, i915, i) { - threads[i].worker =3D kthread_create_worker(0, "igt/slpc_parallel:%d", g= t->info.id); + threads[i].worker =3D kthread_run_worker(0, "igt/slpc_parallel:%d", gt->= info.id); =20 if (IS_ERR(threads[i].worker)) { ret =3D PTR_ERR(threads[i].worker); diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/dr= m/i915/selftests/i915_request.c index acae30a04a94..88870844b5bd 100644 --- a/drivers/gpu/drm/i915/selftests/i915_request.c +++ b/drivers/gpu/drm/i915/selftests/i915_request.c @@ -492,7 +492,7 @@ static int mock_breadcrumbs_smoketest(void *arg) for (n =3D 0; n < ncpus; n++) { struct kthread_worker *worker; =20 - worker =3D kthread_create_worker(0, "igt/%d", n); + worker =3D kthread_run_worker(0, "igt/%d", n); if (IS_ERR(worker)) { ret =3D PTR_ERR(worker); ncpus =3D n; @@ -1645,7 +1645,7 @@ static int live_parallel_engines(void *arg) for_each_uabi_engine(engine, i915) { struct kthread_worker *worker; =20 - worker =3D kthread_create_worker(0, "igt/parallel:%s", + worker =3D kthread_run_worker(0, "igt/parallel:%s", engine->name); if (IS_ERR(worker)) { err =3D PTR_ERR(worker); @@ -1806,7 +1806,7 @@ static int live_breadcrumbs_smoketest(void *arg) unsigned int i =3D idx * ncpus + n; struct kthread_worker *worker; =20 - worker =3D kthread_create_worker(0, "igt/%d.%d", idx, n); + worker =3D kthread_run_worker(0, "igt/%d.%d", idx, n); if (IS_ERR(worker)) { ret =3D PTR_ERR(worker); goto out_flush; @@ -3219,7 +3219,7 @@ static int perf_parallel_engines(void *arg) =20 memset(&engines[idx].p, 0, sizeof(engines[idx].p)); =20 - worker =3D kthread_create_worker(0, "igt:%s", + worker =3D kthread_run_worker(0, "igt:%s", engine->name); if (IS_ERR(worker)) { err =3D PTR_ERR(worker); diff --git a/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c b/drivers/gpu/drm= /msm/disp/msm_disp_snapshot.c index e75b97127c0d..2be00b11e557 100644 --- a/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c +++ b/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c @@ -109,7 +109,7 @@ int msm_disp_snapshot_init(struct drm_device *drm_dev) =20 mutex_init(&kms->dump_mutex); =20 - kms->dump_worker =3D kthread_create_worker(0, "%s", "disp_snapshot"); + kms->dump_worker =3D kthread_run_worker(0, "%s", "disp_snapshot"); if (IS_ERR(kms->dump_worker)) DRM_ERROR("failed to create disp state task\n"); =20 diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_ato= mic.c index 9c45d641b521..a7a2384044ff 100644 --- a/drivers/gpu/drm/msm/msm_atomic.c +++ b/drivers/gpu/drm/msm/msm_atomic.c @@ -115,7 +115,7 @@ int msm_atomic_init_pending_timer(struct msm_pending_ti= mer *timer, timer->kms =3D kms; timer->crtc_idx =3D crtc_idx; =20 - timer->worker =3D kthread_create_worker(0, "atomic-worker-%d", crtc_idx); + timer->worker =3D kthread_run_worker(0, "atomic-worker-%d", crtc_idx); if (IS_ERR(timer->worker)) { int ret =3D PTR_ERR(timer->worker); timer->worker =3D NULL; diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c index 3666b42b4ecd..87f151dfc241 100644 --- a/drivers/gpu/drm/msm/msm_gpu.c +++ b/drivers/gpu/drm/msm/msm_gpu.c @@ -859,7 +859,7 @@ int msm_gpu_init(struct drm_device *drm, struct platfor= m_device *pdev, gpu->funcs =3D funcs; gpu->name =3D name; =20 - gpu->worker =3D kthread_create_worker(0, "gpu-worker"); + gpu->worker =3D kthread_run_worker(0, "gpu-worker"); if (IS_ERR(gpu->worker)) { ret =3D PTR_ERR(gpu->worker); gpu->worker =3D NULL; diff --git a/drivers/gpu/drm/msm/msm_kms.c b/drivers/gpu/drm/msm/msm_kms.c index af6a6fcb1173..8db9f3afb8ac 100644 --- a/drivers/gpu/drm/msm/msm_kms.c +++ b/drivers/gpu/drm/msm/msm_kms.c @@ -269,7 +269,7 @@ int msm_drm_kms_init(struct device *dev, const struct d= rm_driver *drv) /* initialize event thread */ ev_thread =3D &priv->event_thread[drm_crtc_index(crtc)]; ev_thread->dev =3D ddev; - ev_thread->worker =3D kthread_create_worker(0, "crtc_event:%d", crtc->ba= se.id); + ev_thread->worker =3D kthread_run_worker(0, "crtc_event:%d", crtc->base.= id); if (IS_ERR(ev_thread->worker)) { ret =3D PTR_ERR(ev_thread->worker); DRM_DEV_ERROR(dev, "failed to create crtc_event kthread\n"); diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu.c b/drivers= /media/platform/chips-media/wave5/wave5-vpu.c index 7273254ecb03..c49f5ed461cf 100644 --- a/drivers/media/platform/chips-media/wave5/wave5-vpu.c +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu.c @@ -231,7 +231,7 @@ static int wave5_vpu_probe(struct platform_device *pdev) dev_err(&pdev->dev, "failed to get irq resource, falling back to polling= \n"); hrtimer_init(&dev->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED); dev->hrtimer.function =3D &wave5_vpu_timer_callback; - dev->worker =3D kthread_create_worker(0, "vpu_irq_thread"); + dev->worker =3D kthread_run_worker(0, "vpu_irq_thread"); if (IS_ERR(dev->worker)) { dev_err(&pdev->dev, "failed to create vpu irq worker\n"); ret =3D PTR_ERR(dev->worker); diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/c= hip.c index 5b4e2ce5470d..a5908e2ff2cf 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -393,7 +393,7 @@ static int mv88e6xxx_irq_poll_setup(struct mv88e6xxx_ch= ip *chip) kthread_init_delayed_work(&chip->irq_poll_work, mv88e6xxx_irq_poll); =20 - chip->kworker =3D kthread_create_worker(0, "%s", dev_name(chip->dev)); + chip->kworker =3D kthread_run_worker(0, "%s", dev_name(chip->dev)); if (IS_ERR(chip->kworker)) return PTR_ERR(chip->kworker); =20 diff --git a/drivers/net/ethernet/intel/ice/ice_dpll.c b/drivers/net/ethern= et/intel/ice/ice_dpll.c index e92be6f130a3..f065a1dc0414 100644 --- a/drivers/net/ethernet/intel/ice/ice_dpll.c +++ b/drivers/net/ethernet/intel/ice/ice_dpll.c @@ -1833,7 +1833,7 @@ static int ice_dpll_init_worker(struct ice_pf *pf) struct kthread_worker *kworker; =20 kthread_init_delayed_work(&d->work, ice_dpll_periodic_work); - kworker =3D kthread_create_worker(0, "ice-dplls-%s", + kworker =3D kthread_run_worker(0, "ice-dplls-%s", dev_name(ice_pf_to_dev(pf))); if (IS_ERR(kworker)) return PTR_ERR(kworker); diff --git a/drivers/net/ethernet/intel/ice/ice_gnss.c b/drivers/net/ethern= et/intel/ice/ice_gnss.c index c8ea1af51ad3..fcd1f808b696 100644 --- a/drivers/net/ethernet/intel/ice/ice_gnss.c +++ b/drivers/net/ethernet/intel/ice/ice_gnss.c @@ -182,7 +182,7 @@ static struct gnss_serial *ice_gnss_struct_init(struct = ice_pf *pf) pf->gnss_serial =3D gnss; =20 kthread_init_delayed_work(&gnss->read_work, ice_gnss_read); - kworker =3D kthread_create_worker(0, "ice-gnss-%s", dev_name(dev)); + kworker =3D kthread_run_worker(0, "ice-gnss-%s", dev_name(dev)); if (IS_ERR(kworker)) { kfree(gnss); return NULL; diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/etherne= t/intel/ice/ice_ptp.c index ef2e858f49bb..cd7da48bdf91 100644 --- a/drivers/net/ethernet/intel/ice/ice_ptp.c +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c @@ -3185,7 +3185,7 @@ static int ice_ptp_init_work(struct ice_pf *pf, struc= t ice_ptp *ptp) /* Allocate a kworker for handling work required for the ports * connected to the PTP hardware clock. */ - kworker =3D kthread_create_worker(0, "ice-ptp-%s", + kworker =3D kthread_run_worker(0, "ice-ptp-%s", dev_name(ice_pf_to_dev(pf))); if (IS_ERR(kworker)) return PTR_ERR(kworker); diff --git a/drivers/platform/chrome/cros_ec_spi.c b/drivers/platform/chrom= e/cros_ec_spi.c index 86a3d32a7763..08f566cc1480 100644 --- a/drivers/platform/chrome/cros_ec_spi.c +++ b/drivers/platform/chrome/cros_ec_spi.c @@ -715,7 +715,7 @@ static int cros_ec_spi_devm_high_pri_alloc(struct devic= e *dev, int err; =20 ec_spi->high_pri_worker =3D - kthread_create_worker(0, "cros_ec_spi_high_pri"); + kthread_run_worker(0, "cros_ec_spi_high_pri"); =20 if (IS_ERR(ec_spi->high_pri_worker)) { err =3D PTR_ERR(ec_spi->high_pri_worker); diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c index c56cd0f63909..89a4420972e7 100644 --- a/drivers/ptp/ptp_clock.c +++ b/drivers/ptp/ptp_clock.c @@ -295,7 +295,7 @@ struct ptp_clock *ptp_clock_register(struct ptp_clock_i= nfo *info, =20 if (ptp->info->do_aux_work) { kthread_init_delayed_work(&ptp->aux_work, ptp_aux_kworker); - ptp->kworker =3D kthread_create_worker(0, "ptp%d", ptp->index); + ptp->kworker =3D kthread_run_worker(0, "ptp%d", ptp->index); if (IS_ERR(ptp->kworker)) { err =3D PTR_ERR(ptp->kworker); pr_err("failed to create ptp aux_worker %d\n", err); diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 6ebe5dd9bbb1..1a615fd696fc 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -2053,7 +2053,7 @@ static int spi_init_queue(struct spi_controller *ctlr) ctlr->busy =3D false; ctlr->queue_empty =3D true; =20 - ctlr->kworker =3D kthread_create_worker(0, dev_name(&ctlr->dev)); + ctlr->kworker =3D kthread_run_worker(0, dev_name(&ctlr->dev)); if (IS_ERR(ctlr->kworker)) { dev_err(&ctlr->dev, "failed to create message pump kworker\n"); return PTR_ERR(ctlr->kworker); diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index 4b02d6474259..7148885c36e8 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -7582,7 +7582,7 @@ struct tcpm_port *tcpm_register_port(struct device *d= ev, struct tcpc_dev *tcpc) mutex_init(&port->lock); mutex_init(&port->swap_lock); =20 - port->wq =3D kthread_create_worker(0, dev_name(dev)); + port->wq =3D kthread_run_worker(0, dev_name(dev)); if (IS_ERR(port->wq)) return ERR_CAST(port->wq); sched_set_fifo(port->wq->task); diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.c b/drivers/vdpa/vdpa_sim/vdpa_= sim.c index 8ffea8430f95..c204fc8e471a 100644 --- a/drivers/vdpa/vdpa_sim/vdpa_sim.c +++ b/drivers/vdpa/vdpa_sim/vdpa_sim.c @@ -229,7 +229,7 @@ struct vdpasim *vdpasim_create(struct vdpasim_dev_attr = *dev_attr, dev =3D &vdpasim->vdpa.dev; =20 kthread_init_work(&vdpasim->work, vdpasim_work_fn); - vdpasim->worker =3D kthread_create_worker(0, "vDPA sim worker: %s", + vdpasim->worker =3D kthread_run_worker(0, "vDPA sim worker: %s", dev_attr->name); if (IS_ERR(vdpasim->worker)) goto err_iommu; diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_de= v.c index 4190cb800cc4..19698d87dc57 100644 --- a/drivers/watchdog/watchdog_dev.c +++ b/drivers/watchdog/watchdog_dev.c @@ -1229,7 +1229,7 @@ int __init watchdog_dev_init(void) { int err; =20 - watchdog_kworker =3D kthread_create_worker(0, "watchdogd"); + watchdog_kworker =3D kthread_run_worker(0, "watchdogd"); if (IS_ERR(watchdog_kworker)) { pr_err("Failed to create watchdog kworker\n"); return PTR_ERR(watchdog_kworker); diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c index f5c4d9ffac8e..e13959973fc4 100644 --- a/fs/erofs/zdata.c +++ b/fs/erofs/zdata.c @@ -353,7 +353,7 @@ static void erofs_destroy_percpu_workers(void) static struct kthread_worker *erofs_init_percpu_worker(int cpu) { struct kthread_worker *worker =3D - kthread_create_worker_on_cpu(cpu, 0, "erofs_worker/%u"); + kthread_run_worker_on_cpu(cpu, 0, "erofs_worker/%u"); =20 if (IS_ERR(worker)) return worker; diff --git a/include/linux/kthread.h b/include/linux/kthread.h index 0c66e7c1092a..8d27403888ce 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h @@ -193,19 +193,53 @@ struct kthread_worker *kthread_create_worker_on_node(= unsigned int flags, const char namefmt[], ...); =20 #define kthread_create_worker(flags, namefmt, ...) \ -({ \ - struct kthread_worker *__kw \ - =3D kthread_create_worker_on_node(flags, NUMA_NO_NODE, \ - namefmt, ## __VA_ARGS__); \ - if (!IS_ERR(__kw)) \ - wake_up_process(__kw->task); \ - __kw; \ + kthread_create_worker_on_node(flags, NUMA_NO_NODE, namefmt, ## __VA_ARGS_= _); + +/** + * kthread_run_worker - create and wake a kthread worker. + * @flags: flags modifying the default behavior of the worker + * @namefmt: printf-style name for the thread. + * + * Description: Convenient wrapper for kthread_create_worker() followed by + * wake_up_process(). Returns the kthread_worker or ERR_PTR(-ENOMEM). + */ +#define kthread_run_worker(flags, namefmt, ...) \ +({ \ + struct kthread_worker *__kw \ + =3D kthread_create_worker(flags, namefmt, ## __VA_ARGS__); \ + if (!IS_ERR(__kw)) \ + wake_up_process(__kw->task); \ + __kw; \ }) =20 struct kthread_worker * kthread_create_worker_on_cpu(int cpu, unsigned int flags, const char namefmt[]); =20 +/** + * kthread_run_worker_on_cpu - create and wake a cpu bound kthread worker. + * @cpu: CPU number + * @flags: flags modifying the default behavior of the worker + * @namefmt: printf-style name for the thread. Format is restricted + * to "name.*%u". Code fills in cpu number. + * + * Description: Convenient wrapper for kthread_create_worker_on_cpu() + * followed by wake_up_process(). Returns the kthread_worker or + * ERR_PTR(-ENOMEM). + */ +static inline struct kthread_worker * +kthread_run_worker_on_cpu(int cpu, unsigned int flags, + const char namefmt[]) +{ + struct kthread_worker *kw; + + kw =3D kthread_create_worker_on_cpu(cpu, flags, namefmt); + if (!IS_ERR(kw)) + wake_up_process(kw->task); + + return kw; +} + bool kthread_queue_work(struct kthread_worker *worker, struct kthread_work *work); =20 diff --git a/kernel/kthread.c b/kernel/kthread.c index d318621c6f4f..a203e366204c 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -1080,33 +1080,10 @@ kthread_create_worker_on_node(unsigned int flags, i= nt node, const char namefmt[] worker =3D __kthread_create_worker_on_node(flags, node, namefmt, args); va_end(args); =20 - if (worker) - wake_up_process(worker->task); - return worker; } EXPORT_SYMBOL(kthread_create_worker_on_node); =20 -static __printf(3, 4) struct kthread_worker * -__kthread_create_worker_on_cpu(int cpu, unsigned int flags, - const char namefmt[], ...) -{ - struct kthread_worker *worker; - va_list args; - - va_start(args, namefmt); - worker =3D __kthread_create_worker_on_node(flags, cpu_to_node(cpu), - namefmt, args); - va_end(args); - - if (worker) { - kthread_bind(worker->task, cpu); - wake_up_process(worker->task); - } - - return worker; -} - /** * kthread_create_worker_on_cpu - create a kthread worker and bind it * to a given CPU and the associated NUMA node. @@ -1147,7 +1124,13 @@ struct kthread_worker * kthread_create_worker_on_cpu(int cpu, unsigned int flags, const char namefmt[]) { - return __kthread_create_worker_on_cpu(cpu, flags, namefmt, cpu); + struct kthread_worker *worker; + + worker =3D kthread_create_worker_on_node(flags, cpu_to_node(cpu), namefmt= , cpu); + if (worker) + kthread_bind(worker->task, cpu); + + return worker; } EXPORT_SYMBOL(kthread_create_worker_on_cpu); =20 diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 945e196090ed..902d4b5abbe7 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -4827,7 +4827,7 @@ static void rcu_spawn_exp_par_gp_kworker(struct rcu_n= ode *rnp) if (rnp->exp_kworker) return; =20 - kworker =3D kthread_create_worker(0, name, rnp_index); + kworker =3D kthread_run_worker(0, name, rnp_index); if (IS_ERR_OR_NULL(kworker)) { pr_err("Failed to create par gp kworker on %d/%d\n", rnp->grplo, rnp->grphi); @@ -4854,7 +4854,7 @@ static void __init rcu_start_exp_gp_kworker(void) const char *name =3D "rcu_exp_gp_kthread_worker"; struct sched_param param =3D { .sched_priority =3D kthread_prio }; =20 - rcu_exp_gp_kworker =3D kthread_create_worker(0, name); + rcu_exp_gp_kworker =3D kthread_run_worker(0, name); if (IS_ERR_OR_NULL(rcu_exp_gp_kworker)) { pr_err("Failed to create %s!\n", name); rcu_exp_gp_kworker =3D NULL; diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 6f2545037e57..7a2208796bc9 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -7757,7 +7757,7 @@ static void __init wq_cpu_intensive_thresh_init(void) unsigned long thresh; unsigned long bogo; =20 - pwq_release_worker =3D kthread_create_worker(0, "pool_workqueue_release"); + pwq_release_worker =3D kthread_run_worker(0, "pool_workqueue_release"); BUG_ON(IS_ERR(pwq_release_worker)); =20 /* if the user set it to a specific value, keep it */ diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c index ee7b272ab715..f21f2711921f 100644 --- a/net/dsa/tag_ksz.c +++ b/net/dsa/tag_ksz.c @@ -66,7 +66,7 @@ static int ksz_connect(struct dsa_switch *ds) if (!priv) return -ENOMEM; =20 - xmit_worker =3D kthread_create_worker(0, "dsa%d:%d_xmit", + xmit_worker =3D kthread_run_worker(0, "dsa%d:%d_xmit", ds->dst->index, ds->index); if (IS_ERR(xmit_worker)) { ret =3D PTR_ERR(xmit_worker); diff --git a/net/dsa/tag_ocelot_8021q.c b/net/dsa/tag_ocelot_8021q.c index 8e8b1bef6af6..6ce0bc166792 100644 --- a/net/dsa/tag_ocelot_8021q.c +++ b/net/dsa/tag_ocelot_8021q.c @@ -110,7 +110,7 @@ static int ocelot_connect(struct dsa_switch *ds) if (!priv) return -ENOMEM; =20 - priv->xmit_worker =3D kthread_create_worker(0, "felix_xmit"); + priv->xmit_worker =3D kthread_run_worker(0, "felix_xmit"); if (IS_ERR(priv->xmit_worker)) { err =3D PTR_ERR(priv->xmit_worker); kfree(priv); diff --git a/net/dsa/tag_sja1105.c b/net/dsa/tag_sja1105.c index 3e902af7eea6..02adec693811 100644 --- a/net/dsa/tag_sja1105.c +++ b/net/dsa/tag_sja1105.c @@ -707,7 +707,7 @@ static int sja1105_connect(struct dsa_switch *ds) =20 spin_lock_init(&priv->meta_lock); =20 - xmit_worker =3D kthread_create_worker(0, "dsa%d:%d_xmit", + xmit_worker =3D kthread_run_worker(0, "dsa%d:%d_xmit", ds->dst->index, ds->index); if (IS_ERR(xmit_worker)) { err =3D PTR_ERR(xmit_worker); --=20 2.46.0 From nobody Fri Nov 29 18:34:20 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1724916F839; Mon, 16 Sep 2024 22:50:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527027; cv=none; b=S/gFtj0BIVaakXwgFq9hzWRczw27fSuJcrEmvyeTJZZ+XtU14vRECam+/Tfp5AizT+aFjU10QJfEUCzqSbY108Rlh91pW0fyW8fg9AllPEDeYu9jitTFAwVWoRH1y7le6C5EftqSBgNwNOqItbN350QtayDByrJpygCY/a+UvsE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726527027; c=relaxed/simple; bh=XFzJ4mxWd3+ScHM8w2S2c71PfRlHFJW2SZ3NxFYLpjE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fWO5ZwNcFv1oZbYk1FTKazVw7cASOrw5+M5Jw4O/WzQDY5cgoA6qIZe4cx6jYMWWM6446DtVQ7h8xGt9u08TtQfVhOZ/hgd97VvCj4+wZiaUk/OCb0Mti4A6HISwts55ZRq9SOCDwsiqTW/dGhc6l0mCfXFb9NzfWIco15kC/yk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=s4KDWK2A; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="s4KDWK2A" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3574EC4CEC5; Mon, 16 Sep 2024 22:50:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726527026; bh=XFzJ4mxWd3+ScHM8w2S2c71PfRlHFJW2SZ3NxFYLpjE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=s4KDWK2AlwUZuNXgLahGqvEaNQPmVCiV0IY7tZZv/XSzapW/LIdDoxD8sYVz8nFGB IV5K59auZaawNpjtMUL8snJKX+XRvWYOG3UpKWoc3RlOHhfXSIOIvg3F2DPN0qpBGB BvObx5Tnx9cSQJTxu9Wg9vkJGXzDgNjIz0jyQd+AoGn3bMR9LaxTr5v99sFYx/vp8g Hks80bjIVhUYW2egV9yZ07DklXSGdx6zi3sCnd36XCQ9dSMPhd9x6odQyXkxVJc1QT h+P6r1dmvZ6jItnY+r/NBGRQBKb0ZleKpRnwrBDC7CTLkYWWqsdTo5orDIAeFz9ajB ya8CZqOKJ4wag== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , "Paul E. McKenney" , Neeraj Upadhyay , Joel Fernandes , Boqun Feng , Zqiang , rcu@vger.kernel.org, Andrew Morton , Peter Zijlstra , Thomas Gleixner Subject: [PATCH 19/19] rcu: Use kthread preferred affinity for RCU exp kworkers Date: Tue, 17 Sep 2024 00:49:23 +0200 Message-ID: <20240916224925.20540-20-frederic@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240916224925.20540-1-frederic@kernel.org> References: <20240916224925.20540-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that kthreads have an infrastructure to handle preferred affinity against CPU hotplug and housekeeping cpumask, convert RCU exp workers to use it instead of handling all the constraints by itself. Acked-by: Paul E. McKenney Signed-off-by: Frederic Weisbecker --- kernel/rcu/tree.c | 105 +++++++++------------------------------------- 1 file changed, 19 insertions(+), 86 deletions(-) diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 902d4b5abbe7..118477a6dda4 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -4815,6 +4815,22 @@ rcu_boot_init_percpu_data(int cpu) rcu_boot_init_nocb_percpu_data(rdp); } =20 +static void rcu_thread_affine_rnp(struct task_struct *t, struct rcu_node *= rnp) +{ + cpumask_var_t affinity; + int cpu; + + if (!zalloc_cpumask_var(&affinity, GFP_KERNEL)) + return; + + for_each_leaf_node_possible_cpu(rnp, cpu) + cpumask_set_cpu(cpu, affinity); + + kthread_affine_preferred(t, affinity); + + free_cpumask_var(affinity); +} + struct kthread_worker *rcu_exp_gp_kworker; =20 static void rcu_spawn_exp_par_gp_kworker(struct rcu_node *rnp) @@ -4827,7 +4843,7 @@ static void rcu_spawn_exp_par_gp_kworker(struct rcu_n= ode *rnp) if (rnp->exp_kworker) return; =20 - kworker =3D kthread_run_worker(0, name, rnp_index); + kworker =3D kthread_create_worker(0, name, rnp_index); if (IS_ERR_OR_NULL(kworker)) { pr_err("Failed to create par gp kworker on %d/%d\n", rnp->grplo, rnp->grphi); @@ -4837,16 +4853,9 @@ static void rcu_spawn_exp_par_gp_kworker(struct rcu_= node *rnp) =20 if (IS_ENABLED(CONFIG_RCU_EXP_KTHREAD)) sched_setscheduler_nocheck(kworker->task, SCHED_FIFO, ¶m); -} =20 -static struct task_struct *rcu_exp_par_gp_task(struct rcu_node *rnp) -{ - struct kthread_worker *kworker =3D READ_ONCE(rnp->exp_kworker); - - if (!kworker) - return NULL; - - return kworker->task; + rcu_thread_affine_rnp(kworker->task, rnp); + wake_up_process(kworker->task); } =20 static void __init rcu_start_exp_gp_kworker(void) @@ -4931,79 +4940,6 @@ int rcutree_prepare_cpu(unsigned int cpu) return 0; } =20 -static void rcu_thread_affine_rnp(struct task_struct *t, struct rcu_node *= rnp) -{ - cpumask_var_t affinity; - int cpu; - - if (!zalloc_cpumask_var(&affinity, GFP_KERNEL)) - return; - - for_each_leaf_node_possible_cpu(rnp, cpu) - cpumask_set_cpu(cpu, affinity); - - kthread_affine_preferred(t, affinity); - - free_cpumask_var(affinity); -} - -/* - * Update kthreads affinity during CPU-hotplug changes. - * - * Set the per-rcu_node kthread's affinity to cover all CPUs that are - * served by the rcu_node in question. The CPU hotplug lock is still - * held, so the value of rnp->qsmaskinit will be stable. - * - * We don't include outgoingcpu in the affinity set, use -1 if there is - * no outgoing CPU. If there are no CPUs left in the affinity set, - * this function allows the kthread to execute on any CPU. - * - * Any future concurrent calls are serialized via ->kthread_mutex. - */ -static void rcutree_affinity_setting(unsigned int cpu, int outgoingcpu) -{ - cpumask_var_t cm; - unsigned long mask; - struct rcu_data *rdp; - struct rcu_node *rnp; - struct task_struct *task_exp; - - rdp =3D per_cpu_ptr(&rcu_data, cpu); - rnp =3D rdp->mynode; - - task_exp =3D rcu_exp_par_gp_task(rnp); - - /* - * If CPU is the boot one, this task is created later from early - * initcall since kthreadd must be created first. - */ - if (!task_exp) - return; - - if (!zalloc_cpumask_var(&cm, GFP_KERNEL)) - return; - - mutex_lock(&rnp->kthread_mutex); - mask =3D rcu_rnp_online_cpus(rnp); - for_each_leaf_node_possible_cpu(rnp, cpu) - if ((mask & leaf_node_cpu_bit(rnp, cpu)) && - cpu !=3D outgoingcpu) - cpumask_set_cpu(cpu, cm); - cpumask_and(cm, cm, housekeeping_cpumask(HK_TYPE_RCU)); - if (cpumask_empty(cm)) { - cpumask_copy(cm, housekeeping_cpumask(HK_TYPE_RCU)); - if (outgoingcpu >=3D 0) - cpumask_clear_cpu(outgoingcpu, cm); - } - - if (task_exp) - set_cpus_allowed_ptr(task_exp, cm); - - mutex_unlock(&rnp->kthread_mutex); - - free_cpumask_var(cm); -} - /* * Has the specified (known valid) CPU ever been fully online? */ @@ -5032,7 +4968,6 @@ int rcutree_online_cpu(unsigned int cpu) if (rcu_scheduler_active =3D=3D RCU_SCHEDULER_INACTIVE) return 0; /* Too early in boot for scheduler work. */ sync_sched_exp_online_cleanup(cpu); - rcutree_affinity_setting(cpu, -1); =20 // Stop-machine done, so allow nohz_full to disable tick. tick_dep_clear(TICK_DEP_BIT_RCU); @@ -5249,8 +5184,6 @@ int rcutree_offline_cpu(unsigned int cpu) rnp->ffmask &=3D ~rdp->grpmask; raw_spin_unlock_irqrestore_rcu_node(rnp, flags); =20 - rcutree_affinity_setting(cpu, cpu); - // nohz_full CPUs need the tick for stop-machine to work quickly tick_dep_set(TICK_DEP_BIT_RCU); return 0; --=20 2.46.0