tree:   
https://kernel.googlesource.com/pub/scm/linux/kernel/git/paulmck/linux-rcu.git 
from-joel.2019.08.16a
head:   01b0e4d3e0ac279b295bc06a3591f0b810b9908f
commit: bda80ba9decc7a32413e88d2f070de180c4b76ab [143/172] rcu/tree: Add basic 
support for kfree_rcu() batching
config: riscv-defconfig (attached as .config)
compiler: riscv64-linux-gcc (GCC) 7.4.0
reproduce:
        wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
        chmod +x ~/bin/make.cross
        git checkout bda80ba9decc7a32413e88d2f070de180c4b76ab
        # save the attached .config to linux build tree
        GCC_VERSION=7.4.0 make.cross ARCH=riscv 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <l...@intel.com>

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

   In file included from arch/riscv/include/asm/atomic.h:19:0,
                    from include/linux/atomic.h:7,
                    from include/linux/spinlock.h:445,
                    from kernel/rcu/tree.c:23:
   kernel/rcu/tree.c: In function 'kfree_rcu_monitor':
>> arch/riscv/include/asm/cmpxchg.h:140:2: warning: '__ret' is used 
>> uninitialized in this function [-Wuninitialized]
     __ret;        \
     ^~~~~
   arch/riscv/include/asm/cmpxchg.h:121:21: note: '__ret' was declared here
     __typeof__(*(ptr)) __ret;     \
                        ^
>> arch/riscv/include/asm/cmpxchg.h:146:23: note: in expansion of macro '__xchg'
     (__typeof__(*(ptr))) __xchg((ptr), _x_, sizeof(*(ptr))); \
                          ^~~~~~
>> kernel/rcu/tree.c:2808:6: note: in expansion of macro 'xchg'
     if (xchg(&krcp->monitor_todo, false))
         ^~~~
   In file included from include/linux/kernel.h:11:0,
                    from kernel/rcu/tree.c:21:
>> include/linux/compiler.h:350:38: error: call to '__compiletime_assert_2808' 
>> declared with attribute error: BUILD_BUG failed
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
                                         ^
   include/linux/compiler.h:331:4: note: in definition of macro 
'__compiletime_assert'
       prefix ## suffix();    \
       ^~~~~~
   include/linux/compiler.h:350:2: note: in expansion of macro 
'_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 
'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:59:21: note: in expansion of macro 
'BUILD_BUG_ON_MSG'
    #define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed")
                        ^~~~~~~~~~~~~~~~
>> arch/riscv/include/asm/cmpxchg.h:138:3: note: in expansion of macro 
>> 'BUILD_BUG'
      BUILD_BUG();      \
      ^~~~~~~~~
>> arch/riscv/include/asm/cmpxchg.h:146:23: note: in expansion of macro '__xchg'
     (__typeof__(*(ptr))) __xchg((ptr), _x_, sizeof(*(ptr))); \
                          ^~~~~~
>> kernel/rcu/tree.c:2808:6: note: in expansion of macro 'xchg'
     if (xchg(&krcp->monitor_todo, false))
         ^~~~
   In function 'kfree_rcu_drain_unlock',
       inlined from 'kfree_rcu_monitor' at kernel/rcu/tree.c:2809:3:
   include/linux/compiler.h:350:38: error: call to '__compiletime_assert_2792' 
declared with attribute error: BUILD_BUG failed
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
                                         ^
   include/linux/compiler.h:331:4: note: in definition of macro 
'__compiletime_assert'
       prefix ## suffix();    \
       ^~~~~~
   include/linux/compiler.h:350:2: note: in expansion of macro 
'_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 
'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:59:21: note: in expansion of macro 
'BUILD_BUG_ON_MSG'
    #define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed")
                        ^~~~~~~~~~~~~~~~
