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@goodmis.org wrote:
On Tue, 28 May 2024 07:51:30 +0300 Ilkka Naulapää digirigawa@gmail.com 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;
};