tree:   https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking/core
head:   52fa5bc5cbba089f09bc2c372e3432f3f3e48051
commit: 7a46ec0e2f4850407de5e1d19a44edee6efa58ec [36/40] locking/refcounts, 
x86/asm: Implement fast refcount overflow protection
config: i386-tinyconfig (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        git checkout 7a46ec0e2f4850407de5e1d19a44edee6efa58ec
        # save the attached .config to linux build tree
        make ARCH=i386 

All error/warnings (new ones prefixed by >>):

   In file included from include/linux/refcount.h:57:0,
                    from include/linux/kref.h:19,
                    from include/linux/kobject.h:24,
                    from include/linux/irqdesc.h:5,
                    from include/linux/irq.h:495,
                    from arch/x86/include/asm/hardirq.h:5,
                    from include/linux/hardirq.h:8,
                    from arch/x86/kernel/asm-offsets.c:11:
   arch/x86/include/asm/refcount.h: In function 'refcount_add':
>> arch/x86/include/asm/refcount.h:21:2: error: expected ':' or ')' before 
>> 'ASM_UNREACHABLE'
     ASM_UNREACHABLE     \
     ^
>> arch/x86/include/asm/refcount.h:29:2: note: in expansion of macro 
>> '_REFCOUNT_EXCEPTION'
     _REFCOUNT_EXCEPTION
     ^~~~~~~~~~~~~~~~~~~
>> arch/x86/include/asm/refcount.h:44:3: note: in expansion of macro 
>> 'REFCOUNT_CHECK_LT_ZERO'
      REFCOUNT_CHECK_LT_ZERO
      ^~~~~~~~~~~~~~~~~~~~~~
   arch/x86/include/asm/refcount.h: In function 'refcount_inc':
>> arch/x86/include/asm/refcount.h:21:2: error: expected ':' or ')' before 
>> 'ASM_UNREACHABLE'
     ASM_UNREACHABLE     \
     ^
>> arch/x86/include/asm/refcount.h:29:2: note: in expansion of macro 
>> '_REFCOUNT_EXCEPTION'
     _REFCOUNT_EXCEPTION
     ^~~~~~~~~~~~~~~~~~~
   arch/x86/include/asm/refcount.h:53:3: note: in expansion of macro 
'REFCOUNT_CHECK_LT_ZERO'
      REFCOUNT_CHECK_LT_ZERO
      ^~~~~~~~~~~~~~~~~~~~~~
   arch/x86/include/asm/refcount.h: In function 'refcount_dec':
>> arch/x86/include/asm/refcount.h:21:2: error: expected ':' or ')' before 
>> 'ASM_UNREACHABLE'
     ASM_UNREACHABLE     \
     ^
>> arch/x86/include/asm/refcount.h:29:2: note: in expansion of macro 
>> '_REFCOUNT_EXCEPTION'
     _REFCOUNT_EXCEPTION
     ^~~~~~~~~~~~~~~~~~~
   arch/x86/include/asm/refcount.h:34:2: note: in expansion of macro 
'REFCOUNT_CHECK_LT_ZERO'
     REFCOUNT_CHECK_LT_ZERO
     ^~~~~~~~~~~~~~~~~~~~~~
>> arch/x86/include/asm/refcount.h:61:3: note: in expansion of macro 
>> 'REFCOUNT_CHECK_LE_ZERO'
      REFCOUNT_CHECK_LE_ZERO
      ^~~~~~~~~~~~~~~~~~~~~~
   arch/x86/include/asm/refcount.h: In function 'refcount_sub_and_test':
>> arch/x86/include/asm/refcount.h:69:2: error: implicit declaration of 
>> function 'GEN_BINARY_SUFFIXED_RMWcc' [-Werror=implicit-function-declaration]
     GEN_BINARY_SUFFIXED_RMWcc(LOCK_PREFIX "subl", REFCOUNT_CHECK_LT_ZERO,
     ^~~~~~~~~~~~~~~~~~~~~~~~~
>> arch/x86/include/asm/refcount.h:21:2: error: expected ')' before 
>> 'ASM_UNREACHABLE'
     ASM_UNREACHABLE     \
     ^
>> arch/x86/include/asm/refcount.h:29:2: note: in expansion of macro 
>> '_REFCOUNT_EXCEPTION'
     _REFCOUNT_EXCEPTION
     ^~~~~~~~~~~~~~~~~~~
   arch/x86/include/asm/refcount.h:69:48: note: in expansion of macro 
'REFCOUNT_CHECK_LT_ZERO'
     GEN_BINARY_SUFFIXED_RMWcc(LOCK_PREFIX "subl", REFCOUNT_CHECK_LT_ZERO,
                                                   ^~~~~~~~~~~~~~~~~~~~~~
>> arch/x86/include/asm/refcount.h:71:1: warning: no return statement in 
>> function returning non-void [-Wreturn-type]
    }
    ^
   arch/x86/include/asm/refcount.h: In function 'refcount_dec_and_test':
>> arch/x86/include/asm/refcount.h:75:2: error: implicit declaration of 
>> function 'GEN_UNARY_SUFFIXED_RMWcc' [-Werror=implicit-function-declaration]
     GEN_UNARY_SUFFIXED_RMWcc(LOCK_PREFIX "decl", REFCOUNT_CHECK_LT_ZERO,
     ^~~~~~~~~~~~~~~~~~~~~~~~
>> arch/x86/include/asm/refcount.h:21:2: error: expected ')' before 
>> 'ASM_UNREACHABLE'
     ASM_UNREACHABLE     \
     ^
>> arch/x86/include/asm/refcount.h:29:2: note: in expansion of macro 
>> '_REFCOUNT_EXCEPTION'
     _REFCOUNT_EXCEPTION
     ^~~~~~~~~~~~~~~~~~~
   arch/x86/include/asm/refcount.h:75:47: note: in expansion of macro 
'REFCOUNT_CHECK_LT_ZERO'
     GEN_UNARY_SUFFIXED_RMWcc(LOCK_PREFIX "decl", REFCOUNT_CHECK_LT_ZERO,
                                                  ^~~~~~~~~~~~~~~~~~~~~~
   arch/x86/include/asm/refcount.h:77:1: warning: no return statement in 
function returning non-void [-Wreturn-type]
    }
    ^
   arch/x86/include/asm/refcount.h: In function 'refcount_add_not_zero':
>> arch/x86/include/asm/refcount.h:21:2: error: expected ':' or ')' before 
>> 'ASM_UNREACHABLE'
     ASM_UNREACHABLE     \
     ^
   arch/x86/include/asm/refcount.h:39:2: note: in expansion of macro 
'_REFCOUNT_EXCEPTION'
     _REFCOUNT_EXCEPTION
     ^~~~~~~~~~~~~~~~~~~
>> arch/x86/include/asm/refcount.h:93:17: note: in expansion of macro 
>> 'REFCOUNT_ERROR'
       asm volatile(REFCOUNT_ERROR
                    ^~~~~~~~~~~~~~
   cc1: some warnings being treated as errors
   make[2]: *** [arch/x86/kernel/asm-offsets.s] Error 1
   make[2]: Target '__build' not remade because of errors.
   make[1]: *** [prepare0] Error 2
   make[1]: Target 'prepare' not remade because of errors.
   make: *** [sub-make] Error 2

vim +21 arch/x86/include/asm/refcount.h

     8  
     9  /*
    10   * This is the first portion of the refcount error handling, which 
lives in
    11   * .text.unlikely, and is jumped to from the CPU flag check (in the
    12   * following macros). This saves the refcount value location into CX for
    13   * the exception handler to use (in mm/extable.c), and then triggers the
    14   * central refcount exception. The fixup address for the exception 
points
    15   * back to the regular execution flow in .text.
    16   */
    17  #define _REFCOUNT_EXCEPTION                             \
    18          ".pushsection .text.unlikely\n"                 \
    19          "111:\tlea %[counter], %%" _ASM_CX "\n"         \
    20          "112:\t" ASM_UD0 "\n"                           \
  > 21          ASM_UNREACHABLE                                 \
    22          ".popsection\n"                                 \
    23          "113:\n"                                        \
    24          _ASM_EXTABLE_REFCOUNT(112b, 113b)
    25  
    26  /* Trigger refcount exception if refcount result is negative. */
    27  #define REFCOUNT_CHECK_LT_ZERO                          \
    28          "js 111f\n\t"                                   \
  > 29          _REFCOUNT_EXCEPTION
    30  
    31  /* Trigger refcount exception if refcount result is zero or negative. */
    32  #define REFCOUNT_CHECK_LE_ZERO                          \
    33          "jz 111f\n\t"                                   \
  > 34          REFCOUNT_CHECK_LT_ZERO
    35  
    36  /* Trigger refcount exception unconditionally. */
    37  #define REFCOUNT_ERROR                                  \
    38          "jmp 111f\n\t"                                  \
    39          _REFCOUNT_EXCEPTION
    40  
    41  static __always_inline void refcount_add(unsigned int i, refcount_t *r)
    42  {
    43          asm volatile(LOCK_PREFIX "addl %1,%0\n\t"
  > 44                  REFCOUNT_CHECK_LT_ZERO
    45                  : [counter] "+m" (r->refs.counter)
    46                  : "ir" (i)
    47                  : "cc", "cx");
    48  }
    49  
    50  static __always_inline void refcount_inc(refcount_t *r)
    51  {
    52          asm volatile(LOCK_PREFIX "incl %0\n\t"
    53                  REFCOUNT_CHECK_LT_ZERO
    54                  : [counter] "+m" (r->refs.counter)
    55                  : : "cc", "cx");
    56  }
    57  
    58  static __always_inline void refcount_dec(refcount_t *r)
    59  {
    60          asm volatile(LOCK_PREFIX "decl %0\n\t"
  > 61                  REFCOUNT_CHECK_LE_ZERO
    62                  : [counter] "+m" (r->refs.counter)
    63                  : : "cc", "cx");
    64  }
    65  
    66  static __always_inline __must_check
    67  bool refcount_sub_and_test(unsigned int i, refcount_t *r)
    68  {
  > 69          GEN_BINARY_SUFFIXED_RMWcc(LOCK_PREFIX "subl", 
REFCOUNT_CHECK_LT_ZERO,
    70                                    r->refs.counter, "er", i, "%0", e);
  > 71  }
    72  
    73  static __always_inline __must_check bool 
refcount_dec_and_test(refcount_t *r)
    74  {
  > 75          GEN_UNARY_SUFFIXED_RMWcc(LOCK_PREFIX "decl", 
REFCOUNT_CHECK_LT_ZERO,
    76                                   r->refs.counter, "%0", e);
    77  }
    78  
    79  static __always_inline __must_check
    80  bool refcount_add_not_zero(unsigned int i, refcount_t *r)
    81  {
    82          int c, result;
    83  
    84          c = atomic_read(&(r->refs));
    85          do {
    86                  if (unlikely(c == 0))
    87                          return false;
    88  
    89                  result = c + i;
    90  
    91                  /* Did we try to increment from/to an undesirable 
state? */
    92                  if (unlikely(c < 0 || c == INT_MAX || result < c)) {
  > 93                          asm volatile(REFCOUNT_ERROR
    94                                       : : [counter] "m" (r->refs.counter)
    95                                       : "cc", "cx");
    96                          break;
    97                  }
    98  
    99          } while (!atomic_try_cmpxchg(&(r->refs), &c, result));
   100  
   101          return c != 0;
   102  }
   103  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

Reply via email to