tree: https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git rcu/dev head: b4a12b9fc6e8c8e6b17b968b654f388a1379ce8a commit: b4a12b9fc6e8c8e6b17b968b654f388a1379ce8a [23/23] EXP: rcu: Add yet more debugging info to assertion config: arm-efm32_defconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.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 b4a12b9fc6e8c8e6b17b968b654f388a1379ce8a # save the attached .config to linux build tree make.cross ARCH=arm All warnings (new ones prefixed by >>): In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from kernel//rcu/tree.c:31: kernel//rcu/tree.c: In function 'rcu_gp_cleanup': >> include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 9 has type 'unsigned int' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:14:19: note: in expansion of macro 'KERN_SOH' #define KERN_INFO KERN_SOH "6" /* informational */ ^~~~~~~~ include/linux/printk.h:308:9: note: in expansion of macro 'KERN_INFO' printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~~ >> kernel//rcu/tree.c:2147:4: note: in expansion of macro 'pr_info' pr_info("%s: grp: %d-%d level: %d ->gp_tasks %p ->exp_tasks %p &->blkd_tasks: %p offset: %lu\n", __func__, rnp->grplo, rnp->grphi, rnp->level, rnp->gp_tasks, rnp->exp_tasks, &rnp->blkd_tasks, offsetof(typeof(*rnp), blkd_tasks)); ^~~~~~~ kernel//rcu/tree.c:2147:95: note: format string is defined here pr_info("%s: grp: %d-%d level: %d ->gp_tasks %p ->exp_tasks %p &->blkd_tasks: %p offset: %lu\n", __func__, rnp->grplo, rnp->grphi, rnp->level, rnp->gp_tasks, rnp->exp_tasks, &rnp->blkd_tasks, offsetof(typeof(*rnp), blkd_tasks)); ~~^ %u -- In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from kernel/rcu/tree.c:31: kernel/rcu/tree.c: In function 'rcu_gp_cleanup': >> include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 9 has type 'unsigned int' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:14:19: note: in expansion of macro 'KERN_SOH' #define KERN_INFO KERN_SOH "6" /* informational */ ^~~~~~~~ include/linux/printk.h:308:9: note: in expansion of macro 'KERN_INFO' printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~~ kernel/rcu/tree.c:2147:4: note: in expansion of macro 'pr_info' pr_info("%s: grp: %d-%d level: %d ->gp_tasks %p ->exp_tasks %p &->blkd_tasks: %p offset: %lu\n", __func__, rnp->grplo, rnp->grphi, rnp->level, rnp->gp_tasks, rnp->exp_tasks, &rnp->blkd_tasks, offsetof(typeof(*rnp), blkd_tasks)); ^~~~~~~ kernel/rcu/tree.c:2147:95: note: format string is defined here pr_info("%s: grp: %d-%d level: %d ->gp_tasks %p ->exp_tasks %p &->blkd_tasks: %p offset: %lu\n", __func__, rnp->grplo, rnp->grphi, rnp->level, rnp->gp_tasks, rnp->exp_tasks, &rnp->blkd_tasks, offsetof(typeof(*rnp), blkd_tasks)); ~~^ %u vim +/pr_info +2147 kernel//rcu/tree.c 2102 2103 /* 2104 * Clean up after the old grace period. 2105 */ 2106 static void rcu_gp_cleanup(struct rcu_state *rsp) 2107 { 2108 unsigned long gp_duration; 2109 bool needgp = false; 2110 int nocb = 0; 2111 struct rcu_data *rdp; 2112 struct rcu_node *rnp = rcu_get_root(rsp); 2113 struct swait_queue_head *sq; 2114 2115 WRITE_ONCE(rsp->gp_activity, jiffies); 2116 raw_spin_lock_irq_rcu_node(rnp); 2117 gp_duration = jiffies - rsp->gp_start; 2118 if (gp_duration > rsp->gp_max) 2119 rsp->gp_max = gp_duration; 2120 2121 /* 2122 * We know the grace period is complete, but to everyone else 2123 * it appears to still be ongoing. But it is also the case 2124 * that to everyone else it looks like there is nothing that 2125 * they can do to advance the grace period. It is therefore 2126 * safe for us to drop the lock in order to mark the grace 2127 * period as completed in all of the rcu_node structures. 2128 */ 2129 raw_spin_unlock_irq_rcu_node(rnp); 2130 2131 /* 2132 * Propagate new ->completed value to rcu_node structures so 2133 * that other CPUs don't have to wait until the start of the next 2134 * grace period to process their callbacks. This also avoids 2135 * some nasty RCU grace-period initialization races by forcing 2136 * the end of the current grace period to be completely recorded in 2137 * all of the rcu_node structures before the beginning of the next 2138 * grace period is recorded in any of the rcu_node structures. 2139 */ 2140 rcu_for_each_node_breadth_first(rsp, rnp) { 2141 raw_spin_lock_irq_rcu_node(rnp); 2142 #ifdef CONFIG_PREEMPT_RCU 2143 if (WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp))) { 2144 int i; 2145 struct task_struct *t; 2146 > 2147 pr_info("%s: grp: %d-%d level: %d ->gp_tasks %p ->exp_tasks %p &->blkd_tasks: %p offset: %lu\n", __func__, rnp->grplo, rnp->grphi, rnp->level, rnp->gp_tasks, rnp->exp_tasks, &rnp->blkd_tasks, offsetof(typeof(*rnp), blkd_tasks)); 2148 pr_cont("\t->blkd_tasks"); 2149 i = 0; 2150 list_for_each_entry(t, &rnp->blkd_tasks, rcu_node_entry) { 2151 pr_cont(" %p", t); 2152 if (++i >= 10) 2153 break; 2154 } 2155 pr_cont("\n"); 2156 } 2157 #endif /* #ifdef CONFIG_PREEMPT_RCU */ 2158 WARN_ON_ONCE(rnp->qsmask); 2159 WRITE_ONCE(rnp->completed, rsp->gpnum); 2160 rdp = this_cpu_ptr(rsp->rda); 2161 if (rnp == rdp->mynode) 2162 needgp = __note_gp_changes(rsp, rnp, rdp) || needgp; 2163 /* smp_mb() provided by prior unlock-lock pair. */ 2164 nocb += rcu_future_gp_cleanup(rsp, rnp); 2165 sq = rcu_nocb_gp_get(rnp); 2166 raw_spin_unlock_irq_rcu_node(rnp); 2167 rcu_nocb_gp_cleanup(sq); 2168 cond_resched_rcu_qs(); 2169 WRITE_ONCE(rsp->gp_activity, jiffies); 2170 rcu_gp_slow(rsp, gp_cleanup_delay); 2171 } 2172 rnp = rcu_get_root(rsp); 2173 raw_spin_lock_irq_rcu_node(rnp); /* Order GP before ->completed update. */ 2174 rcu_nocb_gp_set(rnp, nocb); 2175 2176 /* Declare grace period done. */ 2177 WRITE_ONCE(rsp->completed, rsp->gpnum); 2178 trace_rcu_grace_period(rsp->name, rsp->completed, TPS("end")); 2179 rsp->gp_state = RCU_GP_IDLE; 2180 rdp = this_cpu_ptr(rsp->rda); 2181 /* Advance CBs to reduce false positives below. */ 2182 needgp = rcu_advance_cbs(rsp, rnp, rdp) || needgp; 2183 if (needgp || cpu_needs_another_gp(rsp, rdp)) { 2184 WRITE_ONCE(rsp->gp_flags, RCU_GP_FLAG_INIT); 2185 trace_rcu_grace_period(rsp->name, 2186 READ_ONCE(rsp->gpnum), 2187 TPS("newreq")); 2188 } 2189 raw_spin_unlock_irq_rcu_node(rnp); 2190 } 2191 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation