]> Git Repo - linux.git/commitdiff
Merge branch 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <[email protected]>
Wed, 4 Sep 2013 15:39:38 +0000 (08:39 -0700)
committerLinus Torvalds <[email protected]>
Wed, 4 Sep 2013 15:39:38 +0000 (08:39 -0700)
Pull x86/asm changes from Ingo Molnar:
 "Main changes:

   - Apply low level mutex optimization on x86-64, by Wedson Almeida
     Filho.

   - Change bitops to be naturally 'long', by H Peter Anvin.

   - Add TSX-NI opcodes support to the x86 (instrumentation) decoder, by
     Masami Hiramatsu.

   - Add clang compatibility adjustments/workarounds, by Jan-Simon
     Möller"

* 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86, doc: Update uaccess.h comment to reflect clang changes
  x86, asm: Fix a compilation issue with clang
  x86, asm: Extend definitions of _ASM_* with a raw format
  x86, insn: Add new opcodes as of June, 2013
  x86/ia32/asm: Remove unused argument in macro
  x86, bitops: Change bitops to be native operand size
  x86: Use asm-goto to implement mutex fast path on x86-64

1  2 
arch/x86/include/asm/mutex_64.h

index 2c543fff241bb85cb3b07c6cd1c19033380ffd3c,c030bee7690a8b8f38b0d00084f6f32f751b25e5..e7e6751648edf775ad54a42a5c05b3e6d3c1cff5
   *
   * Atomically decrements @v and calls <fail_fn> if the result is negative.
   */
+ #ifdef CC_HAVE_ASM_GOTO
+ static inline void __mutex_fastpath_lock(atomic_t *v,
+                                        void (*fail_fn)(atomic_t *))
+ {
+       asm volatile goto(LOCK_PREFIX "   decl %0\n"
+                         "   jns %l[exit]\n"
+                         : : "m" (v->counter)
+                         : "memory", "cc"
+                         : exit);
+       fail_fn(v);
+ exit:
+       return;
+ }
+ #else
  #define __mutex_fastpath_lock(v, fail_fn)                     \
  do {                                                          \
        unsigned long dummy;                                    \
                     : "rax", "rsi", "rdx", "rcx",              \
                       "r8", "r9", "r10", "r11", "memory");     \
  } while (0)
+ #endif
  
  /**
   *  __mutex_fastpath_lock_retval - try to take the lock by moving the count
   *                                 from 1 to a 0 value
   *  @count: pointer of type atomic_t
 - *  @fail_fn: function to call if the original value was not 1
   *
 - * Change the count from 1 to a value lower than 1, and call <fail_fn> if
 - * it wasn't 1 originally. This function returns 0 if the fastpath succeeds,
 - * or anything the slow path function returns
 + * Change the count from 1 to a value lower than 1. This function returns 0
 + * if the fastpath succeeds, or -1 otherwise.
   */
 -static inline int __mutex_fastpath_lock_retval(atomic_t *count,
 -                                             int (*fail_fn)(atomic_t *))
 +static inline int __mutex_fastpath_lock_retval(atomic_t *count)
  {
        if (unlikely(atomic_dec_return(count) < 0))
 -              return fail_fn(count);
 +              return -1;
        else
                return 0;
  }
   *
   * Atomically increments @v and calls <fail_fn> if the result is nonpositive.
   */
+ #ifdef CC_HAVE_ASM_GOTO
+ static inline void __mutex_fastpath_unlock(atomic_t *v,
+                                          void (*fail_fn)(atomic_t *))
+ {
+       asm volatile goto(LOCK_PREFIX "   incl %0\n"
+                         "   jg %l[exit]\n"
+                         : : "m" (v->counter)
+                         : "memory", "cc"
+                         : exit);
+       fail_fn(v);
+ exit:
+       return;
+ }
+ #else
  #define __mutex_fastpath_unlock(v, fail_fn)                   \
  do {                                                          \
        unsigned long dummy;                                    \
                     : "rax", "rsi", "rdx", "rcx",              \
                       "r8", "r9", "r10", "r11", "memory");     \
  } while (0)
+ #endif
  
  #define __mutex_slowpath_needs_to_unlock()    1
  
This page took 0.065304 seconds and 4 git commands to generate.