lkml.org 
[lkml]   [2018]   [May]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:timers/urgent] x86/tsc: Fix mark_tsc_unstable()
    Commit-ID:  e3b4f79025e0a4eb7e2a2c7d24dadfa1e38893b0
    Gitweb: https://git.kernel.org/tip/e3b4f79025e0a4eb7e2a2c7d24dadfa1e38893b0
    Author: Peter Zijlstra <peterz@infradead.org>
    AuthorDate: Mon, 30 Apr 2018 12:00:12 +0200
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitDate: Wed, 2 May 2018 16:10:40 +0200

    x86/tsc: Fix mark_tsc_unstable()

    mark_tsc_unstable() also needs to affect tsc_early, Now that
    clocksource_mark_unstable() can be used on a clocksource irrespective of
    its registration state, use it on both tsc_early and tsc.

    This does however require cs->list to be initialized empty, otherwise it
    cannot tell the registation state before registation.

    Fixes: aa83c45762a2 ("x86/tsc: Introduce early tsc clocksource")
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Diego Viola <diego.viola@gmail.com>
    Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Cc: len.brown@intel.com
    Cc: rjw@rjwysocki.net
    Cc: rui.zhang@intel.com
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/20180430100344.533326547@infradead.org

    ---
    arch/x86/kernel/tsc.c | 12 +++++-------
    1 file changed, 5 insertions(+), 7 deletions(-)

    diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
    index 23f36bc236ba..74392d9d51e0 100644
    --- a/arch/x86/kernel/tsc.c
    +++ b/arch/x86/kernel/tsc.c
    @@ -1067,6 +1067,7 @@ static struct clocksource clocksource_tsc_early = {
    .resume = tsc_resume,
    .mark_unstable = tsc_cs_mark_unstable,
    .tick_stable = tsc_cs_tick_stable,
    + .list = LIST_HEAD_INIT(clocksource_tsc_early.list),
    };

    /*
    @@ -1086,6 +1087,7 @@ static struct clocksource clocksource_tsc = {
    .resume = tsc_resume,
    .mark_unstable = tsc_cs_mark_unstable,
    .tick_stable = tsc_cs_tick_stable,
    + .list = LIST_HEAD_INIT(clocksource_tsc.list),
    };

    void mark_tsc_unstable(char *reason)
    @@ -1098,13 +1100,9 @@ void mark_tsc_unstable(char *reason)
    clear_sched_clock_stable();
    disable_sched_clock_irqtime();
    pr_info("Marking TSC unstable due to %s\n", reason);
    - /* Change only the rating, when not registered */
    - if (clocksource_tsc.mult) {
    - clocksource_mark_unstable(&clocksource_tsc);
    - } else {
    - clocksource_tsc.flags |= CLOCK_SOURCE_UNSTABLE;
    - clocksource_tsc.rating = 0;
    - }
    +
    + clocksource_mark_unstable(&clocksource_tsc_early);
    + clocksource_mark_unstable(&clocksource_tsc);
    }

    EXPORT_SYMBOL_GPL(mark_tsc_unstable);
    \
     
     \ /
      Last update: 2018-05-02 16:15    [W:4.432 / U:0.208 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site