Now that RCU Tasks Trace has been re-implemented in terms of SRCU-fast, the ->trc_ipi_to_cpu, ->trc_blkd_cpu, ->trc_blkd_node, ->trc_holdout_list, and ->trc_reader_special task_struct fields are no longer used. In addition, the rcu_tasks_trace_qs(), rcu_tasks_trace_qs_blkd(), exit_tasks_rcu_finish_trace(), and rcu_spawn_tasks_trace_kthread(), show_rcu_tasks_trace_gp_kthread(), rcu_tasks_trace_get_gp_data(), rcu_tasks_trace_torture_stats_print(), and get_rcu_tasks_trace_gp_kthread() functions and all the other functions that they invoke are no longer used. Also, the TRC_NEED_QS and TRC_NEED_QS_CHECKED CPP macros are no longer used. Neither are the rcu_tasks_trace_lazy_ms and rcu_task_ipi_delay rcupdate module parameters and the TASKS_TRACE_RCU_READ_MB Kconfig option. This commit therefore removes all of them. [ paulmck: Apply Alexei Starovoitov feedback. ]
Unified · Split
| @@ -6249,13 +6249,6 @@ Kernel parameters · 6248 unmodified lines | ||
| 6249 | 6249 | dynamically) adjusted. This parameter is intended |
| 6250 | 6250 | for use in testing. |
| 6251 | 6251 | |
| 6252 | − rcupdate.rcu_task_ipi_delay= [KNL] | |
| 6253 | − Set time in jiffies during which RCU tasks will | |
| 6254 | − avoid sending IPIs, starting with the beginning | |
| 6255 | − of a given grace period. Setting a large | |
| 6256 | − number avoids disturbing real-time workloads, | |
| 6257 | − but lengthens grace periods. | |
| 6258 | − | |
| 6259 | 6252 | rcupdate.rcu_task_lazy_lim= [KNL] |
| 6260 | 6253 | Number of callbacks on a given CPU that will |
| 6261 | 6254 | cancel laziness on that CPU. Use -1 to disable |
| @@ -6299,14 +6292,6 @@ Kernel parameters · 37 unmodified lines | ||
| 6299 | 6292 | of zero will disable batching. Batching is |
| 6300 | 6293 | always disabled for synchronize_rcu_tasks(). |
| 6301 | 6294 | |
| 6302 | − rcupdate.rcu_tasks_trace_lazy_ms= [KNL] | |
| 6303 | − Set timeout in milliseconds RCU Tasks | |
| 6304 | − Trace asynchronous callback batching for | |
| 6305 | − call_rcu_tasks_trace(). A negative value | |
| 6306 | − will take the default. A value of zero will | |
| 6307 | − disable batching. Batching is always disabled | |
| 6308 | − for synchronize_rcu_tasks_trace(). | |
| 6309 | − | |
| 6310 | 6295 | rcupdate.rcu_self_test= [KNL] |
| 6311 | 6296 | Run the RCU early boot self tests |
| 6312 | 6297 | |
| @@ -175,36 +175,7 @@ void rcu_tasks_torture_stats_print(char *tt, char *tf); · 174 unmodified lines | ||
| 175 | 175 | # define synchronize_rcu_tasks synchronize_rcu |
| 176 | 176 | # endif |
| 177 | 177 | |
| 178 | −# ifdef CONFIG_TASKS_TRACE_RCU | |
| 179 | −// Bits for ->trc_reader_special.b.need_qs field. | |
| 180 | −#define TRC_NEED_QS 0x1 // Task needs a quiescent state. | |
| 181 | −#define TRC_NEED_QS_CHECKED 0x2 // Task has been checked for needing quiescent state. | |
| 182 | − | |
| 183 | −u8 rcu_trc_cmpxchg_need_qs(struct task_struct *t, u8 old, u8 new); | |
| 184 | −void rcu_tasks_trace_qs_blkd(struct task_struct *t); | |
| 185 | − | |
| 186 | −# define rcu_tasks_trace_qs(t) \ | |
| 187 | − do { \ | |
| 188 | − int ___rttq_nesting = READ_ONCE((t)->trc_reader_nesting); \ | |
| 189 | − \ | |
| 190 | − if (unlikely(READ_ONCE((t)->trc_reader_special.b.need_qs) == TRC_NEED_QS) && \ | |
| 191 | − likely(!___rttq_nesting)) { \ | |
| 192 | − rcu_trc_cmpxchg_need_qs((t), TRC_NEED_QS, TRC_NEED_QS_CHECKED); \ | |
| 193 | − } else if (___rttq_nesting && ___rttq_nesting != INT_MIN && \ | |
| 194 | − !READ_ONCE((t)->trc_reader_special.b.blocked)) { \ | |
| 195 | − rcu_tasks_trace_qs_blkd(t); \ | |
| 196 | − } \ | |
| 197 | − } while (0) | |
| 198 | −void rcu_tasks_trace_torture_stats_print(char *tt, char *tf); | |
| 199 | −# else | |
| 200 | −# define rcu_tasks_trace_qs(t) do { } while (0) | |
| 201 | −# endif | |
| 202 | − | |
| 203 | −#define rcu_tasks_qs(t, preempt) \ | |
| 204 | −do { \ | |
| 205 | − rcu_tasks_classic_qs((t), (preempt)); \ | |
| 206 | − rcu_tasks_trace_qs(t); \ | |
| 207 | −} while (0) | |
| 178 | +#define rcu_tasks_qs(t, preempt) rcu_tasks_classic_qs((t), (preempt)) | |
| 208 | 179 | |
| 209 | 180 | # ifdef CONFIG_TASKS_RUDE_RCU |
| 210 | 181 | void synchronize_rcu_tasks_rude(void); |
| @@ -136,9 +136,7 @@ static inline void rcu_barrier_tasks_trace(void) · 135 unmodified lines | ||
| 136 | 136 | } |
| 137 | 137 | |
| 138 | 138 | // Placeholders to enable stepwise transition. |
| 139 | −void rcu_tasks_trace_get_gp_data(int *flags, unsigned long *gp_seq); | |
| 140 | 139 | void __init rcu_tasks_trace_suppress_unused(void); |
| 141 | −struct task_struct *get_rcu_tasks_trace_gp_kthread(void); | |
| 142 | 140 | |
| 143 | 141 | #else |
| 144 | 142 | /* |
| @@ -946,11 +946,6 @@ struct task_struct { · 945 unmodified lines | ||
| 946 | 946 | #ifdef CONFIG_TASKS_TRACE_RCU |
| 947 | 947 | int trc_reader_nesting; |
| 948 | 948 | struct srcu_ctr __percpu *trc_reader_scp; |
| 949 | − int trc_ipi_to_cpu; | |
| 950 | − union rcu_special trc_reader_special; | |
| 951 | − struct list_head trc_holdout_list; | |
| 952 | − struct list_head trc_blkd_node; | |
| 953 | − int trc_blkd_cpu; | |
| 954 | 949 | #endif /* #ifdef CONFIG_TASKS_TRACE_RCU */ |
| 955 | 950 | |
| 956 | 951 | struct sched_info sched_info; |
| @@ -195,9 +195,6 @@ struct task_struct init_task __aligned(L1_CACHE_BYTES) = { · 194 unmodified lines | ||
| 195 | 195 | #endif |
| 196 | 196 | #ifdef CONFIG_TASKS_TRACE_RCU |
| 197 | 197 | .trc_reader_nesting = 0, |
| 198 | − .trc_reader_special.s = 0, | |
| 199 | − .trc_holdout_list = LIST_HEAD_INIT(init_task.trc_holdout_list), | |
| 200 | − .trc_blkd_node = LIST_HEAD_INIT(init_task.trc_blkd_node), | |
| 201 | 198 | #endif |
| 202 | 199 | #ifdef CONFIG_CPUSETS |
| 203 | 200 | .mems_allowed_seq = SEQCNT_SPINLOCK_ZERO(init_task.mems_allowed_seq, |
| @@ -1828,9 +1828,6 @@ static inline void rcu_copy_process(struct task_struct *p) · 1827 unmodified lines | ||
| 1828 | 1828 | #endif /* #ifdef CONFIG_TASKS_RCU */ |
| 1829 | 1829 | #ifdef CONFIG_TASKS_TRACE_RCU |
| 1830 | 1830 | p->trc_reader_nesting = 0; |
| 1831 | − p->trc_reader_special.s = 0; | |
| 1832 | − INIT_LIST_HEAD(&p->trc_holdout_list); | |
| 1833 | − INIT_LIST_HEAD(&p->trc_blkd_node); | |
| 1834 | 1831 | #endif /* #ifdef CONFIG_TASKS_TRACE_RCU */ |
| 1835 | 1832 | } |
| 1836 | 1833 | |
| @@ -313,24 +313,6 @@ config RCU_NOCB_CPU_CB_BOOST · 312 unmodified lines | ||
| 313 | 313 | Say Y here if you want to set RT priority for offloading kthreads. |
| 314 | 314 | Say N here if you are building a !PREEMPT_RT kernel and are unsure. |
| 315 | 315 | |
| 316 | −config TASKS_TRACE_RCU_READ_MB | |
| 317 | − bool "Tasks Trace RCU readers use memory barriers in user and idle" | |
| 318 | − depends on RCU_EXPERT && TASKS_TRACE_RCU | |
| 319 | − default PREEMPT_RT || NR_CPUS < 8 | |
| 320 | − help | |
| 321 | − Use this option to further reduce the number of IPIs sent | |
| 322 | − to CPUs executing in userspace or idle during tasks trace | |
| 323 | − RCU grace periods. Given that a reasonable setting of | |
| 324 | − the rcupdate.rcu_task_ipi_delay kernel boot parameter | |
| 325 | − eliminates such IPIs for many workloads, proper setting | |
| 326 | − of this Kconfig option is important mostly for aggressive | |
| 327 | − real-time installations and for battery-powered devices, | |
| 328 | − hence the default chosen above. | |
| 329 | − | |
| 330 | − Say Y here if you hate IPIs. | |
| 331 | − Say N here if you hate read-side memory barriers. | |
| 332 | − Take the default if you are unsure. | |
| 333 | − | |
| 334 | 316 | config RCU_LAZY |
| 335 | 317 | bool "RCU callback lazy invocation functionality" |
| 336 | 318 | depends on RCU_NOCB_CPU |
| @@ -544,10 +544,6 @@ struct task_struct *get_rcu_tasks_rude_gp_kthread(void); · 543 unmodified lines | ||
| 544 | 544 | void rcu_tasks_rude_get_gp_data(int *flags, unsigned long *gp_seq); |
| 545 | 545 | #endif // # ifdef CONFIG_TASKS_RUDE_RCU |
| 546 | 546 | |
| 547 | −#ifdef CONFIG_TASKS_TRACE_RCU | |
| 548 | −void rcu_tasks_trace_get_gp_data(int *flags, unsigned long *gp_seq); | |
| 549 | −#endif | |
| 550 | − | |
| 551 | 547 | #ifdef CONFIG_TASKS_RCU_GENERIC |
| 552 | 548 | void tasks_cblist_init_generic(void); |
| 553 | 549 | #else /* #ifdef CONFIG_TASKS_RCU_GENERIC */ |
| @@ -673,11 +669,6 @@ void show_rcu_tasks_rude_gp_kthread(void); · 119 unmodified lines | ||
| 673 | 669 | #else |
| 674 | 670 | static inline void show_rcu_tasks_rude_gp_kthread(void) {} |
| 675 | 671 | #endif |
| 676 | −#if !defined(CONFIG_TINY_RCU) && defined(CONFIG_TASKS_TRACE_RCU) | |
| 677 | −void show_rcu_tasks_trace_gp_kthread(void); | |
| 678 | −#else | |
| 679 | −static inline void show_rcu_tasks_trace_gp_kthread(void) {} | |
| 680 | −#endif | |
| 681 | 672 | |
| 682 | 673 | #ifdef CONFIG_TINY_RCU |
| 683 | 674 | static inline bool rcu_cpu_beenfullyonline(int cpu) { return true; } |
| @@ -400,11 +400,6 @@ static void tasks_trace_scale_read_unlock(int idx) · 399 unmodified lines | ||
| 400 | 400 | rcu_read_unlock_trace(); |
| 401 | 401 | } |
| 402 | 402 | |
| 403 | −static void rcu_tasks_trace_scale_stats(void) | |
| 404 | −{ | |
| 405 | − rcu_tasks_trace_torture_stats_print(scale_type, SCALE_FLAG); | |
| 406 | −} | |
| 407 | − | |
| 408 | 403 | static struct rcu_scale_ops tasks_tracing_ops = { |
| 409 | 404 | .ptype = RCU_TASKS_FLAVOR, |
| 410 | 405 | .init = rcu_sync_scale_init, |
| @@ -416,8 +411,6 @@ static struct rcu_scale_ops tasks_tracing_ops = { · 5 unmodified lines | ||
| 416 | 411 | .gp_barrier = rcu_barrier_tasks_trace, |
| 417 | 412 | .sync = synchronize_rcu_tasks_trace, |
| 418 | 413 | .exp_sync = synchronize_rcu_tasks_trace, |
| 419 | − .rso_gp_kthread = get_rcu_tasks_trace_gp_kthread, | |
| 420 | − .stats = IS_ENABLED(CONFIG_TINY_RCU) ? NULL : rcu_tasks_trace_scale_stats, | |
| 421 | 414 | .name = "tasks-tracing" |
| 422 | 415 | }; |
| 423 | 416 | |
| @@ -1180,8 +1180,6 @@ static struct rcu_torture_ops tasks_tracing_ops = { · 1179 unmodified lines | ||
| 1180 | 1180 | .exp_sync = synchronize_rcu_tasks_trace, |
| 1181 | 1181 | .call = call_rcu_tasks_trace, |
| 1182 | 1182 | .cb_barrier = rcu_barrier_tasks_trace, |
| 1183 | − .gp_kthread_dbg = show_rcu_tasks_trace_gp_kthread, | |
| 1184 | − .get_gp_data = rcu_tasks_trace_get_gp_data, | |
| 1185 | 1183 | .cbflood_max = 50000, |
| 1186 | 1184 | .irq_capable = 1, |
| 1187 | 1185 | .slow_gps = 1, |
| @@ -161,11 +161,6 @@ static void tasks_rcu_exit_srcu_stall(struct timer_list *unused); · 160 unmodified lines | ||
| 161 | 161 | static DEFINE_TIMER(tasks_rcu_exit_srcu_stall_timer, tasks_rcu_exit_srcu_stall); |
| 162 | 162 | #endif |
| 163 | 163 | |
| 164 | −/* Avoid IPIing CPUs early in the grace period. */ | |
| 165 | −#define RCU_TASK_IPI_DELAY (IS_ENABLED(CONFIG_TASKS_TRACE_RCU_READ_MB) ? HZ / 2 : 0) | |
| 166 | −static int rcu_task_ipi_delay __read_mostly = RCU_TASK_IPI_DELAY; | |
| 167 | −module_param(rcu_task_ipi_delay, int, 0644); | |
| 168 | − | |
| 169 | 164 | /* Control stall timeouts. Disable with <= 0, otherwise jiffies till stall. */ |
| 170 | 165 | #define RCU_TASK_BOOT_STALL_TIMEOUT (HZ * 30) |
| 171 | 166 | #define RCU_TASK_STALL_TIMEOUT (HZ * 60 * 10) |
| @@ -800,8 +795,6 @@ static void rcu_tasks_torture_stats_print_generic(struct rcu_tasks *rtp, char *t · 628 unmodified lines | ||
| 800 | 795 | |
| 801 | 796 | #endif // #ifndef CONFIG_TINY_RCU |
| 802 | 797 | |
| 803 | −static void exit_tasks_rcu_finish_trace(struct task_struct *t); | |
| 804 | − | |
| 805 | 798 | #if defined(CONFIG_TASKS_RCU) |
| 806 | 799 | |
| 807 | 800 | //////////////////////////////////////////////////////////////////////// |
| @@ -1321,13 +1314,11 @@ void exit_tasks_rcu_finish(void) · 513 unmodified lines | ||
| 1321 | 1314 | raw_spin_lock_irqsave_rcu_node(rtpcp, flags); |
| 1322 | 1315 | list_del_init(&t->rcu_tasks_exit_list); |
| 1323 | 1316 | raw_spin_unlock_irqrestore_rcu_node(rtpcp, flags); |
| 1324 | − | |
| 1325 | − exit_tasks_rcu_finish_trace(t); | |
| 1326 | 1317 | } |
| 1327 | 1318 | |
| 1328 | 1319 | #else /* #ifdef CONFIG_TASKS_RCU */ |
| 1329 | 1320 | void exit_tasks_rcu_start(void) { } |
| 1330 | −void exit_tasks_rcu_finish(void) { exit_tasks_rcu_finish_trace(current); } | |
| 1321 | +void exit_tasks_rcu_finish(void) { } | |
| 1331 | 1322 | #endif /* #else #ifdef CONFIG_TASKS_RCU */ |
| 1332 | 1323 | |
| 1333 | 1324 | #ifdef CONFIG_TASKS_RUDE_RCU |
| @@ -1475,69 +1466,6 @@ void __init rcu_tasks_trace_suppress_unused(void) · 141 unmodified lines | ||
| 1475 | 1466 | #endif // #ifndef CONFIG_TINY_RCU |
| 1476 | 1467 | } |
| 1477 | 1468 | |
| 1478 | −/* | |
| 1479 | − * Do a cmpxchg() on ->trc_reader_special.b.need_qs, allowing for | |
| 1480 | − * the four-byte operand-size restriction of some platforms. | |
| 1481 | − * | |
| 1482 | − * Returns the old value, which is often ignored. | |
| 1483 | − */ | |
| 1484 | −u8 rcu_trc_cmpxchg_need_qs(struct task_struct *t, u8 old, u8 new) | |
| 1485 | −{ | |
| 1486 | − return cmpxchg(&t->trc_reader_special.b.need_qs, old, new); | |
| 1487 | −} | |
| 1488 | −EXPORT_SYMBOL_GPL(rcu_trc_cmpxchg_need_qs); | |
| 1489 | − | |
| 1490 | −/* Add a newly blocked reader task to its CPU's list. */ | |
| 1491 | −void rcu_tasks_trace_qs_blkd(struct task_struct *t) | |
| 1492 | −{ | |
| 1493 | −} | |
| 1494 | −EXPORT_SYMBOL_GPL(rcu_tasks_trace_qs_blkd); | |
| 1495 | − | |
| 1496 | −/* Communicate task state back to the RCU tasks trace stall warning request. */ | |
| 1497 | −struct trc_stall_chk_rdr { | |
| 1498 | − int nesting; | |
| 1499 | − int ipi_to_cpu; | |
| 1500 | − u8 needqs; | |
| 1501 | −}; | |
| 1502 | − | |
| 1503 | −/* Report any needed quiescent state for this exiting task. */ | |
| 1504 | −static void exit_tasks_rcu_finish_trace(struct task_struct *t) | |
| 1505 | −{ | |
| 1506 | −} | |
| 1507 | − | |
| 1508 | −int rcu_tasks_trace_lazy_ms = -1; | |
| 1509 | −module_param(rcu_tasks_trace_lazy_ms, int, 0444); | |
| 1510 | − | |
| 1511 | −static int __init rcu_spawn_tasks_trace_kthread(void) | |
| 1512 | −{ | |
| 1513 | − return 0; | |
| 1514 | −} | |
| 1515 | − | |
| 1516 | −#if !defined(CONFIG_TINY_RCU) | |
| 1517 | −void show_rcu_tasks_trace_gp_kthread(void) | |
| 1518 | −{ | |
| 1519 | −} | |
| 1520 | −EXPORT_SYMBOL_GPL(show_rcu_tasks_trace_gp_kthread); | |
| 1521 | − | |
| 1522 | −void rcu_tasks_trace_torture_stats_print(char *tt, char *tf) | |
| 1523 | −{ | |
| 1524 | −} | |
| 1525 | −EXPORT_SYMBOL_GPL(rcu_tasks_trace_torture_stats_print); | |
| 1526 | −#endif // !defined(CONFIG_TINY_RCU) | |
| 1527 | − | |
| 1528 | −struct task_struct *get_rcu_tasks_trace_gp_kthread(void) | |
| 1529 | −{ | |
| 1530 | − return NULL; | |
| 1531 | −} | |
| 1532 | −EXPORT_SYMBOL_GPL(get_rcu_tasks_trace_gp_kthread); | |
| 1533 | − | |
| 1534 | −void rcu_tasks_trace_get_gp_data(int *flags, unsigned long *gp_seq) | |
| 1535 | −{ | |
| 1536 | −} | |
| 1537 | −EXPORT_SYMBOL_GPL(rcu_tasks_trace_get_gp_data); | |
| 1538 | − | |
| 1539 | −#else /* #ifdef CONFIG_TASKS_TRACE_RCU */ | |
| 1540 | −static void exit_tasks_rcu_finish_trace(struct task_struct *t) { } | |
| 1541 | 1469 | #endif /* #else #ifdef CONFIG_TASKS_TRACE_RCU */ |
| 1542 | 1470 | |
| 1543 | 1471 | #ifndef CONFIG_TINY_RCU |
| @@ -1545,7 +1473,6 @@ void show_rcu_tasks_gp_kthreads(void) · 1 unmodified line | ||
| 1545 | 1473 | { |
| 1546 | 1474 | show_rcu_tasks_classic_gp_kthread(); |
| 1547 | 1475 | show_rcu_tasks_rude_gp_kthread(); |
| 1548 | − show_rcu_tasks_trace_gp_kthread(); | |
| 1549 | 1476 | } |
| 1550 | 1477 | #endif /* #ifndef CONFIG_TINY_RCU */ |
| 1551 | 1478 | |
| @@ -1684,10 +1611,6 @@ static int __init rcu_init_tasks_generic(void) · 132 unmodified lines | ||
| 1684 | 1611 | rcu_spawn_tasks_rude_kthread(); |
| 1685 | 1612 | #endif |
| 1686 | 1613 | |
| 1687 | −#ifdef CONFIG_TASKS_TRACE_RCU | |
| 1688 | − rcu_spawn_tasks_trace_kthread(); | |
| 1689 | −#endif | |
| 1690 | − | |
| 1691 | 1614 | // Run the self-tests. |
| 1692 | 1615 | rcu_tasks_initiate_self_tests(); |
| 1693 | 1616 | |
| @@ -10,5 +10,4 @@ CONFIG_PROVE_LOCKING=n · 9 unmodified lines | ||
| 10 | 10 | #CHECK#CONFIG_PROVE_RCU=n |
| 11 | 11 | CONFIG_FORCE_TASKS_TRACE_RCU=y |
| 12 | 12 | #CHECK#CONFIG_TASKS_TRACE_RCU=y |
| 13 | −CONFIG_TASKS_TRACE_RCU_READ_MB=y | |
| 14 | 13 | CONFIG_RCU_EXPERT=y |
| @@ -9,6 +9,5 @@ CONFIG_PROVE_LOCKING=y · 8 unmodified lines | ||
| 9 | 9 | #CHECK#CONFIG_PROVE_RCU=y |
| 10 | 10 | CONFIG_FORCE_TASKS_TRACE_RCU=y |
| 11 | 11 | #CHECK#CONFIG_TASKS_TRACE_RCU=y |
| 12 | −CONFIG_TASKS_TRACE_RCU_READ_MB=n | |
| 13 | 12 | CONFIG_RCU_EXPERT=y |
| 14 | 13 | CONFIG_DEBUG_OBJECTS=y |