lkml.org 
[lkml]   [2012]   [May]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH RFC V8 7/17] x86/pvticketlock: Use callee-save for lock_spinning
    From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

    Although the lock_spinning calls in the spinlock code are on the
    uncommon path, their presence can cause the compiler to generate many
    more register save/restores in the function pre/postamble, which is in
    the fast path. To avoid this, convert it to using the pvops callee-save
    calling convention, which defers all the save/restores until the actual
    function is called, keeping the fastpath clean.

    Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    Tested-by: Attilio Rao <attilio.rao@citrix.com>
    Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
    ---
    arch/x86/include/asm/paravirt.h | 2 +-
    arch/x86/include/asm/paravirt_types.h | 2 +-
    arch/x86/kernel/paravirt-spinlocks.c | 2 +-
    arch/x86/xen/spinlock.c | 3 ++-
    4 files changed, 5 insertions(+), 4 deletions(-)
    diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
    index 4bcd146..9769096 100644
    --- a/arch/x86/include/asm/paravirt.h
    +++ b/arch/x86/include/asm/paravirt.h
    @@ -754,7 +754,7 @@ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
    static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock,
    __ticket_t ticket)
    {
    - PVOP_VCALL2(pv_lock_ops.lock_spinning, lock, ticket);
    + PVOP_VCALLEE2(pv_lock_ops.lock_spinning, lock, ticket);
    }

    static __always_inline void ____ticket_unlock_kick(struct arch_spinlock *lock,
    diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
    index 005e24d..5e0c138 100644
    --- a/arch/x86/include/asm/paravirt_types.h
    +++ b/arch/x86/include/asm/paravirt_types.h
    @@ -330,7 +330,7 @@ struct arch_spinlock;
    #include <asm/spinlock_types.h>

    struct pv_lock_ops {
    - void (*lock_spinning)(struct arch_spinlock *lock, __ticket_t ticket);
    + struct paravirt_callee_save lock_spinning;
    void (*unlock_kick)(struct arch_spinlock *lock, __ticket_t ticket);
    };

    diff --git a/arch/x86/kernel/paravirt-spinlocks.c b/arch/x86/kernel/paravirt-spinlocks.c
    index c2e010e..4251c1d 100644
    --- a/arch/x86/kernel/paravirt-spinlocks.c
    +++ b/arch/x86/kernel/paravirt-spinlocks.c
    @@ -9,7 +9,7 @@

    struct pv_lock_ops pv_lock_ops = {
    #ifdef CONFIG_SMP
    - .lock_spinning = paravirt_nop,
    + .lock_spinning = __PV_IS_CALLEE_SAVE(paravirt_nop),
    .unlock_kick = paravirt_nop,
    #endif
    };
    diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
    index c4886dc..c47a8d1 100644
    --- a/arch/x86/xen/spinlock.c
    +++ b/arch/x86/xen/spinlock.c
    @@ -171,6 +171,7 @@ out:
    local_irq_restore(flags);
    spin_time_accum_blocked(start);
    }
    +PV_CALLEE_SAVE_REGS_THUNK(xen_lock_spinning);

    static void xen_unlock_kick(struct arch_spinlock *lock, __ticket_t next)
    {
    @@ -230,7 +231,7 @@ void __init xen_init_spinlocks(void)
    return;
    }

    - pv_lock_ops.lock_spinning = xen_lock_spinning;
    + pv_lock_ops.lock_spinning = PV_CALLEE_SAVE(xen_lock_spinning);
    pv_lock_ops.unlock_kick = xen_unlock_kick;
    }



    \
     
     \ /
      Last update: 2012-05-02 12:41    [W:0.027 / U:58.840 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site