lkml.org 
[lkml]   [2006]   [Jul]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch] uninline init_waitqueue_*() functions
    Subject: uninline init_waitqueue_*() functions
    From: Ingo Molnar <mingo@elte.hu>

    some wait.h inlines are way too large: init_waitqueue_entry() and
    init_waitqueue_func_entry() generate 20-30 bytes of inlined code
    per call site, and init_waitqueue_head() is 30-40 bytes (on x86).

    allyesconfig vmlinux size delta:

    text data bss dec filename
    21459355 6286210 4520408 32265973 vmlinux.before
    21424564 6281246 4516912 32222722 vmlinux.after

    So 34K (0.16%) of kernel text saved. Not too bad.

    (as an added bonus this also removes a lockdep annotation.)

    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    ---
    include/linux/wait.h | 29 +++--------------------------
    kernel/wait.c | 26 ++++++++++++++++++++++++--
    2 files changed, 27 insertions(+), 28 deletions(-)

    Index: linux/include/linux/wait.h
    ===================================================================
    --- linux.orig/include/linux/wait.h
    +++ linux/include/linux/wait.h
    @@ -77,32 +77,9 @@ struct task_struct;
    #define __WAIT_BIT_KEY_INITIALIZER(word, bit) \
    { .flags = word, .bit_nr = bit, }

    -/*
    - * lockdep: we want one lock-class for all waitqueue locks.
    - */
    -extern struct lock_class_key waitqueue_lock_key;
    -
    -static inline void init_waitqueue_head(wait_queue_head_t *q)
    -{
    - spin_lock_init(&q->lock);
    - lockdep_set_class(&q->lock, &waitqueue_lock_key);
    - INIT_LIST_HEAD(&q->task_list);
    -}
    -
    -static inline void init_waitqueue_entry(wait_queue_t *q, struct task_struct *p)
    -{
    - q->flags = 0;
    - q->private = p;
    - q->func = default_wake_function;
    -}
    -
    -static inline void init_waitqueue_func_entry(wait_queue_t *q,
    - wait_queue_func_t func)
    -{
    - q->flags = 0;
    - q->private = NULL;
    - q->func = func;
    -}
    +extern void init_waitqueue_head(wait_queue_head_t *q);
    +extern void init_waitqueue_entry(wait_queue_t *q, struct task_struct *p);
    +extern void init_waitqueue_func_entry(wait_queue_t *q, wait_queue_func_t func);

    static inline int waitqueue_active(wait_queue_head_t *q)
    {
    Index: linux/kernel/wait.c
    ===================================================================
    --- linux.orig/kernel/wait.c
    +++ linux/kernel/wait.c
    @@ -10,9 +10,31 @@
    #include <linux/wait.h>
    #include <linux/hash.h>

    -struct lock_class_key waitqueue_lock_key;
    +void init_waitqueue_head(wait_queue_head_t *q)
    +{
    + spin_lock_init(&q->lock);
    + INIT_LIST_HEAD(&q->task_list);
    +}
    +
    +EXPORT_SYMBOL(init_waitqueue_head);
    +
    +void init_waitqueue_entry(wait_queue_t *q, struct task_struct *p)
    +{
    + q->flags = 0;
    + q->private = p;
    + q->func = default_wake_function;
    +}
    +
    +EXPORT_SYMBOL(init_waitqueue_entry);
    +
    +void init_waitqueue_func_entry(wait_queue_t *q, wait_queue_func_t func)
    +{
    + q->flags = 0;
    + q->private = NULL;
    + q->func = func;
    +}

    -EXPORT_SYMBOL(waitqueue_lock_key);
    +EXPORT_SYMBOL(init_waitqueue_func_entry);

    void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait)
    {
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2006-07-05 10:59    [W:4.195 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site