From nobody Wed Jun 17 05:13:55 2026 Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) (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 CCA822D780A for ; Wed, 22 Apr 2026 20:23:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=216.40.44.11 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776889403; cv=none; b=TkScnVpBPkPOmtameG2Zeq4rMU0FZYWp8MtCPm5ZsEKkaXHF4lcFXEWpat6klaE9fE9LjOzbHvXyykseHEx49dOLBLxSvOi2FpkMxJXKbe9J2jrW1izyuM2UXVWQsIIl6SNXvdnOT+Dd2meU0mRN4o0keokVH/u8F9SV99ua400= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776889403; c=relaxed/simple; bh=RkKFUZvAxeBALNaBOF8Vi1XM/SqjuIiCUVivxRNJFnQ=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type; b=KAwwboodSfQEu7XeT2d73OVYx7SAgY+Fob4JmDiYygX4pT/R0N6raAngZM/MlSt7jmr7ot2k8BZf/8xlP0YofHV/dMjmDC/rJNljHJ23efH48C9l3dcqejuJGdkEDGe+1th7yyXwtQZcL6VUImCWksmXInxK1ZkzbPibJ836ZqM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=goodmis.org; spf=pass smtp.mailfrom=goodmis.org; arc=none smtp.client-ip=216.40.44.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=goodmis.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=goodmis.org Received: from omf10.hostedemail.com (lb01b-stub [10.200.18.250]) by unirelay03.hostedemail.com (Postfix) with ESMTP id CE086A026D; Wed, 22 Apr 2026 20:22:57 +0000 (UTC) Received: from [HIDDEN] (Authenticated sender: rostedt@goodmis.org) by omf10.hostedemail.com (Postfix) with ESMTPA id 1FA702AE; Wed, 22 Apr 2026 20:14:11 +0000 (UTC) Date: Wed, 22 Apr 2026 16:14:12 -0400 From: Steven Rostedt To: Linus Torvalds Cc: LKML , David Carlier , Masami Hiramatsu , Mathieu Desnoyers Subject: [GIT PULL] tracefs: Fixes for 7.1 Message-ID: <20260422161412.0d5ede91@gandalf.local.home> X-Mailer: Claws Mail 3.20.0git84 (GTK+ 2.24.33; x86_64-pc-linux-gnu) 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 X-Rspamd-Server: rspamout05 X-Rspamd-Queue-Id: 1FA702AE X-Stat-Signature: 73udgr7ax9khqrnumopjpa3rnp1ahnjt X-Session-Marker: 726F737465647440676F6F646D69732E6F7267 X-Session-ID: U2FsdGVkX18uuYytatbbsQ74/dXiQf76sx+yX05UW9A= X-HE-Tag: 1776888851-28810 X-HE-Meta: U2FsdGVkX1/s0OoApJow9Nl5AvrNWQxA6sk2HaZCvXDcAfZ1pSdrTts7GCtuQn4aL3TRMZG5oBM= Content-Type: text/plain; charset="utf-8" Linus, tracefs fixes for v7.1: - Use list_add_tail_rcu() for walking eventfs children The children link list is protected by SRCU and list walkers can walk the list with only using SRCU. Using just list_add_tail() on weakly ordered architectures can cause issues. Instead use list_add_tail_rcu(). - Hold eventfs_mutex and SRCU for remount walk events The trace_apply_options() walks the tracefs_inodes where some are eventfs inodes and eventfs_remount() is called which in turn calls eventfs_set_attr(). This walk only holds normal RCU read locks, but the eventfs_mutex and SRCU should be held. Add a eventfs_remount_(un)lock() helpers to take the necessary locks before iterating the list. Please pull the latest tracefs-v7.1-2 tree, which can be found at: git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git tracefs-v7.1-2 Tag SHA1: b4cea69eb510485f63ba2b1253fd83e4fbccdd84 Head SHA1: 07004a8c4b572171934390148ee48c4175c77eed David Carlier (2): eventfs: Use list_add_tail_rcu() for SRCU-protected children list eventfs: Hold eventfs_mutex and SRCU when remount walks events ---- fs/tracefs/event_inode.c | 16 +++++++++++++++- fs/tracefs/inode.c | 5 ++++- fs/tracefs/internal.h | 3 +++ 3 files changed, 22 insertions(+), 2 deletions(-) --------------------------- diff --git a/fs/tracefs/event_inode.c b/fs/tracefs/event_inode.c index 81df94038f2e..26b6453de30e 100644 --- a/fs/tracefs/event_inode.c +++ b/fs/tracefs/event_inode.c @@ -244,6 +244,8 @@ static void eventfs_set_attrs(struct eventfs_inode *ei,= bool update_uid, kuid_t { struct eventfs_inode *ei_child; =20 + lockdep_assert_held(&eventfs_mutex); + /* Update events// */ if (WARN_ON_ONCE(level > 3)) return; @@ -706,7 +708,7 @@ struct eventfs_inode *eventfs_create_dir(const char *na= me, struct eventfs_inode =20 scoped_guard(mutex, &eventfs_mutex) { if (!parent->is_freed) - list_add_tail(&ei->list, &parent->children); + list_add_tail_rcu(&ei->list, &parent->children); } /* Was the parent freed? */ if (list_empty(&ei->list)) { @@ -886,3 +888,15 @@ void eventfs_remove_events_dir(struct eventfs_inode *e= i) d_invalidate(dentry); d_make_discardable(dentry); } + +int eventfs_remount_lock(void) +{ + mutex_lock(&eventfs_mutex); + return srcu_read_lock(&eventfs_srcu); +} + +void eventfs_remount_unlock(int srcu_idx) +{ + srcu_read_unlock(&eventfs_srcu, srcu_idx); + mutex_unlock(&eventfs_mutex); +} diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c index 5602baf980f6..1e8a78c5e996 100644 --- a/fs/tracefs/inode.c +++ b/fs/tracefs/inode.c @@ -313,6 +313,7 @@ static int tracefs_apply_options(struct super_block *sb= , bool remount) struct inode *inode =3D d_inode(sb->s_root); struct tracefs_inode *ti; bool update_uid, update_gid; + int srcu_idx; umode_t tmp_mode; =20 /* @@ -337,6 +338,7 @@ static int tracefs_apply_options(struct super_block *sb= , bool remount) update_uid =3D fsi->opts & BIT(Opt_uid); update_gid =3D fsi->opts & BIT(Opt_gid); =20 + srcu_idx =3D eventfs_remount_lock(); rcu_read_lock(); list_for_each_entry_rcu(ti, &tracefs_inodes, list) { if (update_uid) { @@ -358,6 +360,7 @@ static int tracefs_apply_options(struct super_block *sb= , bool remount) eventfs_remount(ti, update_uid, update_gid); } rcu_read_unlock(); + eventfs_remount_unlock(srcu_idx); } =20 return 0; @@ -403,7 +406,7 @@ static int tracefs_drop_inode(struct inode *inode) * This inode is being freed and cannot be used for * eventfs. Clear the flag so that it doesn't call into * eventfs during the remount flag updates. The eventfs_inode - * gets freed after an RCU cycle, so the content will still + * gets freed after an SRCU cycle, so the content will still * be safe if the iteration is going on now. */ ti->flags &=3D ~TRACEFS_EVENT_INODE; diff --git a/fs/tracefs/internal.h b/fs/tracefs/internal.h index d83c2a25f288..a4a7f8431aff 100644 --- a/fs/tracefs/internal.h +++ b/fs/tracefs/internal.h @@ -76,4 +76,7 @@ struct inode *tracefs_get_inode(struct super_block *sb); void eventfs_remount(struct tracefs_inode *ti, bool update_uid, bool updat= e_gid); void eventfs_d_release(struct dentry *dentry); =20 +int eventfs_remount_lock(void); +void eventfs_remount_unlock(int srcu_idx); + #endif /* _TRACEFS_INTERNAL_H */