applied your patch without others, so trace and panic there. Screenshot attached. Also tested kernels backward and found out that this trace bug first triggered on 6.6-rc1. Let me know if you need more assistance with this. --Ilkka On Tue, May 28, 2024 at 9:47 PM Steven Rostedt <rostedt@xxxxxxxxxxx> wrote: > > On Tue, 28 May 2024 07:51:30 +0300 > Ilkka Naulapää <digirigawa@xxxxxxxxx> wrote: > > > yeah, the cache_from_obj tracing bug (without panic) has been > > displayed quite some time now - maybe even since 6.7.x or so. I could > > try checking a few versions back for this and try bisecting it if I > > can find when this started. > > > > OK, so I don't think the commit your last bisect hit is the cause of > the bug. It added a delay (via RCU) and is causing the real bug to blow > up more. > > Can you add this patch to v6.9.2 and hopefully it crashes in a better > location that we can find where the mixup happened. > > You may need to add the other commit (too if this doesn't trigger. > > Thanks, > > -- Steve > > diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c > index 417c840e6403..7af3f696696d 100644 > --- a/fs/tracefs/inode.c > +++ b/fs/tracefs/inode.c > @@ -50,6 +50,7 @@ static struct inode *tracefs_alloc_inode(struct super_block *sb) > list_add_rcu(&ti->list, &tracefs_inodes); > spin_unlock_irqrestore(&tracefs_inode_lock, flags); > > + ti->magic = 20240823; > return &ti->vfs_inode; > } > > @@ -66,6 +67,7 @@ static void tracefs_free_inode(struct inode *inode) > struct tracefs_inode *ti = get_tracefs(inode); > unsigned long flags; > > + BUG_ON(ti->magic != 20240823); > spin_lock_irqsave(&tracefs_inode_lock, flags); > list_del_rcu(&ti->list); > spin_unlock_irqrestore(&tracefs_inode_lock, flags); > @@ -271,16 +273,6 @@ static const struct inode_operations tracefs_file_inode_operations = { > .setattr = tracefs_setattr, > }; > > -struct inode *tracefs_get_inode(struct super_block *sb) > -{ > - struct inode *inode = new_inode(sb); > - if (inode) { > - inode->i_ino = get_next_ino(); > - simple_inode_init_ts(inode); > - } > - return inode; > -} > - > struct tracefs_mount_opts { > kuid_t uid; > kgid_t gid; > @@ -448,6 +440,17 @@ static const struct super_operations tracefs_super_operations = { > .show_options = tracefs_show_options, > }; > > +struct inode *tracefs_get_inode(struct super_block *sb) > +{ > + struct inode *inode = new_inode(sb); > + BUG_ON(sb->s_op != &tracefs_super_operations); > + if (inode) { > + inode->i_ino = get_next_ino(); > + simple_inode_init_ts(inode); > + } > + return inode; > +} > + > /* > * It would be cleaner if eventfs had its own dentry ops. > * > diff --git a/fs/tracefs/internal.h b/fs/tracefs/internal.h > index f704d8348357..dda7d2708e30 100644 > --- a/fs/tracefs/internal.h > +++ b/fs/tracefs/internal.h > @@ -16,6 +16,7 @@ struct tracefs_inode { > }; > /* The below gets initialized with memset_after(ti, 0, vfs_inode) */ > struct list_head list; > + unsigned long magic; > unsigned long flags; > void *private; > };
Attachment:
6.9.2-steve-patch.jpeg
Description: JPEG image