>> arch/riscv/include/asm/cmpxchg.h:138:3: note: in expansion of macro 
>> 'BUILD_BUG'
      BUILD_BUG();      \
      ^~~~~~~~~
>> arch/riscv/include/asm/cmpxchg.h:146:23: note: in expansion of macro '__xchg'
     (__typeof__(*(ptr))) __xchg((ptr), _x_, sizeof(*(ptr))); \
                          ^~~~~~
   kernel/rcu/tree.c:2792:7: note: in expansion of macro 'xchg'
     if (!xchg(&krcp->monitor_todo, true))
          ^~~~
   kernel/rcu/tree.c: In function 'kfree_call_rcu':
>> kernel/rcu/tree.c:2860:5: warning: '__ret' may be used uninitialized in this 
>> function [-Wmaybe-uninitialized]
     if (!xchg(&krcp->monitor_todo, true))
        ^
   In file included from include/linux/kernel.h:11:0,
                    from kernel/rcu/tree.c:21:
   include/linux/compiler.h:350:38: error: call to '__compiletime_assert_2860' 
declared with attribute error: BUILD_BUG failed
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
                                         ^
   include/linux/compiler.h:331:4: note: in definition of macro 
'__compiletime_assert'
       prefix ## suffix();    \
       ^~~~~~
   include/linux/compiler.h:350:2: note: in expansion of macro 
'_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 
'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:59:21: note: in expansion of macro 
'BUILD_BUG_ON_MSG'
    #define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed")
                        ^~~~~~~~~~~~~~~~
>> arch/riscv/include/asm/cmpxchg.h:138:3: note: in expansion of macro 
>> 'BUILD_BUG'
      BUILD_BUG();      \
      ^~~~~~~~~
>> arch/riscv/include/asm/cmpxchg.h:146:23: note: in expansion of macro '__xchg'
     (__typeof__(*(ptr))) __xchg((ptr), _x_, sizeof(*(ptr))); \
                          ^~~~~~
   kernel/rcu/tree.c:2860:7: note: in expansion of macro 'xchg'
     if (!xchg(&krcp->monitor_todo, true))
          ^~~~
--
   In file included from arch/riscv/include/asm/atomic.h:19:0,
                    from include/linux/atomic.h:7,
                    from include/linux/spinlock.h:445,
                    from kernel//rcu/tree.c:23:
   kernel//rcu/tree.c: In function 'kfree_rcu_monitor':
>> arch/riscv/include/asm/cmpxchg.h:140:2: warning: '__ret' is used 
>> uninitialized in this function [-Wuninitialized]
     __ret;        \
     ^~~~~
   arch/riscv/include/asm/cmpxchg.h:121:21: note: '__ret' was declared here
     __typeof__(*(ptr)) __ret;     \
                        ^
>> arch/riscv/include/asm/cmpxchg.h:146:23: note: in expansion of macro '__xchg'
     (__typeof__(*(ptr))) __xchg((ptr), _x_, sizeof(*(ptr))); \
                          ^~~~~~
   kernel//rcu/tree.c:2808:6: note: in expansion of macro 'xchg'
     if (xchg(&krcp->monitor_todo, false))
         ^~~~
   In file included from include/linux/kernel.h:11:0,
                    from kernel//rcu/tree.c:21:
>> include/linux/compiler.h:350:38: error: call to '__compiletime_assert_2808' 
>> declared with attribute error: BUILD_BUG failed
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
                                         ^
   include/linux/compiler.h:331:4: note: in definition of macro 
'__compiletime_assert'
       prefix ## suffix();    \
       ^~~~~~
   include/linux/compiler.h:350:2: note: in expansion of macro 
'_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 
'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:59:21: note: in expansion of macro 
'BUILD_BUG_ON_MSG'
    #define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed")
                        ^~~~~~~~~~~~~~~~
>> arch/riscv/include/asm/cmpxchg.h:138:3: note: in expansion of macro 
>> 'BUILD_BUG'
      BUILD_BUG();      \
      ^~~~~~~~~
