[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] x86 spinlock: Fix memory corruption on completing completions



On 02/06/2015 09:49 AM, Raghavendra K T wrote:
>  static __always_inline void arch_spin_unlock(arch_spinlock_t *lock)
>  {
>       if (TICKET_SLOWPATH_FLAG &&
> -         static_key_false(&paravirt_ticketlocks_enabled)) {
> -             arch_spinlock_t prev;
> +             static_key_false(&paravirt_ticketlocks_enabled)) {
> +             __ticket_t prev_head;
>  
> -             prev = *lock;
> +             prev_head = lock->tickets.head;
>               add_smp(&lock->tickets.head, TICKET_LOCK_INC);
>  
>               /* add_smp() is a full mb() */
>  
> -             if (unlikely(lock->tickets.tail & TICKET_SLOWPATH_FLAG))
> -                     __ticket_unlock_slowpath(lock, prev);
> +             if (unlikely(lock->tickets.tail & TICKET_SLOWPATH_FLAG)) {
> +                     BUILD_BUG_ON(((__ticket_t)NR_CPUS) != NR_CPUS);
> +                     __ticket_unlock_kick(lock, prev_head);

Can we modify it slightly to avoid potentially accessing invalid memory:

diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
index 5315887..cd22d73 100644
--- a/arch/x86/include/asm/spinlock.h
+++ b/arch/x86/include/asm/spinlock.h
@@ -144,13 +144,13 @@ static __always_inline void 
arch_spin_unlock(arch_spinlock_t *lock
        if (TICKET_SLOWPATH_FLAG &&
                static_key_false(&paravirt_ticketlocks_enabled)) {
                __ticket_t prev_head;
-
+               bool needs_kick = lock->tickets.tail & TICKET_SLOWPATH_FLAG;
                prev_head = lock->tickets.head;
                add_smp(&lock->tickets.head, TICKET_LOCK_INC);

                /* add_smp() is a full mb() */

-               if (unlikely(lock->tickets.tail & TICKET_SLOWPATH_FLAG)) {
+               if (unlikely(needs_kick)) {
                        BUILD_BUG_ON(((__ticket_t)NR_CPUS) != NR_CPUS);
                        __ticket_unlock_kick(lock, prev_head);
                }


Thanks,
Sasha

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.