All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] kernfs: Relax constraint in draining guard
@ 2025-05-05 12:12 Michal Koutný
  2025-05-05 23:28 ` Tejun Heo
  0 siblings, 1 reply; 5+ messages in thread
From: Michal Koutný @ 2025-05-05 12:12 UTC (permalink / raw)
  To: Chengming Zhou, Greg Kroah-Hartman, Tejun Heo, linux-kernel
  Cc: Michal Koutný, Chen Ridong

The active reference lifecycle provides the break/unbreak mechanism but
the active reference is not truly active after unbreak -- callers don't
use it afterwards but it's important for proper pairing of kn->active
counting. Assuming this mechanism is in place, the WARN check in
kernfs_should_drain_open_files() is too sensitive -- it may transiently
catch those (rightful) callers between
kernfs_unbreak_active_protection() and kernfs_put_active() as found out by Chen
Ridong:

	kernfs_remove_by_name_ns	kernfs_get_active // active=1
	__kernfs_remove					  // active=0x80000002
	kernfs_drain			...
	wait_event
	//waiting (active == 0x80000001)
					kernfs_break_active_protection
					// active = 0x80000001
	// continue
					kernfs_unbreak_active_protection
					// active = 0x80000002
	...
	kernfs_should_drain_open_files
	// warning occurs
					kernfs_put_active

To avoid the false positives (mind panic_on_warn) remove the check altogether.
(This is meant as quick fix, I think active reference break/unbreak may be
simplified with larger rework.)

Fixes: bdb2fd7fc56e1 ("kernfs: Skip kernfs_drain_open_files() more aggressively")
Link: https://lore.kernel.org/r/kmmrseckjctb4gxcx2rdminrjnq2b4ipf7562nvfd432ld5v5m@2byj5eedkb2o/

Cc: Chen Ridong <chenridong@huawei.com>
Signed-off-by: Michal Koutný <mkoutny@suse.com>
---
 fs/kernfs/dir.c  | 5 +++--
 fs/kernfs/file.c | 3 ++-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c
index fc70d72c3fe80..43487fa83eaea 100644
--- a/fs/kernfs/dir.c
+++ b/fs/kernfs/dir.c
@@ -1580,8 +1580,9 @@ void kernfs_break_active_protection(struct kernfs_node *kn)
  * invoked before finishing the kernfs operation.  Note that while this
  * function restores the active reference, it doesn't and can't actually
  * restore the active protection - @kn may already or be in the process of
- * being removed.  Once kernfs_break_active_protection() is invoked, that
- * protection is irreversibly gone for the kernfs operation instance.
+ * being drained and removed.  Once kernfs_break_active_protection() is
+ * invoked, that protection is irreversibly gone for the kernfs operation
+ * instance.
  *
  * While this function may be called at any point after
  * kernfs_break_active_protection() is invoked, its most useful location
diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c
index 66fe8fe41f060..a6c692cac6165 100644
--- a/fs/kernfs/file.c
+++ b/fs/kernfs/file.c
@@ -778,8 +778,9 @@ bool kernfs_should_drain_open_files(struct kernfs_node *kn)
 	/*
 	 * @kn being deactivated guarantees that @kn->attr.open can't change
 	 * beneath us making the lockless test below safe.
+	 * Callers post kernfs_unbreak_active_protection may be counted in
+	 * kn->active by now, do not WARN_ON because of them.
 	 */
-	WARN_ON_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS);
 
 	rcu_read_lock();
 	on = rcu_dereference(kn->attr.open);
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] kernfs: Relax constraint in draining guard
  2025-05-05 12:12 [PATCH] kernfs: Relax constraint in draining guard Michal Koutný
@ 2025-05-05 23:28 ` Tejun Heo
  2025-05-13  9:06   ` Michal Koutný
  0 siblings, 1 reply; 5+ messages in thread
From: Tejun Heo @ 2025-05-05 23:28 UTC (permalink / raw)
  To: Michal Koutný
  Cc: Chengming Zhou, Greg Kroah-Hartman, linux-kernel, Chen Ridong

On Mon, May 05, 2025 at 02:12:00PM +0200, Michal Koutný wrote:
> The active reference lifecycle provides the break/unbreak mechanism but
> the active reference is not truly active after unbreak -- callers don't
> use it afterwards but it's important for proper pairing of kn->active
> counting. Assuming this mechanism is in place, the WARN check in
> kernfs_should_drain_open_files() is too sensitive -- it may transiently
> catch those (rightful) callers between
> kernfs_unbreak_active_protection() and kernfs_put_active() as found out by Chen
> Ridong:
> 
> 	kernfs_remove_by_name_ns	kernfs_get_active // active=1
> 	__kernfs_remove					  // active=0x80000002
> 	kernfs_drain			...
> 	wait_event
> 	//waiting (active == 0x80000001)
> 					kernfs_break_active_protection
> 					// active = 0x80000001
> 	// continue
> 					kernfs_unbreak_active_protection
> 					// active = 0x80000002
> 	...
> 	kernfs_should_drain_open_files
> 	// warning occurs
> 					kernfs_put_active
> 
> To avoid the false positives (mind panic_on_warn) remove the check altogether.
> (This is meant as quick fix, I think active reference break/unbreak may be
> simplified with larger rework.)
> 
> Fixes: bdb2fd7fc56e1 ("kernfs: Skip kernfs_drain_open_files() more aggressively")
> Link: https://lore.kernel.org/r/kmmrseckjctb4gxcx2rdminrjnq2b4ipf7562nvfd432ld5v5m@2byj5eedkb2o/
> 
> Cc: Chen Ridong <chenridong@huawei.com>
> Signed-off-by: Michal Koutný <mkoutny@suse.com>

Acked-by: Tejun Heo <tj@kernel.org>

Thanks.

-- 
tejun

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] kernfs: Relax constraint in draining guard
  2025-05-05 23:28 ` Tejun Heo
