lkml.org 
[lkml]   [2023]   [Jan]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: sched/core] cpuidle, mwait: Make the mwait code noinstr clean
    The following commit has been merged into the sched/core branch of tip:

    Commit-ID: 2ec8efe64e6dfcaa50906ae4b0b5a0a7e1a54d50
    Gitweb: https://git.kernel.org/tip/2ec8efe64e6dfcaa50906ae4b0b5a0a7e1a54d50
    Author: Peter Zijlstra <peterz@infradead.org>
    AuthorDate: Thu, 12 Jan 2023 20:43:42 +01:00
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitterDate: Fri, 13 Jan 2023 11:48:16 +01:00

    cpuidle, mwait: Make the mwait code noinstr clean

    objtool found a few cases where this code called out into instrumented
    code:

    vmlinux.o: warning: objtool: intel_idle_s2idle+0x6e: call to __monitor.constprop.0() leaves .noinstr.text section
    vmlinux.o: warning: objtool: intel_idle_irq+0x8c: call to __monitor.constprop.0() leaves .noinstr.text section
    vmlinux.o: warning: objtool: intel_idle+0x73: call to __monitor.constprop.0() leaves .noinstr.text section

    vmlinux.o: warning: objtool: mwait_idle+0x88: call to clflush() leaves .noinstr.text section

    Fix it by marking the affected methods as __always_inline.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Tested-by: Tony Lindgren <tony@atomide.com>
    Tested-by: Ulf Hansson <ulf.hansson@linaro.org>
    Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Acked-by: Frederic Weisbecker <frederic@kernel.org>
    Link: https://lore.kernel.org/r/20230112195541.050542952@infradead.org
    ---
    arch/x86/include/asm/mwait.h | 12 ++++++------
    arch/x86/include/asm/special_insns.h | 2 +-
    2 files changed, 7 insertions(+), 7 deletions(-)

    diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h
    index f224216..778df05 100644
    --- a/arch/x86/include/asm/mwait.h
    +++ b/arch/x86/include/asm/mwait.h
    @@ -26,7 +26,7 @@
    #define TPAUSE_C01_STATE 1
    #define TPAUSE_C02_STATE 0

    -static inline void __monitor(const void *eax, unsigned long ecx,
    +static __always_inline void __monitor(const void *eax, unsigned long ecx,
    unsigned long edx)
    {
    /* "monitor %eax, %ecx, %edx;" */
    @@ -34,7 +34,7 @@ static inline void __monitor(const void *eax, unsigned long ecx,
    :: "a" (eax), "c" (ecx), "d"(edx));
    }

    -static inline void __monitorx(const void *eax, unsigned long ecx,
    +static __always_inline void __monitorx(const void *eax, unsigned long ecx,
    unsigned long edx)
    {
    /* "monitorx %eax, %ecx, %edx;" */
    @@ -42,7 +42,7 @@ static inline void __monitorx(const void *eax, unsigned long ecx,
    :: "a" (eax), "c" (ecx), "d"(edx));
    }

    -static inline void __mwait(unsigned long eax, unsigned long ecx)
    +static __always_inline void __mwait(unsigned long eax, unsigned long ecx)
    {
    mds_idle_clear_cpu_buffers();

    @@ -77,8 +77,8 @@ static inline void __mwait(unsigned long eax, unsigned long ecx)
    * EAX (logical) address to monitor
    * ECX #GP if not zero
    */
    -static inline void __mwaitx(unsigned long eax, unsigned long ebx,
    - unsigned long ecx)
    +static __always_inline void __mwaitx(unsigned long eax, unsigned long ebx,
    + unsigned long ecx)
    {
    /* No MDS buffer clear as this is AMD/HYGON only */

    @@ -87,7 +87,7 @@ static inline void __mwaitx(unsigned long eax, unsigned long ebx,
    :: "a" (eax), "b" (ebx), "c" (ecx));
    }

    -static inline void __sti_mwait(unsigned long eax, unsigned long ecx)
    +static __always_inline void __sti_mwait(unsigned long eax, unsigned long ecx)
    {
    mds_idle_clear_cpu_buffers();
    /* "mwait %eax, %ecx;" */
    diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h
    index c2e3221..54621e7 100644
    --- a/arch/x86/include/asm/special_insns.h
    +++ b/arch/x86/include/asm/special_insns.h
    @@ -196,7 +196,7 @@ static inline void load_gs_index(unsigned int selector)

    #endif /* CONFIG_PARAVIRT_XXL */

    -static inline void clflush(volatile void *__p)
    +static __always_inline void clflush(volatile void *__p)
    {
    asm volatile("clflush %0" : "+m" (*(volatile char __force *)__p));
    }
    \
     
     \ /
      Last update: 2023-03-26 23:39    [W:2.697 / U:0.552 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site