From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) (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 35D4848425A for ; Fri, 21 Aug 2026 11:46:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.47 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787312782; cv=none; b=b/I6wABI01pqvRhvFhn3FmwBYRAfTKAk67Bn/Qsy+74Lx0pJvI/jayIOVFfNk8rs34Xu7VnQ5JpFg7jPudHYqe/3Q/+YW+hAs1qPsUp6X1gr3j7GG1alB6MLkaMyoh5O7Q7rLIIhFQqWTpgMol2cMJ4r7mcbefZ08+ET0rdM/dc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787312782; c=relaxed/simple; bh=iywtAefJH0cp2WybM/S8fmGeCE9JjoLPwGt8j0B0bos=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=rk4XnPqsRlvohBodAHYev1BdZMEOnP4t1zKyj+y4huV1x9DGGwshhdc6iJkN92KT/8iCi19pVjZVQfMElhhwojyGKVnj9RJ6EqvxrlDtYnK+KcDRzOuLH489oOEyeFy+vOtBZ20AR17YLTyOu2C6rdxBTyGzOWCpHM+ZOadmU5w= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=NZVJRxCr; arc=none smtp.client-ip=209.85.208.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="NZVJRxCr" Received: by mail-ed1-f47.google.com with SMTP id 4fb4d7f45d1cf-69f7fa1c548so1903071a12.2 for ; Fri, 21 Aug 2026 04:46:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1787312775; x=1787917575; darn=vger.kernel.org; h=in-reply-to:content-transfer-encoding:content-disposition :content-type:mime-version:references:message-id:subject:cc:to:from :date:from:to:cc:subject:date:message-id:reply-to:content-type; bh=c1MWicBPO6iNH4zdYEFKHlPXKcGPe09DuWRp2ts42Yg=; b=NZVJRxCrH4mUvbwg+O8RArxBdbC4jwgn3KVtOUMUW5sWOcuaJ1SfF4MhASk3FYPDkX isJAMbX8q1QXXyeH5Wb7vQEOSwTloT2zbOTqiZpyg2+StAfAVKuXD1fG9X9thtUVohm7 1Frm2jwTy8/wf2q1c3jkeHgRQLK7F8Ks3P8OeVan/Ie1/jIrzowyMzIhDMqcHNyg+lfs 2wU7yYJtsHpxNOFAYv7j8LA+jFIV73J5pGTBO7/DHAXv1T/zd9YglGm9CX8Q65QsWz0n PyVabgbZ9P+uuskVCJnX+SOEU2MEM9NLH0eZygsm87RjCtSeQeHdHROnb7M4ZK0pOauC GbpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787312775; x=1787917575; h=in-reply-to:content-transfer-encoding:content-disposition :content-type: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:content-type; bh=c1MWicBPO6iNH4zdYEFKHlPXKcGPe09DuWRp2ts42Yg=; b=qXfdyYFCpHAFVH9GHqgNpsm1w0eU8NI9TWKqfcrryRKqgLwUb4ZzP5VuBMvAdLvv0J L+z9IRajMAeBuz7Qe3fsFgVR8hZ0sRRGXrgV+OarFB6m7nWHxHIZc8zEgm6QihMIWNSg b4BxiQqCJFUu1kH0kFI0SBq4zoMmngpDLayHI6cvs8eo3iqLyjSMB4xc2eZHamFlgkfg 5TkybckXT/Q+4lsFDb+lsgQfd+b23EyFZfi7qIBiwttzceSi9g6lVVx5aStE/lXNWoEm Z5CEgnJ6br5qdh81dPmJI7FCGf/f9lRxEICERp1e/x5GDKgZ/H6QzqXQc4nLCjUY2xAl eBWg== X-Gm-Message-State: AFuF++mI3k4J+HA5hDEmAzclGCEzGIE5VEtBm1bjwdsUOyYWDr2glo12 3t6WFE7FlfxMMX+7B7AaMf2CMp1nUStwlurHm8h+KPVwXpX6IydRSLAFaHS4FSWzluc= X-Gm-Gg: AR+sD10adnZWKfspp982mL2OcYFJqwWN1KhqOmMMHdJGzVIIoXlyHwo79y6tONdG+E8 GQZRt453MyGAtm9oqIt0VeUEFi032nSVrIfi3bpsLAK8n1u8MJdkuy2NZi/FkrSIqQUNIeysWrx ii6qy19zrxNynVaxiRr8tcqmdn023pcxh7wKJzsTZPZvKk8mVqfM45DNwjyBdBGLK3BDsgzASmn BzgojVoE/s9aQGChoVQNben85tQy6ypJLfs3VmMM0FkUfK+gUrMCAN2ItQkuyBNrk9NGqh9wDgt VyiO6DySYsOyCwIr/95s1cNsjqM3Sf3BitzUEELbmjlj9fnvzkARBSufnz9dqN8bZ2KtTg1/pVd snacIDyvKcEIINsIVr9P3YbVB7hzZAxKNcGr0ZxwtP6pXf+cPXrW8HVpKeNM96XGHYzy6IKeYea TnJ4yTS7dIahoW1y9pyGlpndI6u99Sxc+Rnlb0pPcshWhmWYhVFlf+l0b9qoyKVxp72dTJ5g6Sz w== X-Received: by 2002:a05:6402:2353:b0:6a1:f95b:8cef with SMTP id 4fb4d7f45d1cf-6a42f179014mr5348858a12.4.1787312768371; Fri, 21 Aug 2026 04:46:08 -0700 (PDT) Received: from localhost (109-81-81-112.rct.o2.cz. [109.81.81.112]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6a3ff0c327asm6269903a12.8.2026.08.21.04.46.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Aug 2026 04:46:08 -0700 (PDT) Date: Fri, 21 Aug 2026 13:46:06 +0200 From: Michal Hocko To: Sebastian Andrzej Siewior Cc: linux-kernel@vger.kernel.org, linux-rt-devel@lists.linux.dev, Ben Segall , Boqun Feng , Clark Williams , David Woodhouse , Dietmar Eggemann , Ingo Molnar , Juri Lelli , K Prateek Nayak , Mel Gorman , Peter Zijlstra , Sean Young , Steven Rostedt , Thierry Reding , Valentin Schneider , Vincent Guittot , Waiman Long , Will Deacon Subject: Re: [PATCH] sched: Allow sleeping spinlocks on PREEMPT_RT within non_block_start()/end block. Message-ID: References: <20260821095755.am1-Segb@linutronix.de> 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-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20260821095755.am1-Segb@linutronix.de> On Fri 21-08-26 11:57:55, Sebastian Andrzej Siewior wrote: > Commit 312364f3534cc ("kernel.h: Add non_block_start/end()") added > non_block_star()/end(). The intention was to catch any callbacks which > depend on locks or sleep able conditionals in order to ensure forward > progress. According to the commit message spinlocks were excluded > "because spinlocks can't have an indirect dependency upon the page > allocator…". > On PREEMPT_RT this leads to a splat because spinlock_t and rwlock_t are > turned into a sleeping spinlock which have a might_sleep() as they could > schedule() on lock contention. > > Besids mm, the other used of non_block_start() is pwm. Here the hrtimer > can acnqure a spinlock_t on RT and I can't tell other user but I assume > it is not atomic on RT since it wouldn't be able to acquire its own > (spinlock_t) lock. > > Since spinlock_t (and rwlock_t) are not problem, add a sleeping_lock > argument to __might_resched() signaling if this is scheduling request > is from a sleeping lock (true) or regular scheduling request (false). > Add the `true' argument to rtlock_might_resched() which is used on > PREEMPT_RT for both sleeping lock types. This definitely makes a lot of sense to me. It looks like a straightforward solution for false positives. The patch looks good to me, I do not feel qualified to give you Acked-by though. Thanks! > Cc: Michal Hocko > Cc: David Woodhouse > Cc: Sean Young > Cc: Thierry Reding > Signed-off-by: Sebastian Andrzej Siewior > --- > include/linux/kernel.h | 5 +++-- > include/linux/sched.h | 24 ++++++++++++------------ > kernel/locking/spinlock_rt.c | 2 +- > kernel/sched/core.c | 7 ++++--- > 4 files changed, 20 insertions(+), 18 deletions(-) > > diff --git a/include/linux/kernel.h b/include/linux/kernel.h > index e5570a16cbb1a..fbafdfe9bdb78 100644 > --- a/include/linux/kernel.h > +++ b/include/linux/kernel.h > @@ -70,7 +70,8 @@ extern int dynamic_might_resched(void); > #endif /* CONFIG_PREEMPT_* */ > > #ifdef CONFIG_DEBUG_ATOMIC_SLEEP > -extern void __might_resched(const char *file, int line, unsigned int offsets); > +extern void __might_resched(const char *file, int line, unsigned int offsets, > + bool rt_sleeping_lock); > extern void __might_sleep(const char *file, int line); > extern void __cant_sleep(const char *file, int line, int preempt_offset); > extern void __cant_migrate(const char *file, int line); > @@ -128,7 +129,7 @@ extern void __cant_migrate(const char *file, int line); > # define non_block_end() WARN_ON(current->non_block_count-- == 0) > #else > static inline void __might_resched(const char *file, int line, > - unsigned int offsets) { } > + unsigned int offsets, bool rt_sleeping_lock) { } > static inline void __might_sleep(const char *file, int line) { } > # define might_sleep() do { might_resched(); } while (0) > # define cant_sleep() do { } while (0) > diff --git a/include/linux/sched.h b/include/linux/sched.h > index 373bcc0598d10..650e42d55e1e8 100644 > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -2158,9 +2158,9 @@ static inline int _cond_resched(void) > > #endif /* !CONFIG_PREEMPTION || CONFIG_PREEMPT_DYNAMIC */ > > -#define cond_resched() ({ \ > - __might_resched(__FILE__, __LINE__, 0); \ > - _cond_resched(); \ > +#define cond_resched() ({ \ > + __might_resched(__FILE__, __LINE__, 0, false); \ > + _cond_resched(); \ > }) > > extern int __cond_resched_lock(spinlock_t *lock) __must_hold(lock); > @@ -2186,19 +2186,19 @@ extern int __cond_resched_rwlock_write(rwlock_t *lock) __must_hold(lock); > (PREEMPT_LOCK_OFFSET + (1U << MIGHT_RESCHED_RCU_SHIFT)) > #endif > > -#define cond_resched_lock(lock) ({ \ > - __might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS); \ > - __cond_resched_lock(lock); \ > +#define cond_resched_lock(lock) ({ \ > + __might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS, false); \ > + __cond_resched_lock(lock); \ > }) > > -#define cond_resched_rwlock_read(lock) ({ \ > - __might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS); \ > - __cond_resched_rwlock_read(lock); \ > +#define cond_resched_rwlock_read(lock) ({ \ > + __might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS, false); \ > + __cond_resched_rwlock_read(lock); \ > }) > > -#define cond_resched_rwlock_write(lock) ({ \ > - __might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS); \ > - __cond_resched_rwlock_write(lock); \ > +#define cond_resched_rwlock_write(lock) ({ \ > + __might_resched(__FILE__, __LINE__, PREEMPT_LOCK_RESCHED_OFFSETS, false); \ > + __cond_resched_rwlock_write(lock); \ > }) > > #ifndef CONFIG_PREEMPT_RT > diff --git a/kernel/locking/spinlock_rt.c b/kernel/locking/spinlock_rt.c > index 1d5e1b3c60bfa..0a89e7f10af18 100644 > --- a/kernel/locking/spinlock_rt.c > +++ b/kernel/locking/spinlock_rt.c > @@ -33,7 +33,7 @@ > (rcu_preempt_depth() << MIGHT_RESCHED_RCU_SHIFT) > > #define rtlock_might_resched() \ > - __might_resched(__FILE__, __LINE__, RTLOCK_RESCHED_OFFSETS) > + __might_resched(__FILE__, __LINE__, RTLOCK_RESCHED_OFFSETS, true) > > static __always_inline void rtlock_lock(struct rt_mutex_base *rtm) > { > diff --git a/kernel/sched/core.c b/kernel/sched/core.c > index 96226707c2f61..ee0fbb41fc61c 100644 > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -9123,7 +9123,7 @@ void __might_sleep(const char *file, int line) > (void *)current->task_state_change, > (void *)current->task_state_change); > > - __might_resched(file, line, 0); > + __might_resched(file, line, 0, false); > } > EXPORT_SYMBOL(__might_sleep); > > @@ -9148,7 +9148,8 @@ static inline bool resched_offsets_ok(unsigned int offsets) > return nested == offsets; > } > > -void __might_resched(const char *file, int line, unsigned int offsets) > +void __might_resched(const char *file, int line, unsigned int offsets, > + bool rt_sleeping_lock) > { > /* Ratelimiting timestamp: */ > static unsigned long prev_jiffy; > @@ -9159,7 +9160,7 @@ void __might_resched(const char *file, int line, unsigned int offsets) > rcu_sleep_check(); > > if ((resched_offsets_ok(offsets) && !irqs_disabled() && > - !is_idle_task(current) && !current->non_block_count) || > + !is_idle_task(current) && (rt_sleeping_lock || !current->non_block_count)) || > system_state == SYSTEM_BOOTING || system_state > SYSTEM_RUNNING || > oops_in_progress) > return; > -- > 2.55.0 -- Michal Hocko SUSE Labs