@ 2025-05-13  9:06   ` Michal Koutný
  2025-05-13 11:35     ` Tejun Heo
  2025-05-14  9:02     ` Greg Kroah-Hartman
  0 siblings, 2 replies; 5+ messages in thread
From: Michal Koutný @ 2025-05-13  9:06 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Tejun Heo, Chengming Zhou, linux-kernel, Chen Ridong

[-- Attachment #1: Type: text/plain, Size: 192 bytes --]

On Mon, May 05, 2025 at 01:28:22PM -1000, Tejun Heo <tj@kernel.org> wrote:
...
> Acked-by: Tejun Heo <tj@kernel.org>

Is it correct to expect Greg picking it through his repo?

Thanks,
Michal

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] kernfs: Relax constraint in draining guard
  2025-05-13  9:06   ` Michal Koutný
@ 2025-05-13 11:35     ` Tejun Heo
  2025-05-14  9:02     ` Greg Kroah-Hartman
  1 sibling, 0 replies; 5+ messages in thread
From: Tejun Heo @ 2025-05-13 11:35 UTC (permalink / raw)
  To: Michal Koutný
  Cc: Greg Kroah-Hartman, Chengming Zhou, linux-kernel, Chen Ridong

On Tue, May 13, 2025 at 11:06:40AM +0200, Michal Koutný wrote:
> On Mon, May 05, 2025 at 01:28:22PM -1000, Tejun Heo <tj@kernel.org> wrote:
> ...
> > Acked-by: Tejun Heo <tj@kernel.org>
> 
> Is it correct to expect Greg picking it through his repo?

Yes, I think so.

Thanks.

-- 
tejun

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] kernfs: Relax constraint in draining guard
  2025-05-13  9:06   ` Michal Koutný
  2025-05-13 11:35     ` Tejun Heo
@ 2025-05-14  9:02     ` Greg Kroah-Hartman
  1 sibling, 0 replies; 5+ messages in thread
From: Greg Kroah-Hartman @ 2025-05-14  9:02 UTC (permalink / raw)
  To: Michal Koutný; +Cc: Tejun Heo, Chengming Zhou, linux-kernel, Chen Ridong

On Tue, May 13, 2025 at 11:06:40AM +0200, Michal Koutný wrote:
> On Mon, May 05, 2025 at 01:28:22PM -1000, Tejun Heo <tj@kernel.org> wrote:
> ...
> > Acked-by: Tejun Heo <tj@kernel.org>
> 
> Is it correct to expect Greg picking it through his repo?

Yes, I will take this when I catch up with pending patches, thanks.

greg k-h

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-05-14  9:04 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-05 12:12 [PATCH] kernfs: Relax constraint in draining guard Michal Koutný
2025-05-05 23:28 ` Tejun Heo
2025-05-13  9:06   ` Michal Koutný
2025-05-13 11:35     ` Tejun Heo
2025-05-14  9:02     ` Greg Kroah-Hartman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.