From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5BD443D8106 for ; Tue, 21 Apr 2026 14:25:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.50 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776781534; cv=none; b=c6lQA6XITmaakn98xHAe56r8BvC7TrPXVFeBjTiuEnXY56TNZeEtDmtmYdmjWTuepfcRYab67TpPatbM6edA6a0PQP/C6OZUhph1TaGs5FY4RqUtgcsvU67u/H3A2M/hMP1XSEMVC6ySG/B3E4o5dWUf2ekizYuHsHbQDN8MbaU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776781534; c=relaxed/simple; bh=e6hs8ACNVyUtI7/nDi4FX9ZgPABWYl4OK4jEuPQtyrI=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=Rr4oPNtIbqSnrX7s/VhSXWDLsDzji9MmxC+2JAqvEN0U2yubKyyDR/CV9eyaKAOZtz/EjCu5a44X7uSWwlsEYgHB4QCvM5uRV/sYqIRUnBr27A/Bm2ohbgzuu1CLLTZcgoLTEIpqRi5ik2PDkB1gOBqvqc6rVVJO4yU+uC5BW4s= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=OddyneHX; arc=none smtp.client-ip=209.85.216.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="OddyneHX" Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-3585ec417f6so2510192a91.1 for ; Tue, 21 Apr 2026 07:25:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776781533; x=1777386333; darn=vger.kernel.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=uXCqV0MG2zI7VVBu5Z+aY85rUWOej8zTmr41NYYBhvg=; b=OddyneHXA5W9dk1wpx97zFbQcG5CuQnEAoRRiGEH9R0S5sOas6Ly1wgVA6owA0j5IY HqdF3SkjoIvvAlAu8ytjOy5L95NT3plWc1K08pL7MSf7aR81ayU503P7Oss0lNEHra15 aYeFDGAySs9Bdv8Y1y8G1Uty/iYG3H1+mXiNOq48T48xUBTno38Ty3VLR8w6GOpHf60g YP6Q4mIsjB98XEImtMX9Nmvi/+cyuAe2IgnqogCzi1V1QMkYD1FNdRmgsivJoYwLm353 ZYk9snM5CGaxh89X2H2qmxUnm+xJ1M5qvZA91nUNfiBKNHatwK4qdubK0TECC3O3YySA 3/rA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776781533; x=1777386333; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uXCqV0MG2zI7VVBu5Z+aY85rUWOej8zTmr41NYYBhvg=; b=kSNq0DM9ituLVuqdjOJR8LkRwGiroLZvtHe2z6ayPaCHJjiyppa4HGfa7VN0NHZO1k 0QBC3M+tTu8wbF24snk64p/uX4AY+RJHmibxf8e4kOYgkzQ01DcMlDLsvlxj0ZSLN0Wu 2muTccEAY+Ysyrw1wM5V6lZE9vvN0BlovVNqK1+qoQIHV8O7F10llvggk9Ybp4mfXz3V orWjvxU80WGuHrveIBblWFU36SHCCJgbMx94iGVb1wO7MTvTA03Le7fB6b9XZFOs3D52 Gd3TnPhRAXU2aDly7Gd/Im04v+5jjXaAEf7GsXa3mn1H7xx9sC/wkSxpAK5PssWYnVN7 BvYw== X-Forwarded-Encrypted: i=1; AFNElJ+6dpbCsFyaa8rJxK+vk7gcNbYIE/1uFucTzUEPLzTBLg/VGU3frIMjqsGmIjO4XvOr3+sPwEyMmgcL9TE=@vger.kernel.org X-Gm-Message-State: AOJu0YzbC6QGrebyOf+7ixk+6XfLuWlui/PdAlioEoJQnKmvWYwMbVO3 q1CYQ52brrjdgRYQooqcBpfZrQaTKT4AgmNaKYVkvySZ2S249duicUZR X-Gm-Gg: AeBDiev6BE+q19GQJVkL+4nhY7FCkp1i1uG2SSE8/JndaQGjSeRMAW2To6kqawnODXj 9Wl2PInWae0aVIC9wItc83Zsd2x/n7qqvUhef5su1Vv4jf8h7EsUSn7k5yMJcHLL4AcvdQBhkLl ctzYc4B9Z4QrgIpdpH95eG6t7s9VvBB0VBwwYyI08gPlt1fye6Z4UBDdilpqJxmaNyQ7Vg0ahEj gEtiHFkM5ZpIxTM/5ynsz8DrEere7CXoW5bvpUwTcOkh0jleaHq9Y6WJY/o+Wl183CDPZqhTS22 bIjRc0eV9FgdoBZ4lJVScacs0Uhxd199UR1/W4hKzxquhIpZyRDpBnFH1vrZxiqiE9rcsVNWW+c 9iDpGumZJ+jdPU9Tm2Hxbo3A49/fXhDDZqiRdVBgTSzJ5eYIrMlIozgVQg73As/A2Wai0r0k4Ed /6JSaBijJd7C5yNNL6g0vV6IwtTtWwpcnse0kYCrP2G5XPg/3V9UV2ZDf3uuwHEmlIhY0R9+463 xjWogtVysCbaIkaSj2Aj5FcUQU= X-Received: by 2002:a17:90b:38c5:b0:35a:2ed:9b6f with SMTP id 98e67ed59e1d1-3613feea4edmr16697610a91.0.1776781532609; Tue, 21 Apr 2026 07:25:32 -0700 (PDT) Received: from cchengyang.duckdns.org (36-225-97-241.dynamic-ip.hinet.net. [36.225.97.241]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-36141868906sm14170953a91.3.2026.04.21.07.25.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Apr 2026 07:25:32 -0700 (PDT) Date: Tue, 21 Apr 2026 22:25:28 +0800 From: Cheng-Yang Chou To: Tejun Heo Cc: void@manifault.com, arighi@nvidia.com, changwoo@igalia.com, sched-ext@lists.linux.dev, emil@etsalapatis.com, linux-kernel@vger.kernel.org, Ching-Chun Huang , Chia-Ping Tsai Subject: Re: [PATCH 05/16] sched_ext: Make scx_enable() take scx_enable_cmd Message-ID: <20260421215905.G1ac3@cchengyang.duckdns.org> References: <20260421071945.3110084-1-tj@kernel.org> <20260421071945.3110084-6-tj@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=us-ascii Content-Disposition: inline In-Reply-To: <20260421071945.3110084-6-tj@kernel.org> Hi Tejun, On Mon, Apr 20, 2026 at 09:19:34PM -1000, Tejun Heo wrote: > Pass struct scx_enable_cmd to scx_enable() rather than unpacking @ops > at every call site and re-packing into a fresh cmd inside. bpf_scx_reg() > now builds the cmd on its stack and hands it in; scx_enable() just > wires up the kthread work and waits. Verified stack lifetime. Reviewed-by: Cheng-Yang Chou > > Relocate struct scx_enable_cmd above scx_alloc_and_add_sched() so > upcoming patches that also want the cmd can see it. > > No behavior change. > > Signed-off-by: Tejun Heo > --- > kernel/sched/ext.c | 46 +++++++++++++++++++++++----------------------- > 1 file changed, 23 insertions(+), 23 deletions(-) > > diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c > index 74e4271e44e9..62aab432dbf4 100644 > --- a/kernel/sched/ext.c > +++ b/kernel/sched/ext.c > @@ -6424,6 +6424,19 @@ static struct scx_sched_pnode *alloc_pnode(struct scx_sched *sch, int node) > return pnode; > } > > +/* > + * scx_enable() is offloaded to a dedicated system-wide RT kthread to avoid > + * starvation. During the READY -> ENABLED task switching loop, the calling > + * thread's sched_class gets switched from fair to ext. As fair has higher > + * priority than ext, the calling thread can be indefinitely starved under > + * fair-class saturation, leading to a system hang. > + */ > +struct scx_enable_cmd { > + struct kthread_work work; > + struct sched_ext_ops *ops; > + int ret; > +}; > + > /* > * Allocate and initialize a new scx_sched. @cgrp's reference is always > * consumed whether the function succeeds or fails. > @@ -6655,19 +6668,6 @@ static int validate_ops(struct scx_sched *sch, const struct sched_ext_ops *ops) > return 0; > } > > -/* > - * scx_enable() is offloaded to a dedicated system-wide RT kthread to avoid > - * starvation. During the READY -> ENABLED task switching loop, the calling > - * thread's sched_class gets switched from fair to ext. As fair has higher > - * priority than ext, the calling thread can be indefinitely starved under > - * fair-class saturation, leading to a system hang. > - */ > -struct scx_enable_cmd { > - struct kthread_work work; > - struct sched_ext_ops *ops; > - int ret; > -}; > - > static void scx_root_enable_workfn(struct kthread_work *work) > { > struct scx_enable_cmd *cmd = container_of(work, struct scx_enable_cmd, work); > @@ -7243,11 +7243,10 @@ static s32 __init scx_cgroup_lifetime_notifier_init(void) > core_initcall(scx_cgroup_lifetime_notifier_init); > #endif /* CONFIG_EXT_SUB_SCHED */ > > -static s32 scx_enable(struct sched_ext_ops *ops, struct bpf_link *link) > +static s32 scx_enable(struct scx_enable_cmd *cmd, struct bpf_link *link) > { > static struct kthread_worker *helper; > static DEFINE_MUTEX(helper_mutex); > - struct scx_enable_cmd cmd; > > if (!cpumask_equal(housekeeping_cpumask(HK_TYPE_DOMAIN), > cpu_possible_mask)) { > @@ -7271,16 +7270,15 @@ static s32 scx_enable(struct sched_ext_ops *ops, struct bpf_link *link) > } > > #ifdef CONFIG_EXT_SUB_SCHED > - if (ops->sub_cgroup_id > 1) > - kthread_init_work(&cmd.work, scx_sub_enable_workfn); > + if (cmd->ops->sub_cgroup_id > 1) > + kthread_init_work(&cmd->work, scx_sub_enable_workfn); > else > #endif /* CONFIG_EXT_SUB_SCHED */ > - kthread_init_work(&cmd.work, scx_root_enable_workfn); > - cmd.ops = ops; > + kthread_init_work(&cmd->work, scx_root_enable_workfn); > > - kthread_queue_work(READ_ONCE(helper), &cmd.work); > - kthread_flush_work(&cmd.work); > - return cmd.ret; > + kthread_queue_work(READ_ONCE(helper), &cmd->work); > + kthread_flush_work(&cmd->work); > + return cmd->ret; > } > > > @@ -7452,7 +7450,9 @@ static int bpf_scx_check_member(const struct btf_type *t, > > static int bpf_scx_reg(void *kdata, struct bpf_link *link) > { > - return scx_enable(kdata, link); > + struct scx_enable_cmd cmd = { .ops = kdata }; > + > + return scx_enable(&cmd, link); > } > > static void bpf_scx_unreg(void *kdata, struct bpf_link *link) > -- > 2.53.0 > > -- Cheers, Cheng-Yang