lkml.org 
[lkml]   [2017]   [Oct]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 13/13] workqueue: Convert callback to use from_timer()
    Date
    In preparation for unconditionally passing the struct timer_list pointer
    to all timer callbacks, switch workqueue to use from_timer() and pass the
    timer pointer explicitly.

    Cc: Tejun Heo <tj@kernel.org>
    Cc: Lai Jiangshan <jiangshanlai@gmail.com>
    Signed-off-by: Kees Cook <keescook@chromium.org>
    ---
    include/linux/workqueue.h | 15 ++++++++-------
    kernel/workqueue.c | 7 +++----
    2 files changed, 11 insertions(+), 11 deletions(-)

    diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h
    index f4960260feaf..f3c47a05fd06 100644
    --- a/include/linux/workqueue.h
    +++ b/include/linux/workqueue.h
    @@ -17,7 +17,7 @@ struct workqueue_struct;

    struct work_struct;
    typedef void (*work_func_t)(struct work_struct *work);
    -void delayed_work_timer_fn(unsigned long __data);
    +void delayed_work_timer_fn(struct timer_list *t);

    /*
    * The first word is the work queue pointer and the flags rolled into
    @@ -175,8 +175,8 @@ struct execute_work {

    #define __DELAYED_WORK_INITIALIZER(n, f, tflags) { \
    .work = __WORK_INITIALIZER((n).work, (f)), \
    - .timer = __TIMER_INITIALIZER(delayed_work_timer_fn, \
    - (unsigned long)&(n), \
    + .timer = __TIMER_INITIALIZER((TIMER_FUNC_TYPE)delayed_work_timer_fn,\
    + (TIMER_DATA_TYPE)&(n.timer), \
    (tflags) | TIMER_IRQSAFE), \
    }

    @@ -241,8 +241,9 @@ static inline unsigned int work_static(struct work_struct *work) { return 0; }
    #define __INIT_DELAYED_WORK(_work, _func, _tflags) \
    do { \
    INIT_WORK(&(_work)->work, (_func)); \
    - __setup_timer(&(_work)->timer, delayed_work_timer_fn, \
    - (unsigned long)(_work), \
    + __setup_timer(&(_work)->timer, \
    + (TIMER_FUNC_TYPE)delayed_work_timer_fn, \
    + (TIMER_DATA_TYPE)&(_work)->timer, \
    (_tflags) | TIMER_IRQSAFE); \
    } while (0)

    @@ -250,8 +251,8 @@ static inline unsigned int work_static(struct work_struct *work) { return 0; }
    do { \
    INIT_WORK_ONSTACK(&(_work)->work, (_func)); \
    __setup_timer_on_stack(&(_work)->timer, \
    - delayed_work_timer_fn, \
    - (unsigned long)(_work), \
    + (TIMER_FUNC_TYPE)delayed_work_timer_fn,\
    + (TIMER_DATA_TYPE)&(_work)->timer,\
    (_tflags) | TIMER_IRQSAFE); \
    } while (0)

    diff --git a/kernel/workqueue.c b/kernel/workqueue.c
    index a5361fc6215d..c77fdf6bf24f 100644
    --- a/kernel/workqueue.c
    +++ b/kernel/workqueue.c
    @@ -1492,9 +1492,9 @@ bool queue_work_on(int cpu, struct workqueue_struct *wq,
    }
    EXPORT_SYMBOL(queue_work_on);

    -void delayed_work_timer_fn(unsigned long __data)
    +void delayed_work_timer_fn(struct timer_list *t)
    {
    - struct delayed_work *dwork = (struct delayed_work *)__data;
    + struct delayed_work *dwork = from_timer(dwork, t, timer);

    /* should have been called from irqsafe timer with irq already off */
    __queue_work(dwork->cpu, dwork->wq, &dwork->work);
    @@ -1508,8 +1508,7 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq,
    struct work_struct *work = &dwork->work;

    WARN_ON_ONCE(!wq);
    - WARN_ON_ONCE(timer->function != delayed_work_timer_fn ||
    - timer->data != (unsigned long)dwork);
    + WARN_ON_ONCE(timer->function != (TIMER_FUNC_TYPE)delayed_work_timer_fn);
    WARN_ON_ONCE(timer_pending(timer));
    WARN_ON_ONCE(!list_empty(&work->entry));

    --
    2.7.4
    \
     
     \ /
      Last update: 2017-10-05 01:31    [W:4.479 / U:0.636 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site