>> arch/riscv/include/asm/cmpxchg.h:146:23: note: in expansion of macro '__xchg'
     (__typeof__(*(ptr))) __xchg((ptr), _x_, sizeof(*(ptr))); \
                          ^~~~~~
   kernel//rcu/tree.c:2808:6: note: in expansion of macro 'xchg'
     if (xchg(&krcp->monitor_todo, false))
         ^~~~
   In function 'kfree_rcu_drain_unlock',
       inlined from 'kfree_rcu_monitor' at kernel//rcu/tree.c:2809:3:
   include/linux/compiler.h:350:38: error: call to '__compiletime_assert_2792' 
declared with attribute error: BUILD_BUG failed
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
                                         ^
   include/linux/compiler.h:331:4: note: in definition of macro 
'__compiletime_assert'
       prefix ## suffix();    \
       ^~~~~~
   include/linux/compiler.h:350:2: note: in expansion of macro 
'_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 
'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:59:21: note: in expansion of macro 
'BUILD_BUG_ON_MSG'
    #define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed")
                        ^~~~~~~~~~~~~~~~
>> arch/riscv/include/asm/cmpxchg.h:138:3: note: in expansion of macro 
>> 'BUILD_BUG'
      BUILD_BUG();      \
      ^~~~~~~~~
>> arch/riscv/include/asm/cmpxchg.h:146:23: note: in expansion of macro '__xchg'
     (__typeof__(*(ptr))) __xchg((ptr), _x_, sizeof(*(ptr))); \
                          ^~~~~~
   kernel//rcu/tree.c:2792:7: note: in expansion of macro 'xchg'
     if (!xchg(&krcp->monitor_todo, true))
          ^~~~
   kernel//rcu/tree.c: In function 'kfree_call_rcu':
   kernel//rcu/tree.c:2860:5: warning: '__ret' may be used uninitialized in 
this function [-Wmaybe-uninitialized]
     if (!xchg(&krcp->monitor_todo, true))
        ^
   In file included from include/linux/kernel.h:11:0,
                    from kernel//rcu/tree.c:21:
   include/linux/compiler.h:350:38: error: call to '__compiletime_assert_2860' 
declared with attribute error: BUILD_BUG failed
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
                                         ^
   include/linux/compiler.h:331:4: note: in definition of macro 
'__compiletime_assert'
       prefix ## suffix();    \
       ^~~~~~
   include/linux/compiler.h:350:2: note: in expansion of macro 
'_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 
'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:59:21: note: in expansion of macro 
'BUILD_BUG_ON_MSG'
    #define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed")
                        ^~~~~~~~~~~~~~~~
>> arch/riscv/include/asm/cmpxchg.h:138:3: note: in expansion of macro 
>> 'BUILD_BUG'
      BUILD_BUG();      \
      ^~~~~~~~~
>> arch/riscv/include/asm/cmpxchg.h:146:23: note: in expansion of macro '__xchg'
     (__typeof__(*(ptr))) __xchg((ptr), _x_, sizeof(*(ptr))); \
                          ^~~~~~
   kernel//rcu/tree.c:2860:7: note: in expansion of macro 'xchg'
     if (!xchg(&krcp->monitor_todo, true))
          ^~~~

