Re: [PATCH 3/4] fs/resctrl: Fix deadlock for errors during mount

From: Chen, Yu C

Date: Tue May 12 2026 - 23:25:12 EST


Hi Reinette,
On 5/12/2026 10:34 PM, Reinette Chatre wrote:
Hi Chenyu,

On 5/12/26 12:28 AM, Chen, Yu C wrote:
On 5/12/2026 6:53 AM, Reinette Chatre wrote:
Hi Tony,

On 5/8/26 11:21 AM, Tony Luck wrote:

+     * Obtain reference with locks held to protect against interference
+     * from resctrl_exit().
+    */
+    kernfs_get(rdt_root_kn);

[ ... ]

@@ -3130,6 +3144,7 @@ static int rdt_get_tree(struct fs_context *fc)
       */
      if (!ctx->kfc.new_sb_created)
          resctrl_unmount();
+    kernfs_put(rdt_root_kn);

I wonder if above should be protected against
    cpus_read_lock();
    mutex_lock(&rdtgroup_mutex);
like kernfs_get()?

It is not obvious to me what this protection would be needed for.
Do you have a troublesome scenario in mind?

rdt_root_kn is a local copy of rdtgroup_default.kn. The latter is indeed
protected by the mutex. The reason why the kernfs_get() is protected
by the mutex is to ensure what rdt_root_kn points to, rdtgroup_default.kn, remains
accessible after the mutex is dropped. Nothing else modifies rdt_root_kn. I
understand the appeal of symmetry but it is not clear to me what the extra
locking is needed for here?


Thanks for the detailed explanation. I now agree there is no need to
protect kernfs_put() with a lock here only for symmetry reason. I
previously thought racing conditions would occur if two code paths
concurrently enter kernfs_put() and target the same data area.
However, since kernfs_put() contains an atomic compare, only one
code path can proceed, making the operation safe.

Could it perhaps make this flow easier to understand if the kernfs_get() is
of the mutex protected rdtgroup_default.kn while the kernfs_put() is
of the local backup copy? For example:

/* Ensure root kn remains accessible after mutex is unlocked */
kernfs_get(rdtgroup_default.kn);
/*
* Make backup of rdtgroup_default.kn just in case one of the
* following flows (that sets rdtgroup_default.kn to NULL) run after
* the mutex is unlocked:
* resctrl_exit()->resctrl_fs_teardown()->rdtgroup_destroy_root()
* kernfs_get_tree()->deactivate_locked_super()->rdt_kill_sb()->resctrl_unmount()->resctrl_fs_teardown()->rdtgroup_destroy_root()
* These flows would not actually result in rdtgroup_default.kn
* being removed thanks to the additional reference.
/

Yes, this comment is very clear and helpful.

thanks,
Chenyu