lkml.org 
[lkml]   [2007]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [patch 3/3] clockevents: Fix resume logic - updated version
    From
    Date
    On Sat, 2007-05-12 at 19:01 +0200, Thomas Gleixner wrote:
    > On Sat, 2007-05-12 at 09:51 -0700, Andrew Morton wrote:
    > > The locking in clocksource_resume_watchdog looks pretty pointless anyway.
    > > Can't we just delete it?
    > >
    > > The only thing it can race against is, conceivably,
    > >
    > > resumed = watchdog_resumed;
    > > if (unlikely(resumed))
    > > watchdog_resumed = 0;
    > >
    > > which could be solved by using test_and_clear_bit().
    >
    > True. I'll redo it.

    Here you go.

    tglx

    ------------------------------->
    Subject: clocksource fix lock order in the resume path

    lockdep complains about the lock nesting of clocksource and watchdog
    lock in the resume path.

    Change the resume marker to a bit operation and remove the lock from
    this path.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

    --- a/kernel/time/clocksource.c
    +++ b/kernel/time/clocksource.c
    @@ -74,7 +74,7 @@ static struct clocksource *watchdog;
    static struct timer_list watchdog_timer;
    static DEFINE_SPINLOCK(watchdog_lock);
    static cycle_t watchdog_last;
    -static int watchdog_resumed;
    +static unsigned long watchdog_resumed;

    /*
    * Interval: 0.5sec Threshold: 0.0625s
    @@ -104,9 +104,7 @@ static void clocksource_watchdog(unsigned long data)

    spin_lock(&watchdog_lock);

    - resumed = watchdog_resumed;
    - if (unlikely(resumed))
    - watchdog_resumed = 0;
    + resumed = test_and_clear_bit(0, &watchdog_resumed);

    wdnow = watchdog->read();
    wd_nsec = cyc2ns(watchdog, (wdnow - watchdog_last) & watchdog->mask);
    @@ -151,9 +149,7 @@ static void clocksource_watchdog(unsigned long data)
    }
    static void clocksource_resume_watchdog(void)
    {
    - spin_lock(&watchdog_lock);
    - watchdog_resumed = 1;
    - spin_unlock(&watchdog_lock);
    + set_bit(0, &watchdog_resumed);
    }

    static void clocksource_check_watchdog(struct clocksource *cs)

    -
    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: 2007-05-12 20:49    [W:0.082 / U:31.488 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site