lkml.org 
[lkml]   [2007]   [Feb]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectSize of 2.6.20 task_struct on x86_64 machines
    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

    -Will
    --- include/linux/sched.h.compress 2007-02-06 16:16:14.000000000 -0500
    +++ include/linux/sched.h 2007-02-07 18:09:34.000000000 -0500
    @@ -802,8 +802,8 @@
    volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
    struct thread_info *thread_info;
    atomic_t usage;
    - unsigned long flags; /* per process flags, defined below */
    - unsigned long ptrace;
    + unsigned int flags; /* per process flags, defined below */
    + unsigned int ptrace;

    int lock_depth; /* BKL lock depth */

    @@ -826,7 +826,7 @@
    unsigned long long sched_time; /* sched_clock time spent running */
    enum sleep_type sleep_type;

    - unsigned long policy;
    + unsigned int policy;
    cpumask_t cpus_allowed;
    unsigned int time_slice, first_time_slice;

    @@ -846,11 +846,11 @@

    /* task state */
    struct linux_binfmt *binfmt;
    - long exit_state;
    + int exit_state;
    int exit_code, exit_signal;
    int pdeath_signal; /* The signal sent when the parent dies */
    /* ??? */
    - unsigned long personality;
    + unsigned int personality;
    unsigned did_exec:1;
    pid_t pid;
    pid_t tgid;
    @@ -882,7 +882,7 @@
    int __user *set_child_tid; /* CLONE_CHILD_SETTID */
    int __user *clear_child_tid; /* CLONE_CHILD_CLEARTID */

    - unsigned long rt_priority;
    + unsigned int rt_priority;
    cputime_t utime, stime;
    unsigned long nvcsw, nivcsw; /* context switch counts */
    struct timespec start_time;
    \
     
     \ /
      Last update: 2007-02-08 17:19    [W:9.117 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site