lkml.org 
[lkml]   [2013]   [Apr]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 04/15] clocksource: Add module refcount
    Add a module refcount, so the current clocksource cannot be removed
    unconditionally.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    include/linux/clocksource.h | 3 +++
    kernel/time/timekeeping.c | 15 ++++++++++-----
    2 files changed, 13 insertions(+), 5 deletions(-)

    Index: tip/include/linux/clocksource.h
    ===================================================================
    --- tip.orig/include/linux/clocksource.h
    +++ tip/include/linux/clocksource.h
    @@ -21,6 +21,7 @@
    /* clocksource cycle base type */
    typedef u64 cycle_t;
    struct clocksource;
    +struct module;

    #ifdef CONFIG_ARCH_CLOCKSOURCE_DATA
    #include <asm/clocksource.h>
    @@ -162,6 +163,7 @@ extern u64 timecounter_cyc2time(struct t
    * @suspend: suspend function for the clocksource, if necessary
    * @resume: resume function for the clocksource, if necessary
    * @cycle_last: most recent cycle counter value seen by ::read()
    + * @owner: module reference
    */
    struct clocksource {
    /*
    @@ -195,6 +197,7 @@ struct clocksource {
    cycle_t cs_last;
    cycle_t wd_last;
    #endif
    + struct module *owner;
    } ____cacheline_aligned;

    /*
    Index: tip/kernel/time/timekeeping.c
    ===================================================================
    --- tip.orig/kernel/time/timekeeping.c
    +++ tip/kernel/time/timekeeping.c
    @@ -627,11 +627,16 @@ static int change_clocksource(void *data
    write_seqcount_begin(&timekeeper_seq);

    timekeeping_forward_now(tk);
    - if (!new->enable || new->enable(new) == 0) {
    - old = tk->clock;
    - tk_setup_internals(tk, new);
    - if (old->disable)
    - old->disable(old);
    + if (try_module_get(new->owner)) {
    + if (!new->enable || new->enable(new) == 0) {
    + old = tk->clock;
    + tk_setup_internals(tk, new);
    + if (old->disable)
    + old->disable(old);
    + module_put(old->owner);
    + } else {
    + module_put(new->owner);
    + }
    }
    timekeeping_update(tk, true, true);




    \
     
     \ /
      Last update: 2013-04-25 23:21    [W:4.224 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site