fs: switch f_iocb_flags and f_ra
authorChristian Brauner <brauner@kernel.org>
Thu, 22 Aug 2024 14:14:46 +0000 (16:14 +0200)
committerChristian Brauner <brauner@kernel.org>
Wed, 28 Aug 2024 11:06:12 +0000 (13:06 +0200)
Now that we shrank struct file by 24 bytes we still have a 4 byte hole.
If we move struct file_ra_state into the union and f_iocb_flags out of
the union we close that whole and bring down struct file to 192 bytes.
Which means struct file is 3 cachelines and we managed to shrink it by
40 bytes this cycle.

I've tried to audit all codepaths that use f_ra and none of them seem to
rely on it in file->f_op->release() and never have since commit
1da177e4c3f4 ("Linux-2.6.12-rc2").

Link: https://lore.kernel.org/r/20240823-luftdicht-berappen-d69a2166a0db@brauner
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Christian Brauner <brauner@kernel.org>
include/linux/fs.h

index 7af239ca87e290fa9ba15cabd6f4eb1b2c0fc33d..095a956aeb296f2ed6faf8b066e0bd195c718fe1 100644 (file)
@@ -999,9 +999,9 @@ struct file {
                struct callback_head    f_task_work;
                /* fput() must use workqueue (most kernel threads). */
                struct llist_node       f_llist;
-               unsigned int            f_iocb_flags;
+               /* Invalid after last fput(). */
+               struct file_ra_state    f_ra;
        };
-
        /*
         * Protects f_ep, f_flags.
         * Must not be taken from IRQ context.
@@ -1012,9 +1012,9 @@ struct file {
        struct mutex            f_pos_lock;
        loff_t                  f_pos;
        unsigned int            f_flags;
+       unsigned int            f_iocb_flags;
        struct fown_struct      *f_owner;
        const struct cred       *f_cred;
-       struct file_ra_state    f_ra;
        struct path             f_path;
        struct inode            *f_inode;       /* cached value */
        const struct file_operations    *f_op;