lkml.org 
[lkml]   [2015]   [Feb]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 35/35] arm: bl_switcher: Kill tick suspend hackery
    From: Thomas Gleixner <tglx@linutronix.de>

    Sure it's simple to abuse random functions and data structures and let
    the people who made the mistake to put the declarations into a global
    header file deal with the fallout.

    Adding a tick_suspend/resume_local() pair to the core code would have
    been a trivial thing to do.

    Use the new tick_suspend/resume_local() and get rid of the homebrewn
    hackery. The check for the cpumask is completely pointless. There is
    no harm to suspend a per cpu tick device unconditionally. If that's a
    real issue then we fix it proper at the core level and not with some
    completely undocumented hacks in some random arch code.

    Move the tick internals to the core code, now that this nuisance is
    gone.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: Nicolas Pitre <nicolas.pitre@linaro.org>
    Cc: Russell King <rmk+kernel@arm.linux.org.uk>
    ---
    arch/arm/common/bL_switcher.c | 16 ++--------------
    include/linux/clockchips.h | 6 ------
    include/linux/tick.h | 18 ++----------------
    kernel/time/tick-internal.h | 5 +++++
    kernel/time/tick-sched.h | 10 ++++++++++
    5 files changed, 19 insertions(+), 36 deletions(-)

    Index: linux/arch/arm/common/bL_switcher.c
    ===================================================================
    --- linux.orig/arch/arm/common/bL_switcher.c
    +++ linux/arch/arm/common/bL_switcher.c
    @@ -151,8 +151,6 @@ static int bL_switch_to(unsigned int new
    unsigned int mpidr, this_cpu, that_cpu;
    unsigned int ob_mpidr, ob_cpu, ob_cluster, ib_mpidr, ib_cpu, ib_cluster;
    struct completion inbound_alive;
    - struct tick_device *tdev;
    - enum clock_event_mode tdev_mode;
    long volatile *handshake_ptr;
    int ipi_nr, ret;

    @@ -219,13 +217,7 @@ static int bL_switch_to(unsigned int new
    /* redirect GIC's SGIs to our counterpart */
    gic_migrate_target(bL_gic_id[ib_cpu][ib_cluster]);

    - tdev = tick_get_device(this_cpu);
    - if (tdev && !cpumask_equal(tdev->evtdev->cpumask, cpumask_of(this_cpu)))
    - tdev = NULL;
    - if (tdev) {
    - tdev_mode = tdev->evtdev->mode;
    - clockevents_set_mode(tdev->evtdev, CLOCK_EVT_MODE_SHUTDOWN);
    - }
    + tick_suspend_local();

    ret = cpu_pm_enter();

    @@ -251,11 +243,7 @@ static int bL_switch_to(unsigned int new

    ret = cpu_pm_exit();

    - if (tdev) {
    - clockevents_set_mode(tdev->evtdev, tdev_mode);
    - clockevents_program_event(tdev->evtdev,
    - tdev->evtdev->next_event, 1);
    - }
    + tick_resume_local();

    trace_cpu_migrate_finish(ktime_get_real_ns(), ib_mpidr);
    local_fiq_enable();
    Index: linux/include/linux/clockchips.h
    ===================================================================
    --- linux.orig/include/linux/clockchips.h
    +++ linux/include/linux/clockchips.h
    @@ -149,11 +149,5 @@ clockevents_calc_mult_shift(struct clock
    return clocks_calc_mult_shift(&ce->mult, &ce->shift, NSEC_PER_SEC,
    freq, minsec);
    }
    -
    -/* Should be core only, but is abused by arm bl_switcher */
    -extern void clockevents_set_mode(struct clock_event_device *dev,
    - enum clock_event_mode mode);
    -extern int clockevents_program_event(struct clock_event_device *dev,
    - ktime_t expires, bool force);
    #endif /* CONFIG_GENERIC_CLOCKEVENTS */
    #endif
    Index: linux/include/linux/tick.h
    ===================================================================
    --- linux.orig/include/linux/tick.h
    +++ linux/include/linux/tick.h
    @@ -11,25 +11,11 @@
    #include <linux/cpumask.h>
    #include <linux/sched.h>

    -/* ARM BL switcher abuse support */
    -#ifdef CONFIG_GENERIC_CLOCKEVENTS
    -enum tick_device_mode {
    - TICKDEV_MODE_PERIODIC,
    - TICKDEV_MODE_ONESHOT,
    -};
    -
    -struct tick_device {
    - struct clock_event_device *evtdev;
    - enum tick_device_mode mode;
    -};
    -extern struct tick_device *tick_get_device(int cpu);
    -#endif
    -
    #ifdef CONFIG_GENERIC_CLOCKEVENTS
    extern void __init tick_init(void);
    -/* Should be core only, but arm BL switcher has its homebrewn implementation */
    +/* Should be core only, but arm BL switcher requires it */
    extern void tick_suspend_local(void);
    -/* Should be core only, but XEN resume magic requires this */
    +/* Should be core only, but XEN resume magic and arm BL switcher require it */
    extern void tick_resume_local(void);
    /* CPU hotplug */
    extern void tick_shutdown_local(void);
    Index: linux/kernel/time/tick-internal.h
    ===================================================================
    --- linux.orig/kernel/time/tick-internal.h
    +++ linux/kernel/time/tick-internal.h
    @@ -26,6 +26,7 @@ extern bool tick_check_replacement(struc
    struct clock_event_device *newdev);
    extern void tick_install_replacement(struct clock_event_device *dev);
    extern int tick_is_oneshot_available(void);
    +extern struct tick_device *tick_get_device(int cpu);

    /* Check, if the device is functional or a dummy for broadcast */
    static inline int tick_device_is_functional(struct clock_event_device *dev)
    @@ -36,6 +37,10 @@ static inline int tick_device_is_functio
    extern void clockevents_shutdown(struct clock_event_device *dev);
    extern void clockevents_exchange_device(struct clock_event_device *old,
    struct clock_event_device *new);
    +extern void clockevents_set_mode(struct clock_event_device *dev,
    + enum clock_event_mode mode);
    +extern int clockevents_program_event(struct clock_event_device *dev,
    + ktime_t expires, bool force);
    extern void clockevents_handle_noop(struct clock_event_device *dev);
    extern void clockevents_cleanup_dying_cpu(struct clock_event_device *dev);
    extern int __clockevents_update_freq(struct clock_event_device *dev, u32 freq);
    Index: linux/kernel/time/tick-sched.h
    ===================================================================
    --- linux.orig/kernel/time/tick-sched.h
    +++ linux/kernel/time/tick-sched.h
    @@ -3,6 +3,16 @@

    #include <linux/hrtimer.h>

    +enum tick_device_mode {
    + TICKDEV_MODE_PERIODIC,
    + TICKDEV_MODE_ONESHOT,
    +};
    +
    +struct tick_device {
    + struct clock_event_device *evtdev;
    + enum tick_device_mode mode;
    +};
    +
    enum tick_nohz_mode {
    NOHZ_MODE_INACTIVE,
    NOHZ_MODE_LOWRES,



    \
     
     \ /
      Last update: 2015-02-16 14:21    [W:4.243 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site