Lines Matching full:rtp
16 typedef void (*rcu_tasks_gp_func_t)(struct rcu_tasks *rtp);
21 typedef void (*postgp_func_t)(struct rcu_tasks *rtp);
225 static void set_tasks_gp_state(struct rcu_tasks *rtp, int newstate) in set_tasks_gp_state() argument
227 rtp->gp_state = newstate; in set_tasks_gp_state()
228 rtp->gp_jiffies = jiffies; in set_tasks_gp_state()
233 static const char *tasks_gp_state_getname(struct rcu_tasks *rtp) in tasks_gp_state_getname() argument
235 int i = data_race(rtp->gp_state); // Let KCSAN detect update races in tasks_gp_state_getname()
246 static void cblist_init_generic(struct rcu_tasks *rtp) in cblist_init_generic() argument
262 rtp->rtpcp_array = kzalloc_objs(struct rcu_tasks_percpu *, in cblist_init_generic()
264 BUG_ON(!rtp->rtpcp_array); in cblist_init_generic()
267 struct rcu_tasks_percpu *rtpcp = per_cpu_ptr(rtp->rtpcpu, cpu); in cblist_init_generic()
276 rtpcp->rtpp = rtp; in cblist_init_generic()
278 rtp->rtpcp_array[index] = rtpcp; in cblist_init_generic()
294 WRITE_ONCE(rtp->percpu_enqueue_shift, shift); in cblist_init_generic()
295 WRITE_ONCE(rtp->percpu_dequeue_lim, lim); in cblist_init_generic()
296 smp_store_release(&rtp->percpu_enqueue_lim, lim); in cblist_init_generic()
299 rtp->name, data_race(rtp->percpu_enqueue_shift), data_race(rtp->percpu_enqueue_lim), in cblist_init_generic()
304 static unsigned long rcu_tasks_lazy_time(struct rcu_tasks *rtp) in rcu_tasks_lazy_time() argument
306 return jiffies + rtp->lazy_jiffies; in rcu_tasks_lazy_time()
314 struct rcu_tasks *rtp; in call_rcu_tasks_generic_timer() local
318 rtp = rtpcp->rtpp; in call_rcu_tasks_generic_timer()
320 if (!rcu_segcblist_empty(&rtpcp->cblist) && rtp->lazy_jiffies) { in call_rcu_tasks_generic_timer()
324 mod_timer(&rtpcp->lazy_timer, rcu_tasks_lazy_time(rtp)); in call_rcu_tasks_generic_timer()
328 rcuwait_wake_up(&rtp->cbs_wait); in call_rcu_tasks_generic_timer()
334 struct rcu_tasks *rtp; in call_rcu_tasks_iw_wakeup() local
337 rtp = rtpcp->rtpp; in call_rcu_tasks_iw_wakeup()
338 rcuwait_wake_up(&rtp->cbs_wait); in call_rcu_tasks_iw_wakeup()
343 struct rcu_tasks *rtp) in call_rcu_tasks_generic() argument
347 bool havekthread = smp_load_acquire(&rtp->kthread_ptr); in call_rcu_tasks_generic()
358 ideal_cpu = smp_processor_id() >> READ_ONCE(rtp->percpu_enqueue_shift); in call_rcu_tasks_generic()
361 rtpcp = per_cpu_ptr(rtp->rtpcpu, chosen_cpu); in call_rcu_tasks_generic()
370 READ_ONCE(rtp->percpu_enqueue_lim) != rcu_task_cpu_ids) in call_rcu_tasks_generic()
379 if (rtp->lazy_jiffies) in call_rcu_tasks_generic()
380 mod_timer(&rtpcp->lazy_timer, rcu_tasks_lazy_time(rtp)); in call_rcu_tasks_generic()
389 raw_spin_lock_irqsave(&rtp->cbs_gbl_lock, flags); in call_rcu_tasks_generic()
390 if (rtp->percpu_enqueue_lim != rcu_task_cpu_ids) { in call_rcu_tasks_generic()
391 WRITE_ONCE(rtp->percpu_enqueue_shift, 0); in call_rcu_tasks_generic()
392 WRITE_ONCE(rtp->percpu_dequeue_lim, rcu_task_cpu_ids); in call_rcu_tasks_generic()
393 smp_store_release(&rtp->percpu_enqueue_lim, rcu_task_cpu_ids); in call_rcu_tasks_generic()
394 pr_info("Switching %s to per-CPU callback queuing.\n", rtp->name); in call_rcu_tasks_generic()
396 raw_spin_unlock_irqrestore(&rtp->cbs_gbl_lock, flags); in call_rcu_tasks_generic()
400 if (needwake && READ_ONCE(rtp->kthread_ptr)) in call_rcu_tasks_generic()
407 struct rcu_tasks *rtp; in rcu_barrier_tasks_generic_cb() local
412 rtp = rtpcp->rtpp; in rcu_barrier_tasks_generic_cb()
413 if (atomic_dec_and_test(&rtp->barrier_q_count)) in rcu_barrier_tasks_generic_cb()
414 complete(&rtp->barrier_q_completion); in rcu_barrier_tasks_generic_cb()
419 static void __maybe_unused rcu_barrier_tasks_generic(struct rcu_tasks *rtp) in rcu_barrier_tasks_generic() argument
424 unsigned long s = rcu_seq_snap(&rtp->barrier_q_seq); in rcu_barrier_tasks_generic()
426 mutex_lock(&rtp->barrier_q_mutex); in rcu_barrier_tasks_generic()
427 if (rcu_seq_done(&rtp->barrier_q_seq, s)) { in rcu_barrier_tasks_generic()
429 mutex_unlock(&rtp->barrier_q_mutex); in rcu_barrier_tasks_generic()
432 rtp->barrier_q_start = jiffies; in rcu_barrier_tasks_generic()
433 rcu_seq_start(&rtp->barrier_q_seq); in rcu_barrier_tasks_generic()
434 init_completion(&rtp->barrier_q_completion); in rcu_barrier_tasks_generic()
435 atomic_set(&rtp->barrier_q_count, 2); in rcu_barrier_tasks_generic()
437 if (cpu >= smp_load_acquire(&rtp->percpu_dequeue_lim)) in rcu_barrier_tasks_generic()
439 rtpcp = per_cpu_ptr(rtp->rtpcpu, cpu); in rcu_barrier_tasks_generic()
443 atomic_inc(&rtp->barrier_q_count); in rcu_barrier_tasks_generic()
446 if (atomic_sub_and_test(2, &rtp->barrier_q_count)) in rcu_barrier_tasks_generic()
447 complete(&rtp->barrier_q_completion); in rcu_barrier_tasks_generic()
448 wait_for_completion(&rtp->barrier_q_completion); in rcu_barrier_tasks_generic()
449 rcu_seq_end(&rtp->barrier_q_seq); in rcu_barrier_tasks_generic()
450 mutex_unlock(&rtp->barrier_q_mutex); in rcu_barrier_tasks_generic()
455 static int rcu_tasks_need_gpcb(struct rcu_tasks *rtp) in rcu_tasks_need_gpcb() argument
460 bool gpdone = poll_state_synchronize_rcu(rtp->percpu_dequeue_gpseq); in rcu_tasks_need_gpcb()
466 dequeue_limit = smp_load_acquire(&rtp->percpu_dequeue_lim); in rcu_tasks_need_gpcb()
470 struct rcu_tasks_percpu *rtpcp = per_cpu_ptr(rtp->rtpcpu, cpu); in rcu_tasks_need_gpcb()
483 rcu_segcblist_advance(&rtpcp->cblist, rcu_seq_current(&rtp->tasks_gp_seq)); in rcu_tasks_need_gpcb()
484 (void)rcu_segcblist_accelerate(&rtpcp->cblist, rcu_seq_snap(&rtp->tasks_gp_seq)); in rcu_tasks_need_gpcb()
486 if (rtp->lazy_jiffies) in rcu_tasks_need_gpcb()
505 raw_spin_lock_irqsave(&rtp->cbs_gbl_lock, flags); in rcu_tasks_need_gpcb()
506 if (rtp->percpu_enqueue_lim > 1) { in rcu_tasks_need_gpcb()
507 WRITE_ONCE(rtp->percpu_enqueue_shift, order_base_2(rcu_task_cpu_ids)); in rcu_tasks_need_gpcb()
508 smp_store_release(&rtp->percpu_enqueue_lim, 1); in rcu_tasks_need_gpcb()
509 rtp->percpu_dequeue_gpseq = get_state_synchronize_rcu(); in rcu_tasks_need_gpcb()
511 pr_info("Starting switch %s to CPU-0 callback queuing.\n", rtp->name); in rcu_tasks_need_gpcb()
513 raw_spin_unlock_irqrestore(&rtp->cbs_gbl_lock, flags); in rcu_tasks_need_gpcb()
516 raw_spin_lock_irqsave(&rtp->cbs_gbl_lock, flags); in rcu_tasks_need_gpcb()
517 if (rtp->percpu_enqueue_lim < rtp->percpu_dequeue_lim) { in rcu_tasks_need_gpcb()
518 WRITE_ONCE(rtp->percpu_dequeue_lim, 1); in rcu_tasks_need_gpcb()
519 pr_info("Completing switch %s to CPU-0 callback queuing.\n", rtp->name); in rcu_tasks_need_gpcb()
521 if (rtp->percpu_dequeue_lim == 1) { in rcu_tasks_need_gpcb()
522 for (cpu = rtp->percpu_dequeue_lim; cpu < rcu_task_cpu_ids; cpu++) { in rcu_tasks_need_gpcb()
525 struct rcu_tasks_percpu *rtpcp = per_cpu_ptr(rtp->rtpcpu, cpu); in rcu_tasks_need_gpcb()
530 raw_spin_unlock_irqrestore(&rtp->cbs_gbl_lock, flags); in rcu_tasks_need_gpcb()
537 static void rcu_tasks_invoke_cbs(struct rcu_tasks *rtp, struct rcu_tasks_percpu *rtpcp) in rcu_tasks_invoke_cbs() argument
549 rtpcp_next = rtp->rtpcp_array[index]; in rcu_tasks_invoke_cbs()
550 if (rtpcp_next->cpu < smp_load_acquire(&rtp->percpu_dequeue_lim)) { in rcu_tasks_invoke_cbs()
555 rtpcp_next = rtp->rtpcp_array[index]; in rcu_tasks_invoke_cbs()
556 if (rtpcp_next->cpu < smp_load_acquire(&rtp->percpu_dequeue_lim)) { in rcu_tasks_invoke_cbs()
567 rcu_segcblist_advance(&rtpcp->cblist, rcu_seq_current(&rtp->tasks_gp_seq)); in rcu_tasks_invoke_cbs()
580 (void)rcu_segcblist_accelerate(&rtpcp->cblist, rcu_seq_snap(&rtp->tasks_gp_seq)); in rcu_tasks_invoke_cbs()
587 struct rcu_tasks *rtp; in rcu_tasks_invoke_cbs_wq() local
590 rtp = rtpcp->rtpp; in rcu_tasks_invoke_cbs_wq()
591 rcu_tasks_invoke_cbs(rtp, rtpcp); in rcu_tasks_invoke_cbs_wq()
595 static void rcu_tasks_one_gp(struct rcu_tasks *rtp, bool midboot) in rcu_tasks_one_gp() argument
599 mutex_lock(&rtp->tasks_gp_mutex); in rcu_tasks_one_gp()
605 mutex_unlock(&rtp->tasks_gp_mutex); in rcu_tasks_one_gp()
606 set_tasks_gp_state(rtp, RTGS_WAIT_CBS); in rcu_tasks_one_gp()
607 rcuwait_wait_event(&rtp->cbs_wait, in rcu_tasks_one_gp()
608 (needgpcb = rcu_tasks_need_gpcb(rtp)), in rcu_tasks_one_gp()
610 mutex_lock(&rtp->tasks_gp_mutex); in rcu_tasks_one_gp()
615 set_tasks_gp_state(rtp, RTGS_WAIT_GP); in rcu_tasks_one_gp()
616 rtp->gp_start = jiffies; in rcu_tasks_one_gp()
617 rcu_seq_start(&rtp->tasks_gp_seq); in rcu_tasks_one_gp()
618 rtp->gp_func(rtp); in rcu_tasks_one_gp()
619 rcu_seq_end(&rtp->tasks_gp_seq); in rcu_tasks_one_gp()
623 set_tasks_gp_state(rtp, RTGS_INVOKE_CBS); in rcu_tasks_one_gp()
624 rcu_tasks_invoke_cbs(rtp, per_cpu_ptr(rtp->rtpcpu, 0)); in rcu_tasks_one_gp()
625 mutex_unlock(&rtp->tasks_gp_mutex); in rcu_tasks_one_gp()
632 struct rcu_tasks *rtp = arg; in rcu_tasks_kthread() local
635 struct rcu_tasks_percpu *rtpcp = per_cpu_ptr(rtp->rtpcpu, cpu); in rcu_tasks_kthread()
643 smp_store_release(&rtp->kthread_ptr, current); // Let GPs start! in rcu_tasks_kthread()
654 rcu_tasks_one_gp(rtp, false); in rcu_tasks_kthread()
657 schedule_timeout_idle(rtp->gp_sleep); in rcu_tasks_kthread()
662 static void synchronize_rcu_tasks_generic(struct rcu_tasks *rtp) in synchronize_rcu_tasks_generic() argument
666 "synchronize_%s() called too soon", rtp->name)) in synchronize_rcu_tasks_generic()
670 if (READ_ONCE(rtp->kthread_ptr)) { in synchronize_rcu_tasks_generic()
671 wait_rcu_gp_state(rtp->wait_state, rtp->call_func); in synchronize_rcu_tasks_generic()
674 rcu_tasks_one_gp(rtp, true); in synchronize_rcu_tasks_generic()
678 static void __init rcu_spawn_tasks_kthread_generic(struct rcu_tasks *rtp) in rcu_spawn_tasks_kthread_generic() argument
682 t = kthread_run(rcu_tasks_kthread, rtp, "%s_kthread", rtp->kname); in rcu_spawn_tasks_kthread_generic()
683 …%s: Could not start %s grace-period kthread, OOM is now expected behavior\n", __func__, rtp->name)) in rcu_spawn_tasks_kthread_generic()
718 static void show_rcu_tasks_generic_gp_kthread(struct rcu_tasks *rtp, char *s) in show_rcu_tasks_generic_gp_kthread() argument
726 struct rcu_tasks_percpu *rtpcp = per_cpu_ptr(rtp->rtpcpu, cpu); in show_rcu_tasks_generic_gp_kthread()
738 rtp->kname, in show_rcu_tasks_generic_gp_kthread()
739 tasks_gp_state_getname(rtp), data_race(rtp->gp_state), in show_rcu_tasks_generic_gp_kthread()
740 jiffies - data_race(rtp->gp_jiffies), in show_rcu_tasks_generic_gp_kthread()
741 data_race(rcu_seq_current(&rtp->tasks_gp_seq)), in show_rcu_tasks_generic_gp_kthread()
742 data_race(rtp->n_ipis_fails), data_race(rtp->n_ipis), in show_rcu_tasks_generic_gp_kthread()
743 ".k"[!!data_race(rtp->kthread_ptr)], in show_rcu_tasks_generic_gp_kthread()
747 rtp->lazy_jiffies, in show_rcu_tasks_generic_gp_kthread()
752 static void rcu_tasks_torture_stats_print_generic(struct rcu_tasks *rtp, char *tt, in rcu_tasks_torture_stats_print_generic() argument
761 tt, tf, tst, data_race(rtp->tasks_gp_seq), in rcu_tasks_torture_stats_print_generic()
762 j - data_race(rtp->gp_start), j - data_race(rtp->gp_jiffies), in rcu_tasks_torture_stats_print_generic()
763 data_race(rtp->gp_state), tasks_gp_state_getname(rtp)); in rcu_tasks_torture_stats_print_generic()
765 data_race(rtp->percpu_enqueue_shift), in rcu_tasks_torture_stats_print_generic()
766 data_race(rtp->percpu_enqueue_lim), in rcu_tasks_torture_stats_print_generic()
767 data_race(rtp->percpu_dequeue_lim), in rcu_tasks_torture_stats_print_generic()
768 data_race(rtp->percpu_dequeue_gpseq)); in rcu_tasks_torture_stats_print_generic()
773 struct rcu_tasks_percpu *rtpcp = per_cpu_ptr(rtp->rtpcpu, cpu); in rcu_tasks_torture_stats_print_generic()
788 data_race(rtp->barrier_q_seq), j - data_race(rtp->barrier_q_start), in rcu_tasks_torture_stats_print_generic()
789 atomic_read(&rtp->barrier_q_count)); in rcu_tasks_torture_stats_print_generic()
806 static void rcu_tasks_wait_gp(struct rcu_tasks *rtp) in rcu_tasks_wait_gp() argument
818 set_tasks_gp_state(rtp, RTGS_PRE_WAIT_GP); in rcu_tasks_wait_gp()
819 rtp->pregp_func(&holdouts); in rcu_tasks_wait_gp()
827 set_tasks_gp_state(rtp, RTGS_SCAN_TASKLIST); in rcu_tasks_wait_gp()
828 if (rtp->pertask_func) { in rcu_tasks_wait_gp()
831 rtp->pertask_func(t, &holdouts); in rcu_tasks_wait_gp()
835 set_tasks_gp_state(rtp, RTGS_POST_SCAN_TASKLIST); in rcu_tasks_wait_gp()
836 rtp->postscan_func(&holdouts); in rcu_tasks_wait_gp()
848 fract = rtp->init_fract; in rcu_tasks_wait_gp()
857 set_tasks_gp_state(rtp, RTGS_WAIT_SCAN_HOLDOUTS); in rcu_tasks_wait_gp()
877 set_tasks_gp_state(rtp, RTGS_SCAN_HOLDOUTS); in rcu_tasks_wait_gp()
878 rtp->holdouts_func(&holdouts, needreport, &firstreport); in rcu_tasks_wait_gp()
886 __func__, rtp->kname, rtp->tasks_gp_seq, j - rtp->gp_start); in rcu_tasks_wait_gp()
890 set_tasks_gp_state(rtp, RTGS_POST_GP); in rcu_tasks_wait_gp()
891 rtp->postgp_func(rtp); in rcu_tasks_wait_gp()
1131 static void rcu_tasks_postgp(struct rcu_tasks *rtp) in rcu_tasks_postgp() argument
1346 static void rcu_tasks_rude_wait_gp(struct rcu_tasks *rtp) in rcu_tasks_rude_wait_gp() argument
1348 rtp->n_ipis += cpumask_weight(cpu_online_mask); in rcu_tasks_rude_wait_gp()