Merge branch 'linus' into x86/asm
authorIngo Molnar <mingo@elte.hu>
Tue, 28 Feb 2012 09:26:07 +0000 (10:26 +0100)
committerIngo Molnar <mingo@elte.hu>
Tue, 28 Feb 2012 09:27:36 +0000 (10:27 +0100)
Sync up the latest NMI fixes.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/include/asm/spinlock.h
arch/x86/include/asm/spinlock_types.h
arch/x86/kernel/entry_64.S
arch/x86/lib/copy_page_64.S
arch/x86/lib/memcpy_64.S
arch/x86/lib/memset_64.S
include/asm-generic/getorder.h

index a82c2bf..76bfa2c 100644 (file)
@@ -88,14 +88,14 @@ static inline int __ticket_spin_is_locked(arch_spinlock_t *lock)
 {
        struct __raw_tickets tmp = ACCESS_ONCE(lock->tickets);
 
-       return !!(tmp.tail ^ tmp.head);
+       return tmp.tail != tmp.head;
 }
 
 static inline int __ticket_spin_is_contended(arch_spinlock_t *lock)
 {
        struct __raw_tickets tmp = ACCESS_ONCE(lock->tickets);
 
-       return ((tmp.tail - tmp.head) & TICKET_MASK) > 1;
+       return (__ticket_t)(tmp.tail - tmp.head) > 1;
 }
 
 #ifndef CONFIG_PARAVIRT_SPINLOCKS
index 8ebd5df..ad0ad07 100644 (file)
@@ -16,7 +16,6 @@ typedef u32 __ticketpair_t;
 #endif
 
 #define TICKET_SHIFT   (sizeof(__ticket_t) * 8)
