lkml.org 
[lkml]   [2012]   [Jul]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] [RFC] Fix clock_was_set so it is safe to call from atomic
    Date
    NOTE:This is a prerequisite patch that's required to
    address the widely observed leap-second related futex/hrtimer
    issues.

    Currently clock_was_set() is unsafe to be called from atomic
    context, as it calls on_each_cpu(). This causes problems when
    we need to adjust the time from update_wall_time().

    To fix this, introduce a work_struct so if we're in_atomic,
    we can schedule work to do the necessary update after we're
    out of the atomic section.

    CC: Prarit Bhargava <prarit@redhat.com>
    CC: stable@vger.kernel.org
    CC: Thomas Gleixner <tglx@linutronix.de>
    Reported-by: Jan Engelhardt <jengelh@inai.de>
    Signed-off-by: John Stultz <johnstul@us.ibm.com>
    ---
    kernel/hrtimer.c | 16 +++++++++++++++-
    1 file changed, 15 insertions(+), 1 deletion(-)

    diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
    index ae34bf5..ee7a98d 100644
    --- a/kernel/hrtimer.c
    +++ b/kernel/hrtimer.c
    @@ -746,7 +746,7 @@ static inline void retrigger_next_event(void *arg) { }
    * resolution timer interrupts. On UP we just disable interrupts and
    * call the high resolution interrupt code.
    */
    -void clock_was_set(void)
    +static void do_clock_was_set(struct work_struct *work)
    {
    #ifdef CONFIG_HIGH_RES_TIMERS
    /* Retrigger the CPU local events everywhere */
    @@ -754,6 +754,20 @@ void clock_was_set(void)
    #endif
    timerfd_clock_was_set();
    }
    +static DECLARE_WORK(clock_was_set_work, do_clock_was_set);
    +
    +void clock_was_set(void)
    +{
    + /*
    + * We can't call on_each_cpu() from atomic context,
    + * so if we're in_atomic, schedule the clock_was_set
    + * for later.
    + */
    + if (in_atomic())
    + schedule_work(&clock_was_set_work);
    + else
    + do_clock_was_set(NULL);
    +}

    /*
    * During resume we might have to reprogram the high resolution timer
    --
    1.7.9.5


    \
     
     \ /
      Last update: 2012-07-01 21:23    [W:0.024 / U:0.820 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site