• Michal Hocko's avatar
    mm: split gfp_mask and mapping flags into separate fields · 9c5d760b
    Michal Hocko authored
    mapping->flags currently encodes two different things into a single flag.
    It contains sticky gfp_mask for page cache allocations and AS_ codes used
    to report errors/enospace and other states which are mapping specific.
    Condensing the two semantically unrelated things saves few bytes but it
    also complicates other things.  For one thing the gfp flags space is
    reduced and in fact we are already running out of available bits.  It can
    be assumed that more gfp flags will be necessary later on.
    
    To not introduce the address_space grow (at least on x86_64) we can stick
    it right after private_lock because we have a hole there.
    
    struct address_space {
            struct inode *             host;                 /*     0     8 */
            struct radix_tree_root     page_tree;            /*     8    16 */
            spinlock_t                 tree_lock;            /*    24     4 */
            atomic_t                   i_mmap_writable;      /*    28     4 */
            struct rb_root             i_mmap;               /*    32     8 */
            struct rw_semaphore        i_mmap_rwsem;         /*    40    40 */
            /* --- cacheline 1 boundary (64 bytes) was 16 bytes ago --- */
            long unsigned int          nrpages;              /*    80     8 */
            long unsigned int          nrexceptional;        /*    88     8 */
            long unsigned int          writeback_index;      /*    96     8 */
            const struct address_space_operations  * a_ops;  /*   104     8 */
            long unsigned int          flags;                /*   112     8 */
            spinlock_t                 private_lock;         /*   120     4 */
    
            /* XXX 4 bytes hole, try to pack */
    
            /* --- cacheline 2 boundary (128 bytes) --- */
            struct list_head           private_list;         /*   128    16 */
            void *                     private_data;         /*   144     8 */
    
            /* size: 152, cachelines: 3, members: 14 */
            /* sum members: 148, holes: 1, sum holes: 4 */
            /* last cacheline: 24 bytes */
    };
    
    Link: http://lkml.kernel.org/r/20160912114852.GI14524@dhcp22.suse.czSigned-off-by: default avatarMichal Hocko <mhocko@suse.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    9c5d760b
pagemap.h 17.8 KB