• William Cohen's avatar
    reduce size of task_struct on 64-bit machines · 97dc32cd
    William Cohen authored
    This past week I was playing around with that pahole tool
    (http://oops.ghostprotocols.net:81/acme/dwarves/) and looking at the size
    of various struct in the kernel.  I was surprised by the size of the
    task_struct on x86_64, approaching 4K.  I looked through the fields in
    task_struct and found that a number of them were declared as "unsigned
    long" rather than "unsigned int" despite them appearing okay as 32-bit
    sized fields.  On x86_64 "unsigned long" ends up being 8 bytes in size and
    forces 8 byte alignment.  Is there a reason there a reason they are
    "unsigned long"?
    
    The patch below drops the size of the struct from 3808 bytes (60 64-byte
    cachelines) to 3760 bytes (59 64-byte cachelines).  A couple other fields
    in the task struct take a signficant amount of space:
    
    struct thread_struct       thread;               688
    struct held_lock           held_locks[30];       1680
    
    CONFIG_LOCKDEP is turned on in the .config
    
    [akpm@linux-foundation.org: fix printk warnings]
    Cc: <linux-arch@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    97dc32cd
array.c 11.8 KB