diff options
Diffstat (limited to 'kernel/rcutree_plugin.h')
-rw-r--r-- | kernel/rcutree_plugin.h | 81 |
1 files changed, 53 insertions, 28 deletions
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index 3db5a375d8dd..63098a59216e 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h | |||
@@ -53,38 +53,37 @@ static char __initdata nocb_buf[NR_CPUS * 5]; | |||
53 | static void __init rcu_bootup_announce_oddness(void) | 53 | static void __init rcu_bootup_announce_oddness(void) |
54 | { | 54 | { |
55 | #ifdef CONFIG_RCU_TRACE | 55 | #ifdef CONFIG_RCU_TRACE |
56 | printk(KERN_INFO "\tRCU debugfs-based tracing is enabled.\n"); | 56 | pr_info("\tRCU debugfs-based tracing is enabled.\n"); |
57 | #endif | 57 | #endif |
58 | #if (defined(CONFIG_64BIT) && CONFIG_RCU_FANOUT != 64) || (!defined(CONFIG_64BIT) && CONFIG_RCU_FANOUT != 32) | 58 | #if (defined(CONFIG_64BIT) && CONFIG_RCU_FANOUT != 64) || (!defined(CONFIG_64BIT) && CONFIG_RCU_FANOUT != 32) |
59 | printk(KERN_INFO "\tCONFIG_RCU_FANOUT set to non-default value of %d\n", | 59 | pr_info("\tCONFIG_RCU_FANOUT set to non-default value of %d\n", |
60 | CONFIG_RCU_FANOUT); | 60 | CONFIG_RCU_FANOUT); |
61 | #endif | 61 | #endif |
62 | #ifdef CONFIG_RCU_FANOUT_EXACT | 62 | #ifdef CONFIG_RCU_FANOUT_EXACT |
63 | printk(KERN_INFO "\tHierarchical RCU autobalancing is disabled.\n"); | 63 | pr_info("\tHierarchical RCU autobalancing is disabled.\n"); |
64 | #endif | 64 | #endif |
65 | #ifdef CONFIG_RCU_FAST_NO_HZ | 65 | #ifdef CONFIG_RCU_FAST_NO_HZ |
66 | printk(KERN_INFO | 66 | pr_info("\tRCU dyntick-idle grace-period acceleration is enabled.\n"); |
67 | "\tRCU dyntick-idle grace-period acceleration is enabled.\n"); | ||
68 | #endif | 67 | #endif |
69 | #ifdef CONFIG_PROVE_RCU | 68 | #ifdef CONFIG_PROVE_RCU |
70 | printk(KERN_INFO "\tRCU lockdep checking is enabled.\n"); | 69 | pr_info("\tRCU lockdep checking is enabled.\n"); |
71 | #endif | 70 | #endif |
72 | #ifdef CONFIG_RCU_TORTURE_TEST_RUNNABLE | 71 | #ifdef CONFIG_RCU_TORTURE_TEST_RUNNABLE |
73 | printk(KERN_INFO "\tRCU torture testing starts during boot.\n"); | 72 | pr_info("\tRCU torture testing starts during boot.\n"); |
74 | #endif | 73 | #endif |
75 | #if defined(CONFIG_TREE_PREEMPT_RCU) && !defined(CONFIG_RCU_CPU_STALL_VERBOSE) | 74 | #if defined(CONFIG_TREE_PREEMPT_RCU) && !defined(CONFIG_RCU_CPU_STALL_VERBOSE) |
76 | printk(KERN_INFO "\tDump stacks of tasks blocking RCU-preempt GP.\n"); | 75 | pr_info("\tDump stacks of tasks blocking RCU-preempt GP.\n"); |
77 | #endif | 76 | #endif |
78 | #if defined(CONFIG_RCU_CPU_STALL_INFO) | 77 | #if defined(CONFIG_RCU_CPU_STALL_INFO) |
79 | printk(KERN_INFO "\tAdditional per-CPU info printed with stalls.\n"); | 78 | pr_info("\tAdditional per-CPU info printed with stalls.\n"); |
80 | #endif | 79 | #endif |
81 | #if NUM_RCU_LVL_4 != 0 | 80 | #if NUM_RCU_LVL_4 != 0 |
82 | printk(KERN_INFO "\tFour-level hierarchy is enabled.\n"); | 81 | pr_info("\tFour-level hierarchy is enabled.\n"); |
83 | #endif | 82 | #endif |
84 | if (rcu_fanout_leaf != CONFIG_RCU_FANOUT_LEAF) | 83 | if (rcu_fanout_leaf != CONFIG_RCU_FANOUT_LEAF) |
85 | printk(KERN_INFO "\tExperimental boot-time adjustment of leaf fanout to %d.\n", rcu_fanout_leaf); | 84 | pr_info("\tBoot-time adjustment of leaf fanout to %d.\n", rcu_fanout_leaf); |
86 | if (nr_cpu_ids != NR_CPUS) | 85 | if (nr_cpu_ids != NR_CPUS) |
87 | printk(KERN_INFO "\tRCU restricting CPUs from NR_CPUS=%d to nr_cpu_ids=%d.\n", NR_CPUS, nr_cpu_ids); | 86 | pr_info("\tRCU restricting CPUs from NR_CPUS=%d to nr_cpu_ids=%d.\n", NR_CPUS, nr_cpu_ids); |
88 | #ifdef CONFIG_RCU_NOCB_CPU | 87 | #ifdef CONFIG_RCU_NOCB_CPU |
89 | #ifndef CONFIG_RCU_NOCB_CPU_NONE | 88 | #ifndef CONFIG_RCU_NOCB_CPU_NONE |
90 | if (!have_rcu_nocb_mask) { | 89 | if (!have_rcu_nocb_mask) { |
@@ -92,19 +91,19 @@ static void __init rcu_bootup_announce_oddness(void) | |||
92 | have_rcu_nocb_mask = true; | 91 | have_rcu_nocb_mask = true; |
93 | } | 92 | } |
94 | #ifdef CONFIG_RCU_NOCB_CPU_ZERO | 93 | #ifdef CONFIG_RCU_NOCB_CPU_ZERO |
95 | pr_info("\tExperimental no-CBs CPU 0\n"); | 94 | pr_info("\tOffload RCU callbacks from CPU 0\n"); |
96 | cpumask_set_cpu(0, rcu_nocb_mask); | 95 | cpumask_set_cpu(0, rcu_nocb_mask); |
97 | #endif /* #ifdef CONFIG_RCU_NOCB_CPU_ZERO */ | 96 | #endif /* #ifdef CONFIG_RCU_NOCB_CPU_ZERO */ |
98 | #ifdef CONFIG_RCU_NOCB_CPU_ALL | 97 | #ifdef CONFIG_RCU_NOCB_CPU_ALL |
99 | pr_info("\tExperimental no-CBs for all CPUs\n"); | 98 | pr_info("\tOffload RCU callbacks from all CPUs\n"); |
100 | cpumask_setall(rcu_nocb_mask); | 99 | cpumask_setall(rcu_nocb_mask); |
101 | #endif /* #ifdef CONFIG_RCU_NOCB_CPU_ALL */ | 100 | #endif /* #ifdef CONFIG_RCU_NOCB_CPU_ALL */ |
102 | #endif /* #ifndef CONFIG_RCU_NOCB_CPU_NONE */ | 101 | #endif /* #ifndef CONFIG_RCU_NOCB_CPU_NONE */ |
103 | if (have_rcu_nocb_mask) { | 102 | if (have_rcu_nocb_mask) { |
104 | cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask); | 103 | cpulist_scnprintf(nocb_buf, sizeof(nocb_buf), rcu_nocb_mask); |
105 | pr_info("\tExperimental no-CBs CPUs: %s.\n", nocb_buf); | 104 | pr_info("\tOffload RCU callbacks from CPUs: %s.\n", nocb_buf); |
106 | if (rcu_nocb_poll) | 105 | if (rcu_nocb_poll) |
107 | pr_info("\tExperimental polled no-CBs CPUs.\n"); | 106 | pr_info("\tPoll for callbacks from no-CBs CPUs.\n"); |
108 | } | 107 | } |
109 | #endif /* #ifdef CONFIG_RCU_NOCB_CPU */ | 108 | #endif /* #ifdef CONFIG_RCU_NOCB_CPU */ |
110 | } | 109 | } |
@@ -123,7 +122,7 @@ static int rcu_preempted_readers_exp(struct rcu_node *rnp); | |||
123 | */ | 122 | */ |
124 | static void __init rcu_bootup_announce(void) | 123 | static void __init rcu_bootup_announce(void) |
125 | { | 124 | { |
126 | printk(KERN_INFO "Preemptible hierarchical RCU implementation.\n"); | 125 | pr_info("Preemptible hierarchical RCU implementation.\n"); |
127 | rcu_bootup_announce_oddness(); | 126 | rcu_bootup_announce_oddness(); |
128 | } | 127 | } |
129 | 128 | ||
@@ -490,13 +489,13 @@ static void rcu_print_detail_task_stall(struct rcu_state *rsp) | |||
490 | 489 | ||
491 | static void rcu_print_task_stall_begin(struct rcu_node *rnp) | 490 | static void rcu_print_task_stall_begin(struct rcu_node *rnp) |
492 | { | 491 | { |
493 | printk(KERN_ERR "\tTasks blocked on level-%d rcu_node (CPUs %d-%d):", | 492 | pr_err("\tTasks blocked on level-%d rcu_node (CPUs %d-%d):", |
494 | rnp->level, rnp->grplo, rnp->grphi); | 493 | rnp->level, rnp->grplo, rnp->grphi); |
495 | } | 494 | } |
496 | 495 | ||
497 | static void rcu_print_task_stall_end(void) | 496 | static void rcu_print_task_stall_end(void) |
498 | { | 497 | { |
499 | printk(KERN_CONT "\n"); | 498 | pr_cont("\n"); |
500 | } | 499 | } |
501 | 500 | ||
502 | #else /* #ifdef CONFIG_RCU_CPU_STALL_INFO */ | 501 | #else /* #ifdef CONFIG_RCU_CPU_STALL_INFO */ |
@@ -526,7 +525,7 @@ static int rcu_print_task_stall(struct rcu_node *rnp) | |||
526 | t = list_entry(rnp->gp_tasks, | 525 | t = list_entry(rnp->gp_tasks, |
527 | struct task_struct, rcu_node_entry); | 526 | struct task_struct, rcu_node_entry); |
528 | list_for_each_entry_continue(t, &rnp->blkd_tasks, rcu_node_entry) { | 527 | list_for_each_entry_continue(t, &rnp->blkd_tasks, rcu_node_entry) { |
529 | printk(KERN_CONT " P%d", t->pid); | 528 | pr_cont(" P%d", t->pid); |
530 | ndetected++; | 529 | ndetected++; |
531 | } | 530 | } |
532 | rcu_print_task_stall_end(); | 531 | rcu_print_task_stall_end(); |
@@ -933,6 +932,24 @@ static void __init __rcu_init_preempt(void) | |||
933 | rcu_init_one(&rcu_preempt_state, &rcu_preempt_data); | 932 | rcu_init_one(&rcu_preempt_state, &rcu_preempt_data); |
934 | } | 933 | } |
935 | 934 | ||
935 | /* | ||
936 | * Check for a task exiting while in a preemptible-RCU read-side | ||
937 | * critical section, clean up if so. No need to issue warnings, | ||
938 | * as debug_check_no_locks_held() already does this if lockdep | ||
939 | * is enabled. | ||
940 | */ | ||
941 | void exit_rcu(void) | ||
942 | { | ||
943 | struct task_struct *t = current; | ||
944 | |||
945 | if (likely(list_empty(¤t->rcu_node_entry))) | ||
946 | return; | ||
947 | t->rcu_read_lock_nesting = 1; | ||
948 | barrier(); | ||
949 | t->rcu_read_unlock_special = RCU_READ_UNLOCK_BLOCKED; | ||
950 | __rcu_read_unlock(); | ||
951 | } | ||
952 | |||
936 | #else /* #ifdef CONFIG_TREE_PREEMPT_RCU */ | 953 | #else /* #ifdef CONFIG_TREE_PREEMPT_RCU */ |
937 | 954 | ||
938 | static struct rcu_state *rcu_state = &rcu_sched_state; | 955 | static struct rcu_state *rcu_state = &rcu_sched_state; |
@@ -942,7 +959,7 @@ static struct rcu_state *rcu_state = &rcu_sched_state; | |||
942 | */ | 959 | */ |
943 | static void __init rcu_bootup_announce(void) | 960 | static void __init rcu_bootup_announce(void) |
944 | { | 961 | { |
945 | printk(KERN_INFO "Hierarchical RCU implementation.\n"); | 962 | pr_info("Hierarchical RCU implementation.\n"); |
946 | rcu_bootup_announce_oddness(); | 963 | rcu_bootup_announce_oddness(); |
947 | } | 964 | } |
948 | 965 | ||
@@ -1101,6 +1118,14 @@ static void __init __rcu_init_preempt(void) | |||
1101 | { | 1118 | { |
1102 | } | 1119 | } |
1103 | 1120 | ||
1121 | /* | ||
1122 | * Because preemptible RCU does not exist, tasks cannot possibly exit | ||
1123 | * while in preemptible RCU read-side critical sections. | ||
1124 | */ | ||
1125 | void exit_rcu(void) | ||
1126 | { | ||
1127 | } | ||
1128 | |||
1104 | #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */ | 1129 | #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */ |
1105 | 1130 | ||
1106 | #ifdef CONFIG_RCU_BOOST | 1131 | #ifdef CONFIG_RCU_BOOST |
@@ -1629,7 +1654,7 @@ static bool rcu_try_advance_all_cbs(void) | |||
1629 | */ | 1654 | */ |
1630 | if (rdp->completed != rnp->completed && | 1655 | if (rdp->completed != rnp->completed && |
1631 | rdp->nxttail[RCU_DONE_TAIL] != rdp->nxttail[RCU_NEXT_TAIL]) | 1656 | rdp->nxttail[RCU_DONE_TAIL] != rdp->nxttail[RCU_NEXT_TAIL]) |
1632 | rcu_process_gp_end(rsp, rdp); | 1657 | note_gp_changes(rsp, rdp); |
1633 | 1658 | ||
1634 | if (cpu_has_callbacks_ready_to_invoke(rdp)) | 1659 | if (cpu_has_callbacks_ready_to_invoke(rdp)) |
1635 | cbs_ready = true; | 1660 | cbs_ready = true; |
@@ -1883,7 +1908,7 @@ static void print_cpu_stall_fast_no_hz(char *cp, int cpu) | |||
1883 | /* Initiate the stall-info list. */ | 1908 | /* Initiate the stall-info list. */ |
1884 | static void print_cpu_stall_info_begin(void) | 1909 | static void print_cpu_stall_info_begin(void) |
1885 | { | 1910 | { |
1886 | printk(KERN_CONT "\n"); | 1911 | pr_cont("\n"); |
1887 | } | 1912 | } |
1888 | 1913 | ||
1889 | /* | 1914 | /* |
@@ -1914,7 +1939,7 @@ static void print_cpu_stall_info(struct rcu_state *rsp, int cpu) | |||
1914 | ticks_value = rsp->gpnum - rdp->gpnum; | 1939 | ticks_value = rsp->gpnum - rdp->gpnum; |
1915 | } | 1940 | } |
1916 | print_cpu_stall_fast_no_hz(fast_no_hz, cpu); | 1941 | print_cpu_stall_fast_no_hz(fast_no_hz, cpu); |
1917 | printk(KERN_ERR "\t%d: (%lu %s) idle=%03x/%llx/%d softirq=%u/%u %s\n", | 1942 | pr_err("\t%d: (%lu %s) idle=%03x/%llx/%d softirq=%u/%u %s\n", |
1918 | cpu, ticks_value, ticks_title, | 1943 | cpu, ticks_value, ticks_title, |
1919 | atomic_read(&rdtp->dynticks) & 0xfff, | 1944 | atomic_read(&rdtp->dynticks) & 0xfff, |
1920 | rdtp->dynticks_nesting, rdtp->dynticks_nmi_nesting, | 1945 | rdtp->dynticks_nesting, rdtp->dynticks_nmi_nesting, |
@@ -1925,7 +1950,7 @@ static void print_cpu_stall_info(struct rcu_state *rsp, int cpu) | |||
1925 | /* Terminate the stall-info list. */ | 1950 | /* Terminate the stall-info list. */ |
1926 | static void print_cpu_stall_info_end(void) | 1951 | static void print_cpu_stall_info_end(void) |
1927 | { | 1952 | { |
1928 | printk(KERN_ERR "\t"); | 1953 | pr_err("\t"); |
1929 | } | 1954 | } |
1930 | 1955 | ||
1931 | /* Zero ->ticks_this_gp for all flavors of RCU. */ | 1956 | /* Zero ->ticks_this_gp for all flavors of RCU. */ |
@@ -1948,17 +1973,17 @@ static void increment_cpu_stall_ticks(void) | |||
1948 | 1973 | ||
1949 | static void print_cpu_stall_info_begin(void) | 1974 | static void print_cpu_stall_info_begin(void) |
1950 | { | 1975 | { |
1951 | printk(KERN_CONT " {"); | 1976 | pr_cont(" {"); |
1952 | } | 1977 | } |
1953 | 1978 | ||
1954 | static void print_cpu_stall_info(struct rcu_state *rsp, int cpu) | 1979 | static void print_cpu_stall_info(struct rcu_state *rsp, int cpu) |
1955 | { | 1980 | { |
1956 | printk(KERN_CONT " %d", cpu); | 1981 | pr_cont(" %d", cpu); |
1957 | } | 1982 | } |
1958 | 1983 | ||
1959 | static void print_cpu_stall_info_end(void) | 1984 | static void print_cpu_stall_info_end(void) |
1960 | { | 1985 | { |
1961 | printk(KERN_CONT "} "); | 1986 | pr_cont("} "); |
1962 | } | 1987 | } |
1963 | 1988 | ||
1964 | static void zero_cpu_stall_ticks(struct rcu_data *rdp) | 1989 | static void zero_cpu_stall_ticks(struct rcu_data *rdp) |