From: Joel Fernandes <joel@joelfernandes.org>
To: kbuild test robot <lkp@intel.com>,
Paul Walmsley <paul.walmsley@sifive.com>,
Palmer Dabbelt <palmer@sifive.com>,
Albert Ou <aou@eecs.berkeley.edu>,
atishp04@gmail.com
Cc: kbuild-all@01.org, linux-kernel@vger.kernel.org
Subject: Re: [rcu:from-joel.2019.08.16a 143/172] kernel/rcu/tree.c:2808:6: note: in expansion of macro 'xchg'
Date: Fri, 16 Aug 2019 21:04:25 -0400 [thread overview]
Message-ID: <20190817010425.GA89926@google.com> (raw)
In-Reply-To: <201908170558.4JoZrC3p%lkp@intel.com>
On Sat, Aug 17, 2019 at 05:10:59AM +0800, kbuild test robot wrote:
> 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
This seems to be a riscv issue:
A call to '__compiletime_assert_2792' declared with attribute error:
BUILD_BUG failed
Could riscv folks take a look at it? Why is using xchg() causing issues? The
xchg() is being done on a bool.
thanks,
- Joel
> If you fix the issue, kindly add following tag
> Reported-by: kbuild test robot <lkp@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
next prev parent reply other threads:[~2019-08-17 1:04 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-16 21:10 [rcu:from-joel.2019.08.16a 143/172] kernel/rcu/tree.c:2808:6: note: in expansion of macro 'xchg' kbuild test robot
2019-08-17 1:04 ` Joel Fernandes [this message]
2019-08-17 1:09 ` Joel Fernandes
2019-08-17 3:10 ` Paul Walmsley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190817010425.GA89926@google.com \
--to=joel@joelfernandes.org \
--cc=aou@eecs.berkeley.edu \
--cc=atishp04@gmail.com \
--cc=kbuild-all@01.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lkp@intel.com \
--cc=palmer@sifive.com \
--cc=paul.walmsley@sifive.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.