lkml.org 
[lkml]   [2007]   [Jan]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 09/23] clocksource: add block notifier
    Adds a call back interface for register/rating change events. This is also used
    later in this series to signal other interesting events.

    Signed-Off-By: Daniel Walker <dwalker@mvista.com>

    ---
    include/linux/clocksource.h | 37 +++++++++++++++++++++++++++++++++++++
    include/linux/timekeeping.h | 3 +++
    kernel/time/clocksource.c | 10 ++++++++++
    3 files changed, 50 insertions(+)

    Index: linux-2.6.19/include/linux/clocksource.h
    ===================================================================
    --- linux-2.6.19.orig/include/linux/clocksource.h
    +++ linux-2.6.19/include/linux/clocksource.h
    @@ -13,6 +13,7 @@
    #include <linux/time.h>
    #include <linux/list.h>
    #include <linux/sysdev.h>
    +#include <linux/notifier.h>

    #include <asm/div64.h>
    #include <asm/io.h>
    @@ -23,6 +24,42 @@ typedef u64 cycle_t;
    /* XXX - Would like a better way for initializing curr_clocksource */
    extern struct clocksource clocksource_jiffies;

    +/*
    + * Allows inlined calling for notifier routines.
    + */
    +extern struct atomic_notifier_head clocksource_list_notifier;
    +
    +/*
    + * Block notifier flags.
    + */
    +#define CLOCKSOURCE_NOTIFY_REGISTER 1
    +#define CLOCKSOURCE_NOTIFY_RATING 2
    +#define CLOCKSOURCE_NOTIFY_FREQ 4
    +
    +/**
    + * clocksource_notifier_register - Registers a list change notifier
    + * @nb: pointer to a notifier block
    + *
    + * Returns zero always.
    + */
    +static inline int clocksource_notifier_register(struct notifier_block *nb)
    +{
    + return atomic_notifier_chain_register(&clocksource_list_notifier, nb);
    +}
    +
    +/**
    + * clocksource_freq_change - Allows notification of dynamic frequency changes.
    + *
    + * Signals that a clocksource is dynamically changing it's frequency.
    + * This could happen if a clocksource becomes more/less stable.
    + */
    +static inline void clocksource_freq_change(struct clocksource *c)
    +{
    + atomic_notifier_call_chain(&clocksource_list_notifier,
    + CLOCKSOURCE_NOTIFY_FREQ, c);
    +}
    +
    +
    /**
    * struct clocksource - hardware abstraction for a free running counter
    * Provides mostly state-free accessors to the underlying hardware.
    Index: linux-2.6.19/include/linux/timekeeping.h
    ===================================================================
    --- linux-2.6.19.orig/include/linux/timekeeping.h
    +++ linux-2.6.19/include/linux/timekeeping.h
    @@ -8,6 +8,9 @@ static inline int change_clocksource(voi
    {
    return 0;
    }
    +
    +static inline void change_clocksource(void) { }
    +
    #endif /* !CONFIG_GENERIC_TIME */

    #endif /* _LINUX_TIMEKEEPING_H */
    Index: linux-2.6.19/kernel/time/clocksource.c
    ===================================================================
    --- linux-2.6.19.orig/kernel/time/clocksource.c
    +++ linux-2.6.19/kernel/time/clocksource.c
    @@ -49,6 +49,8 @@ static DEFINE_SPINLOCK(clocksource_lock)
    static char override_name[32];
    static int finished_booting;

    +ATOMIC_NOTIFIER_HEAD(clocksource_list_notifier);
    +
    /* clocksource_done_booting - Called near the end of bootup
    *
    * Hack to avoid lots of clocksource churn at boot time
    @@ -193,6 +195,10 @@ int clocksource_register(struct clocksou
    */
    next_clocksource = select_clocksource();
    spin_unlock_irqrestore(&clocksource_lock, flags);
    +
    + atomic_notifier_call_chain(&clocksource_list_notifier,
    + CLOCKSOURCE_NOTIFY_REGISTER, c);
    +
    return ret;
    }
    EXPORT_SYMBOL(clocksource_register);
    @@ -218,6 +224,10 @@ void clocksource_rating_change(struct cl

    next_clocksource = select_clocksource();
    spin_unlock_irqrestore(&clocksource_lock, flags);
    +
    + atomic_notifier_call_chain(&clocksource_list_notifier,
    + CLOCKSOURCE_NOTIFY_RATING, c);
    +
    }
    EXPORT_SYMBOL(clocksource_rating_change);

    --
    -
    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-01-31 04:49    [W:3.169 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site