1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33#ifndef __LINUX_RCU_NODE_TREE_H
34#define __LINUX_RCU_NODE_TREE_H
35
36
37
38
39
40
41
42
43
44#ifdef CONFIG_RCU_FANOUT
45#define RCU_FANOUT CONFIG_RCU_FANOUT
46#else
47# ifdef CONFIG_64BIT
48# define RCU_FANOUT 64
49# else
50# define RCU_FANOUT 32
51# endif
52#endif
53
54#ifdef CONFIG_RCU_FANOUT_LEAF
55#define RCU_FANOUT_LEAF CONFIG_RCU_FANOUT_LEAF
56#else
57#define RCU_FANOUT_LEAF 16
58#endif
59
60#define RCU_FANOUT_1 (RCU_FANOUT_LEAF)
61#define RCU_FANOUT_2 (RCU_FANOUT_1 * RCU_FANOUT)
62#define RCU_FANOUT_3 (RCU_FANOUT_2 * RCU_FANOUT)
63#define RCU_FANOUT_4 (RCU_FANOUT_3 * RCU_FANOUT)
64
65#if NR_CPUS <= RCU_FANOUT_1
66# define RCU_NUM_LVLS 1
67# define NUM_RCU_LVL_0 1
68# define NUM_RCU_NODES NUM_RCU_LVL_0
69# define NUM_RCU_LVL_INIT { NUM_RCU_LVL_0 }
70# define RCU_NODE_NAME_INIT { "rcu_node_0" }
71# define RCU_FQS_NAME_INIT { "rcu_node_fqs_0" }
72#elif NR_CPUS <= RCU_FANOUT_2
73# define RCU_NUM_LVLS 2
74# define NUM_RCU_LVL_0 1
75# define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_1)
76# define NUM_RCU_NODES (NUM_RCU_LVL_0 + NUM_RCU_LVL_1)
77# define NUM_RCU_LVL_INIT { NUM_RCU_LVL_0, NUM_RCU_LVL_1 }
78# define RCU_NODE_NAME_INIT { "rcu_node_0", "rcu_node_1" }
79# define RCU_FQS_NAME_INIT { "rcu_node_fqs_0", "rcu_node_fqs_1" }
80#elif NR_CPUS <= RCU_FANOUT_3
81# define RCU_NUM_LVLS 3
82# define NUM_RCU_LVL_0 1
83# define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_2)
84# define NUM_RCU_LVL_2 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_1)
85# define NUM_RCU_NODES (NUM_RCU_LVL_0 + NUM_RCU_LVL_1 + NUM_RCU_LVL_2)
86# define NUM_RCU_LVL_INIT { NUM_RCU_LVL_0, NUM_RCU_LVL_1, NUM_RCU_LVL_2 }
87# define RCU_NODE_NAME_INIT { "rcu_node_0", "rcu_node_1", "rcu_node_2" }
88# define RCU_FQS_NAME_INIT { "rcu_node_fqs_0", "rcu_node_fqs_1", "rcu_node_fqs_2" }
89#elif NR_CPUS <= RCU_FANOUT_4
90# define RCU_NUM_LVLS 4
91# define NUM_RCU_LVL_0 1
92# define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_3)
93# define NUM_RCU_LVL_2 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_2)
94# define NUM_RCU_LVL_3 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_1)
95# define NUM_RCU_NODES (NUM_RCU_LVL_0 + NUM_RCU_LVL_1 + NUM_RCU_LVL_2 + NUM_RCU_LVL_3)
96# define NUM_RCU_LVL_INIT { NUM_RCU_LVL_0, NUM_RCU_LVL_1, NUM_RCU_LVL_2, NUM_RCU_LVL_3 }
97# define RCU_NODE_NAME_INIT { "rcu_node_0", "rcu_node_1", "rcu_node_2", "rcu_node_3" }
98# define RCU_FQS_NAME_INIT { "rcu_node_fqs_0", "rcu_node_fqs_1", "rcu_node_fqs_2", "rcu_node_fqs_3" }
99#else
100# error "CONFIG_RCU_FANOUT insufficient for NR_CPUS"
101#endif
102
103#endif
104