vim +/xchg +2808 kernel/rcu/tree.c

  2776  
  2777  static inline void kfree_rcu_drain_unlock(struct kfree_rcu_cpu *krcp,
  2778                                     unsigned long flags)
  2779  {
  2780          /* Flush ->head to ->head_free, all objects on ->head_free will 
be
  2781           * kfree'd after a grace period.
  2782           */
  2783          if (queue_kfree_rcu_work(krcp)) {
  2784                  /* Success! Our job is done here. */
  2785                  spin_unlock_irqrestore(&krcp->lock, flags);
  2786                  return;
  2787          }
  2788  
  2789          /* Previous batch that was queued to RCU did not get free yet, 
let us
  2790           * try again soon.
  2791           */
> 2792          if (!xchg(&krcp->monitor_todo, true))
  2793                  schedule_delayed_work(&krcp->monitor_work, 
KFREE_DRAIN_JIFFIES);
  2794          spin_unlock_irqrestore(&krcp->lock, flags);
  2795  }
  2796  
  2797  /*
  2798   * This function is invoked after the KFREE_DRAIN_JIFFIES timeout has 
elapsed,
  2799   * and it drains the specified kfree_rcu_cpu structure's ->head list.
  2800   */
  2801  static void kfree_rcu_monitor(struct work_struct *work)
  2802  {
  2803          unsigned long flags;
  2804          struct kfree_rcu_cpu *krcp = container_of(work, struct 
kfree_rcu_cpu,
  2805                                                   monitor_work.work);
  2806  
  2807          spin_lock_irqsave(&krcp->lock, flags);
> 2808          if (xchg(&krcp->monitor_todo, false))
  2809                  kfree_rcu_drain_unlock(krcp, flags);
  2810          else
  2811                  spin_unlock_irqrestore(&krcp->lock, flags);
  2812  }
  2813  
  2814  /*
  2815   * This version of kfree_call_rcu does not do batching of kfree_rcu() 
requests.
  2816   * Used only by rcuperf torture test for comparison with 
kfree_rcu_batch().
  2817   */
  2818  void kfree_call_rcu_nobatch(struct rcu_head *head, rcu_callback_t func)
  2819  {
  2820          __call_rcu(head, func, 1);
  2821  }
  2822  EXPORT_SYMBOL_GPL(kfree_call_rcu_nobatch);
  2823  
  2824  /*
  2825   * Queue a request for lazy invocation of kfree() after a grace period.
  2826   *
  2827   * Each kfree_call_rcu() request is added to a batch. The batch will be 
drained
  2828   * every KFREE_DRAIN_JIFFIES number of jiffies. All the objects in the 
batch
  2829   * will be kfree'd in workqueue context. This allows us to:
  2830   *
  2831   * 1. Batch requests together to reduce the number of grace periods 
during
  2832   * heavy kfree_rcu() load.
  2833   *
  2834   * 2. In the future, makes it possible to use kfree_bulk() on a large 
number of
  2835   * kfree_rcu() requests thus reducing the per-object overhead of 
kfree() and
  2836   * also reducing cache misses.
  2837   */
  2838  void kfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
  2839  {
  2840          unsigned long flags;
  2841          struct kfree_rcu_cpu *krcp;
  2842  
  2843          /* kfree_call_rcu() batching requires timers to be up. If the 
scheduler
  2844           * is not yet up, just skip batching and do the non-batched 
version.
  2845           */
  2846          if (rcu_scheduler_active != RCU_SCHEDULER_RUNNING)
  2847                  return kfree_call_rcu_nobatch(head, func);
  2848  
  2849          head->func = func;
  2850  
  2851          local_irq_save(flags);  /* For safely calling this_cpu_ptr(). */
  2852          krcp = this_cpu_ptr(&krc);
  2853          spin_lock(&krcp->lock);
  2854  
  2855          /* Queue the kfree but don't yet schedule the batch. */
  2856          head->next = krcp->head;
  2857          krcp->head = head;
  2858  
  2859          /* Schedule monitor for timely drain after KFREE_DRAIN_JIFFIES. 
*/
> 2860          if (!xchg(&krcp->monitor_todo, true))
  2861                  schedule_delayed_work(&krcp->monitor_work, 
KFREE_DRAIN_JIFFIES);
  2862  
  2863          spin_unlock(&krcp->lock);
  2864          local_irq_restore(flags);
  2865  }
  2866  EXPORT_SYMBOL_GPL(kfree_call_rcu);
  2867  

---
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