Merge branches 'doc.2018.08.30a', 'dynticks.2018.08.30b', 'srcu.2018.08.30b' and 'torture.2018.08.29a' into HEAD
doc.2018.08.30a: Documentation updates dynticks.2018.08.30b: RCU flavor consolidation updates and cleanups srcu.2018.08.30b: SRCU updates torture.2018.08.29a: Torture-test updates
This commit is contained in:
@@ -203,11 +203,7 @@ void rcu_test_sync_prims(void)
|
||||
if (!IS_ENABLED(CONFIG_PROVE_RCU))
|
||||
return;
|
||||
synchronize_rcu();
|
||||
synchronize_rcu_bh();
|
||||
synchronize_sched();
|
||||
synchronize_rcu_expedited();
|
||||
synchronize_rcu_bh_expedited();
|
||||
synchronize_sched_expedited();
|
||||
}
|
||||
|
||||
#if !defined(CONFIG_TINY_RCU) || defined(CONFIG_SRCU)
|
||||
@@ -298,7 +294,7 @@ EXPORT_SYMBOL_GPL(rcu_read_lock_held);
|
||||
*
|
||||
* Check debug_lockdep_rcu_enabled() to prevent false positives during boot.
|
||||
*
|
||||
* Note that rcu_read_lock() is disallowed if the CPU is either idle or
|
||||
* Note that rcu_read_lock_bh() is disallowed if the CPU is either idle or
|
||||
* offline from an RCU perspective, so check for those as well.
|
||||
*/
|
||||
int rcu_read_lock_bh_held(void)
|
||||
@@ -336,7 +332,7 @@ void __wait_rcu_gp(bool checktiny, int n, call_rcu_func_t *crcu_array,
|
||||
int i;
|
||||
int j;
|
||||
|
||||
/* Initialize and register callbacks for each flavor specified. */
|
||||
/* Initialize and register callbacks for each crcu_array element. */
|
||||
for (i = 0; i < n; i++) {
|
||||
if (checktiny &&
|
||||
(crcu_array[i] == call_rcu ||
|
||||
@@ -472,6 +468,7 @@ int rcu_jiffies_till_stall_check(void)
|
||||
}
|
||||
return till_stall_check * HZ + RCU_STALL_DELAY_DELTA;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rcu_jiffies_till_stall_check);
|
||||
|
||||
void rcu_sysrq_start(void)
|
||||
{
|
||||
@@ -701,19 +698,19 @@ static int __noreturn rcu_tasks_kthread(void *arg)
|
||||
|
||||
/*
|
||||
* Wait for all pre-existing t->on_rq and t->nvcsw
|
||||
* transitions to complete. Invoking synchronize_sched()
|
||||
* transitions to complete. Invoking synchronize_rcu()
|
||||
* suffices because all these transitions occur with
|
||||
* interrupts disabled. Without this synchronize_sched(),
|
||||
* interrupts disabled. Without this synchronize_rcu(),
|
||||
* a read-side critical section that started before the
|
||||
* grace period might be incorrectly seen as having started
|
||||
* after the grace period.
|
||||
*
|
||||
* This synchronize_sched() also dispenses with the
|
||||
* This synchronize_rcu() also dispenses with the
|
||||
* need for a memory barrier on the first store to
|
||||
* ->rcu_tasks_holdout, as it forces the store to happen
|
||||
* after the beginning of the grace period.
|
||||
*/
|
||||
synchronize_sched();
|
||||
synchronize_rcu();
|
||||
|
||||
/*
|
||||
* There were callbacks, so we need to wait for an
|
||||
@@ -740,7 +737,7 @@ static int __noreturn rcu_tasks_kthread(void *arg)
|
||||
* This does only part of the job, ensuring that all
|
||||
* tasks that were previously exiting reach the point
|
||||
* where they have disabled preemption, allowing the
|
||||
* later synchronize_sched() to finish the job.
|
||||
* later synchronize_rcu() to finish the job.
|
||||
*/
|
||||
synchronize_srcu(&tasks_rcu_exit_srcu);
|
||||
|
||||
@@ -790,20 +787,20 @@ static int __noreturn rcu_tasks_kthread(void *arg)
|
||||
* cause their RCU-tasks read-side critical sections to
|
||||
* extend past the end of the grace period. However,
|
||||
* because these ->nvcsw updates are carried out with
|
||||
* interrupts disabled, we can use synchronize_sched()
|
||||
* interrupts disabled, we can use synchronize_rcu()
|
||||
* to force the needed ordering on all such CPUs.
|
||||
*
|
||||
* This synchronize_sched() also confines all
|
||||
* This synchronize_rcu() also confines all
|
||||
* ->rcu_tasks_holdout accesses to be within the grace
|
||||
* period, avoiding the need for memory barriers for
|
||||
* ->rcu_tasks_holdout accesses.
|
||||
*
|
||||
* In addition, this synchronize_sched() waits for exiting
|
||||
* In addition, this synchronize_rcu() waits for exiting
|
||||
* tasks to complete their final preempt_disable() region
|
||||
* of execution, cleaning up after the synchronize_srcu()
|
||||
* above.
|
||||
*/
|
||||
synchronize_sched();
|
||||
synchronize_rcu();
|
||||
|
||||
/* Invoke the callbacks. */
|
||||
while (list) {
|
||||
@@ -870,15 +867,10 @@ static void __init rcu_tasks_bootup_oddness(void)
|
||||
#ifdef CONFIG_PROVE_RCU
|
||||
|
||||
/*
|
||||
* Early boot self test parameters, one for each flavor
|
||||
* Early boot self test parameters.
|
||||
*/
|
||||
static bool rcu_self_test;
|
||||
static bool rcu_self_test_bh;
|
||||
static bool rcu_self_test_sched;
|
||||
|
||||
module_param(rcu_self_test, bool, 0444);
|
||||
module_param(rcu_self_test_bh, bool, 0444);
|
||||
module_param(rcu_self_test_sched, bool, 0444);
|
||||
|
||||
static int rcu_self_test_counter;
|
||||
|
||||
@@ -888,25 +880,16 @@ static void test_callback(struct rcu_head *r)
|
||||
pr_info("RCU test callback executed %d\n", rcu_self_test_counter);
|
||||
}
|
||||
|
||||
DEFINE_STATIC_SRCU(early_srcu);
|
||||
|
||||
static void early_boot_test_call_rcu(void)
|
||||
{
|
||||
static struct rcu_head head;
|
||||
static struct rcu_head shead;
|
||||
|
||||
call_rcu(&head, test_callback);
|
||||
}
|
||||
|
||||
static void early_boot_test_call_rcu_bh(void)
|
||||
{
|
||||
static struct rcu_head head;
|
||||
|
||||
call_rcu_bh(&head, test_callback);
|
||||
}
|
||||
|
||||
static void early_boot_test_call_rcu_sched(void)
|
||||
{
|
||||
static struct rcu_head head;
|
||||
|
||||
call_rcu_sched(&head, test_callback);
|
||||
if (IS_ENABLED(CONFIG_SRCU))
|
||||
call_srcu(&early_srcu, &shead, test_callback);
|
||||
}
|
||||
|
||||
void rcu_early_boot_tests(void)
|
||||
@@ -915,10 +898,6 @@ void rcu_early_boot_tests(void)
|
||||
|
||||
if (rcu_self_test)
|
||||
early_boot_test_call_rcu();
|
||||
if (rcu_self_test_bh)
|
||||
early_boot_test_call_rcu_bh();
|
||||
if (rcu_self_test_sched)
|
||||
early_boot_test_call_rcu_sched();
|
||||
rcu_test_sync_prims();
|
||||
}
|
||||
|
||||
@@ -930,16 +909,11 @@ static int rcu_verify_early_boot_tests(void)
|
||||
if (rcu_self_test) {
|
||||
early_boot_test_counter++;
|
||||
rcu_barrier();
|
||||
if (IS_ENABLED(CONFIG_SRCU)) {
|
||||
early_boot_test_counter++;
|
||||
srcu_barrier(&early_srcu);
|
||||
}
|
||||
}
|
||||
if (rcu_self_test_bh) {
|
||||
early_boot_test_counter++;
|
||||
rcu_barrier_bh();
|
||||
}
|
||||
if (rcu_self_test_sched) {
|
||||
early_boot_test_counter++;
|
||||
rcu_barrier_sched();
|
||||
}
|
||||
|
||||
if (rcu_self_test_counter != early_boot_test_counter) {
|
||||
WARN_ON(1);
|
||||
ret = -1;
|
||||
|
Reference in New Issue
Block a user