-#define TICKET_MASK    ((__ticket_t)((1 << TICKET_SHIFT) - 1))
 
 typedef struct arch_spinlock {
        union {
index 1333d98..94c636a 100644 (file)
@@ -320,7 +320,7 @@ ENDPROC(native_usergs_sysret64)
        movq %rsp, %rsi
 
        leaq -RBP(%rsp),%rdi    /* arg1 for handler */
-       testl $3, CS(%rdi)
+       testl $3, CS-RBP(%rsi)
        je 1f
        SWAPGS
        /*
@@ -330,11 +330,10 @@ ENDPROC(native_usergs_sysret64)
         * moving irq_enter into assembly, which would be too much work)
         */
 1:     incl PER_CPU_VAR(irq_count)
-       jne 2f
-       mov PER_CPU_VAR(irq_stack_ptr),%rsp
+       cmovzq PER_CPU_VAR(irq_stack_ptr),%rsp
        CFI_DEF_CFA_REGISTER    rsi
 
-2:     /* Store previous stack value */
+       /* Store previous stack value */
        pushq %rsi
        CFI_ESCAPE      0x0f /* DW_CFA_def_cfa_expression */, 6, \
                        0x77 /* DW_OP_breg7 */, 0, \
index 01c805b..6b34d04 100644 (file)
@@ -20,14 +20,12 @@ ENDPROC(copy_page_c)
 
 ENTRY(copy_page)
        CFI_STARTPROC
-       subq    $3*8,%rsp
-       CFI_ADJUST_CFA_OFFSET 3*8
+       subq    $2*8,%rsp
+       CFI_ADJUST_CFA_OFFSET 2*8
        movq    %rbx,(%rsp)
        CFI_REL_OFFSET rbx, 0
        movq    %r12,1*8(%rsp)
        CFI_REL_OFFSET r12, 1*8
-       movq    %r13,2*8(%rsp)
-       CFI_REL_OFFSET r13, 2*8
 
        movl    $(4096/64)-5,%ecx
        .p2align 4
@@ -91,10 +89,8 @@ ENTRY(copy_page)
        CFI_RESTORE rbx
        movq    1*8(%rsp),%r12
        CFI_RESTORE r12
-       movq    2*8(%rsp),%r13
-       CFI_RESTORE r13
-       addq    $3*8,%rsp
-       CFI_ADJUST_CFA_OFFSET -3*8
+       addq    $2*8,%rsp
+       CFI_ADJUST_CFA_OFFSET -2*8
        ret
 .Lcopy_page_end:
        CFI_ENDPROC
index efbf2a0..1c273be 100644 (file)
@@ -27,9 +27,8 @@
        .section .altinstr_replacement, "ax", @progbits
 .Lmemcpy_c:
        movq %rdi, %rax
-
-       movl %edx, %ecx
-       shrl $3, %ecx
+       movq %rdx, %rcx
+       shrq $3, %rcx
        andl $7, %edx
        rep movsq
        movl %edx, %ecx
@@ -48,8 +47,7 @@
        .section .altinstr_replacement, "ax", @progbits
 .Lmemcpy_c_e:
        movq %rdi, %rax
-
-       movl %edx, %ecx
+       movq %rdx, %rcx
        rep movsb
        ret
 .Lmemcpy_e_e:
@@ -60,10 +58,7 @@ ENTRY(memcpy)
        CFI_STARTPROC
        movq %rdi, %rax
 
-       /*
-        * Use 32bit CMP here to avoid long NOP padding.
-        */
-       cmp  $0x20, %edx
+       cmpq $0x20, %rdx
        jb .Lhandle_tail
 
        /*
@@ -72,7 +67,7 @@ ENTRY(memcpy)
         */
        cmp  %dil, %sil
        jl .Lcopy_backward
-       subl $0x20, %edx
+       subq $0x20, %rdx
 .Lcopy_forward_loop:
        subq $0x20,     %rdx
 
@@ -91,7 +86,7 @@ ENTRY(memcpy)
        movq %r11,      3*8(%rdi)
        leaq 4*8(%rdi), %rdi
        jae  .Lcopy_forward_loop
-       addq $0x20,     %rdx
+       addl $0x20,     %edx
        jmp  .Lhandle_tail
 
 .Lcopy_backward:
@@ -123,11 +118,11 @@ ENTRY(memcpy)
        /*
         * Calculate copy position to head.
         */
-       addq $0x20,     %rdx
+       addl $0x20,     %edx
        subq %rdx,      %rsi
        subq %rdx,      %rdi
 .Lhandle_tail:
-       cmpq $16,       %rdx
+       cmpl $16,       %edx
        jb   .Lless_16bytes
 
        /*
@@ -144,7 +139,7 @@ ENTRY(memcpy)
        retq
        .p2align 4
 .Lless_16bytes:
-       cmpq $8,        %rdx
+       cmpl $8,        %edx
        jb   .Lless_8bytes
        /*
         * Move data from 8 bytes to 15 bytes.
@@ -156,7 +151,7 @@ ENTRY(memcpy)
        retq
        .p2align 4
 .Lless_8bytes:
-       cmpq $4,        %rdx
+       cmpl $4,        %edx
        jb   .Lless_3bytes
 
        /*
@@ -169,18 +164,19 @@ ENTRY(memcpy)
        retq
        .p2align 4
 .Lless_3bytes:
-       cmpl $0, %edx
-       je .Lend
+       subl $1, %edx
+       jb .Lend
        /*
         * Move data from 1 bytes to 3 bytes.
         */
-.Lloop_1:
-       movb (%rsi), %r8b
-       movb %r8b, (%rdi)
-       incq %rdi
-       incq %rsi
-       decl %edx
-       jnz .Lloop_1
+       movzbl (%rsi), %ecx
+       jz .Lstore_1byte
+       movzbq 1(%rsi), %r8
+       movzbq (%rsi, %rdx), %r9
+       movb %r8b, 1(%rdi)
+       movb %r9b, (%rdi, %rdx)
+.Lstore_1byte:
+       movb %cl, (%rdi)
 
 .Lend:
        retq
index 79bd454..2dcb380 100644 (file)
        .section .altinstr_replacement, "ax", @progbits
 .Lmemset_c:
        movq %rdi,%r9
-       movl %edx,%r8d
-       andl $7,%r8d
-       movl %edx,%ecx
-       shrl $3,%ecx
+       movq %rdx,%rcx
+       andl $7,%edx
+       shrq $3,%rcx
        /* expand byte value  */
        movzbl %sil,%esi
        movabs $0x0101010101010101,%rax
-       mulq %rsi               /* with rax, clobbers rdx */
+       imulq %rsi,%rax
        rep stosq
-       movl %r8d,%ecx
+       movl %edx,%ecx
        rep stosb
        movq %r9,%rax
        ret
@@ -50,7 +49,7 @@
 .Lmemset_c_e:
        movq %rdi,%r9
        movb %sil,%al
-       movl %edx,%ecx
+       movq %rdx,%rcx
        rep stosb
        movq %r9,%rax
        ret
@@ -61,12 +60,11 @@ ENTRY(memset)
 ENTRY(__memset)
        CFI_STARTPROC
        movq %rdi,%r10
-       movq %rdx,%r11
 
        /* expand byte value  */
        movzbl %sil,%ecx
        movabs $0x0101010101010101,%rax
-       mul    %rcx             /* with rax, clobbers rdx */
+       imulq  %rcx,%rax
 
        /* align dst */
        movl  %edi,%r9d
@@ -75,13 +73,13 @@ ENTRY(__memset)
        CFI_REMEMBER_STATE
 .Lafter_bad_alignment:
 
-       movl %r11d,%ecx
-       shrl $6,%ecx
+       movq  %rdx,%rcx
+       shrq  $6,%rcx
        jz       .Lhandle_tail
 
        .p2align 4
 .Lloop_64:
-       decl   %ecx
+       decq  %rcx
        movq  %rax,(%rdi)
        movq  %rax,8(%rdi)
        movq  %rax,16(%rdi)
@@ -97,7 +95,7 @@ ENTRY(__memset)
           to predict jump tables. */
        .p2align 4
 .Lhandle_tail:
-       movl    %r11d,%ecx
+       movl    %edx,%ecx
        andl    $63&(~7),%ecx
        jz              .Lhandle_7
        shrl    $3,%ecx
@@ -109,12 +107,11 @@ ENTRY(__memset)
        jnz    .Lloop_8
 
 .Lhandle_7:
-       movl    %r11d,%ecx
-       andl    $7,%ecx
+       andl    $7,%edx
        jz      .Lende
        .p2align 4
 .Lloop_1:
-       decl    %ecx
+       decl    %edx
        movb    %al,(%rdi)
        leaq    1(%rdi),%rdi
        jnz     .Lloop_1
@@ -125,13 +122,13 @@ ENTRY(__memset)
 
        CFI_RESTORE_STATE
 .Lbad_alignment:
-       cmpq $7,%r11
+       cmpq $7,%rdx
        jbe     .Lhandle_7
        movq %rax,(%rdi)        /* unaligned store */
        movq $8,%r8
        subq %r9,%r8
        addq %r8,%rdi
-       subq %r8,%r11
+       subq %r8,%rdx
        jmp .Lafter_bad_alignment
 .Lfinal:
        CFI_ENDPROC
index 67e7245..65e4468 100644 (file)
@@ -4,21 +4,58 @@
 #ifndef __ASSEMBLY__
 
 #include <linux/compiler.h>
+#include <linux/log2.h>
 
-/* Pure 2^n version of get_order */
-static inline __attribute_const__ int get_order(unsigned long size)
+/*
+ * Runtime evaluation of get_order()
+ */
+static inline __attribute_const__
+int __get_order(unsigned long size)
 {
        int order;
 
-       size = (size - 1) >> (PAGE_SHIFT - 1);
-       order = -1;
-       do {
-               size >>= 1;
-               order++;
-       } while (size);
+       size--;
+       size >>= PAGE_SHIFT;
+#if BITS_PER_LONG == 32
+       order = fls(size);
+#else
+       order = fls64(size);
+#endif
        return order;
 }
 
+/**
+ * get_order - Determine the allocation order of a memory size
+ * @size: The size for which to get the order
+ *
+ * Determine the allocation order of a particular sized block of memory.  This
+ * is on a logarithmic scale, where:
+ *
+ *     0 -> 2^0 * PAGE_SIZE and below
+ *     1 -> 2^1 * PAGE_SIZE to 2^0 * PAGE_SIZE + 1
+ *     2 -> 2^2 * PAGE_SIZE to 2^1 * PAGE_SIZE + 1
+ *     3 -> 2^3 * PAGE_SIZE to 2^2 * PAGE_SIZE + 1
+ *     4 -> 2^4 * PAGE_SIZE to 2^3 * PAGE_SIZE + 1
+ *     ...
+ *
+ * The order returned is used to find the smallest allocation granule required
+ * to hold an object of the specified size.
+ *
+ * The result is undefined if the size is 0.
+ *
+ * This function may be used to initialise variables with compile time
+ * evaluations of constants.
+ */
+#define get_order(n)                                           \
+(                                                              \
+       __builtin_constant_p(n) ? (                             \
+               ((n) == 0UL) ? BITS_PER_LONG - PAGE_SHIFT :     \
+               (((n) < (1UL << PAGE_SHIFT)) ? 0 :              \
+                ilog2((n) - 1) - PAGE_SHIFT + 1)               \
+       ) :                                                     \
+       __get_order(n)                                          \
+)
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* __ASM_GENERIC_GETORDER_H */