上一篇文章我们知道Tree RCU的命名是由于rcu_node分层分组的构成一个树的形状,在Tree RCU的实现中关键的数据类型不只struct rcu_node,还有rcu_state和rcu_data: struct rcu_state,全局变量,每种flavor(例如sched、bh)有一个 struct rcu_node,包含在rcu_state中,每种flavor有一个 struct rcu_data,rcu_state(per...
并继续为每个暂停当前 RCU 任务宽限期的任务输出 sched_show_task()。 解释RCU’s CPU Stall-Detector“Splats” 对于RCU 的非 RCU 任务风格,当一个 CPU 检测到某个其他 CPU 正在停止时,它将打印类似于以下内容的消息: INFO:rcu_scheddetected stalls on CPUs/tasks: 2-...: (3 GPs behind) idle=06c/0...
rcu_read_lock()原语可以看作是获取对p的引用,因为相应的优雅周期无法在配对的rcu_read_unlock()之前结束。这种引用计数机制是受限制的,因为我们不允许在RCU读端临界区中阻塞,也不允许将一个任务的RCU读端临界区传递给另一个任务。 不管上述的限制,下列代码可以安全地删除p: 1 spin_lock(&mylock); 2 p = ...
RCU_LOCKDEP_WARN(lock_is_held(&rcu_bh_lock_map) || lock_is_held(&rcu_lock_map) || lock_is_held(&rcu_sched_lock_map), "Illegal synchronize_sched() in RCU-sched read-side critical section"); if (rcu_blocking_is_gp()) return; if (rcu_gp_is_expedited()) synchronize_sched_expedit...
RCU中的宽限期 在RCU中,数据的删除和销毁需要一定的宽限期,主要是因为需要等待读线程的完成。如图所示: 我们再看看一个例子: structfoo{inta;charb;longc; }; DEFINE_SPINLOCK(foo_mutex);structfoo*gbl_foo;voidfoo_read(void){ foo *fp = gbl_foo;// 如果发生了进程切换if( fp !=NULL) ...
* 这里就是用来捕获该错误的 */schedule_debug(prev);if(sched_feat(HRTICK))hrtick_clear(rq);/* 关闭本地中断 */local_irq_disable();/* 更新全局状态, * 标识当前CPU发生上下文的切换 */rcu_note_context_switch();/* * Make sure that signal_pending_state()->signal_pending() below ...
rcu_sched_qs(cpu); prev = rq->curr;/* 当前的运行进程 */ switch_count = &prev->nivcsw;/* 进程切换计数 */ release_kernel_lock(prev); need_resched_nonpreemptible: schedule_debug(prev); if (sched_feat(HRTICK)) hrtick_clear(rq); ...
RCU_STALL_COMMON = y CONFIG_RCU_CPU_STALL_TIMEOUT = 10(手动设置10s) 系统会打印出如下信息: INFO: rcu_sched detected stalls onCPUs/tasks: RCU_GP_WAIT_FQS(3) ->state=0x0->cpu=0 因为就算不能调用schedule(),此时一直有时钟中断过来,系统利用中断来检测。
|--> rcu_sched_clock_irq(user_tick); |--> scheduler_tick(); //调度程序tick处理 |--> run_posix_cpu_timers(); //处理posix timer与 cpu 运行时间相关的事务|-->hrtimer_forward(timer, now, TICK_NSEC); //下次超期时间往前推TICK_NSEC5...
CPU通过检测QS状态。RCU中代表CPU状态的数据类型是rcu_data。在rcu_data定义中,有两个成员变量对QS检测至关重要。跟踪这些变量,我们能了解不同flavor的检测过程。定时检查在sched_timer中断中调用rcu_check_callbacks()函数,判断CPU是否在读临界区。对于调度和基本中断类型的RCU,若中断时刻CPU处于用户态...