lkml.org 
[lkml]   [2009]   [Mar]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 099/114] x86/paravirt: make arch_flush_lazy_mmu/cpu disable preemption
    2.6.28-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Jeremy Fitzhardinge <jeremy@goop.org>

    commit d85cf93da66977dbc645352be1b2084a659d8a0b upstream.

    Impact: avoid access to percpu vars in preempible context

    They are intended to be used whenever there's the possibility
    that there's some stale state which is going to be overwritten
    with a queued update, or to force a state change when we may be
    in lazy mode. Either way, we could end up calling it with
    preemption enabled, so wrap the functions in their own little
    preempt-disable section so they can be safely called in any
    context (though preemption should never be enabled if we're actually
    in a lazy state).

    (Move out of line to avoid #include dependencies.)

    Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    arch/x86/include/asm/paravirt.h | 17 ++---------------
    arch/x86/kernel/paravirt.c | 24 ++++++++++++++++++++++++
    2 files changed, 26 insertions(+), 15 deletions(-)

    --- a/arch/x86/include/asm/paravirt.h
    +++ b/arch/x86/include/asm/paravirt.h
    @@ -1352,14 +1352,7 @@ static inline void arch_leave_lazy_cpu_m
    PVOP_VCALL0(pv_cpu_ops.lazy_mode.leave);
    }

    -static inline void arch_flush_lazy_cpu_mode(void)
    -{
    - if (unlikely(paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU)) {
    - arch_leave_lazy_cpu_mode();
    - arch_enter_lazy_cpu_mode();
    - }
    -}
    -
    +void arch_flush_lazy_cpu_mode(void);

    #define __HAVE_ARCH_ENTER_LAZY_MMU_MODE
    static inline void arch_enter_lazy_mmu_mode(void)
    @@ -1372,13 +1365,7 @@ static inline void arch_leave_lazy_mmu_m
    PVOP_VCALL0(pv_mmu_ops.lazy_mode.leave);
    }

    -static inline void arch_flush_lazy_mmu_mode(void)
    -{
    - if (unlikely(paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU)) {
    - arch_leave_lazy_mmu_mode();
    - arch_enter_lazy_mmu_mode();
    - }
    -}
    +void arch_flush_lazy_mmu_mode(void);

    static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
    unsigned long phys, pgprot_t flags)
    --- a/arch/x86/kernel/paravirt.c
    +++ b/arch/x86/kernel/paravirt.c
    @@ -268,6 +268,30 @@ enum paravirt_lazy_mode paravirt_get_laz
    return __get_cpu_var(paravirt_lazy_mode);
    }

    +void arch_flush_lazy_mmu_mode(void)
    +{
    + preempt_disable();
    +
    + if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) {
    + arch_leave_lazy_mmu_mode();
    + arch_enter_lazy_mmu_mode();
    + }
    +
    + preempt_enable();
    +}
    +
    +void arch_flush_lazy_cpu_mode(void)
    +{
    + preempt_disable();
    +
    + if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU) {
    + arch_leave_lazy_cpu_mode();
    + arch_enter_lazy_cpu_mode();
    + }
    +
    + preempt_enable();
    +}
    +
    struct pv_info pv_info = {
    .name = "bare hardware",
    .paravirt_enabled = 0,



    \
     
     \ /
      Last update: 2009-03-14 03:01    [W:2.258 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site