-
Notifications
You must be signed in to change notification settings - Fork 4
/
linux-2.6.32-754.23.1.patch
303 lines (278 loc) · 12.1 KB
/
linux-2.6.32-754.23.1.patch
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
From 801a559891d5161f75df48d2cada5d129ef6a2aa Mon Sep 17 00:00:00 2001
From: Dongli Zhang <[email protected]>
Date: Fri, 10 Apr 2020 09:25:10 -0700
Subject: [PATCH 1/1] linux-2.6.32-754.23.1
linux-2.6.32-754.23.1
Signed-off-by: Dongli Zhang <[email protected]>
---
arch/x86/xen/time.c | 176 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 176 insertions(+)
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
index 6d38f697..471d810f 100644
--- a/arch/x86/xen/time.c
+++ b/arch/x86/xen/time.c
@@ -39,6 +39,11 @@ static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate);
static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate_snapshot);
/* unused ns of stolen time */
+/*
+ * 在以下使用xen_residual_stolen:
+ * - arch/x86/xen/time.c|136| <<do_stolen_accounting>> stolen = runnable + offline + __get_cpu_var(xen_residual_stolen);
+ * - arch/x86/xen/time.c|142| <<do_stolen_accounting>> __get_cpu_var(xen_residual_stolen) = stolen;
+ */
static DEFINE_PER_CPU(u64, xen_residual_stolen);
/* return an consistent snapshot of 64-bit time/counter value */
@@ -101,6 +106,15 @@ bool xen_vcpu_stolen(int vcpu)
return per_cpu(xen_runstate, vcpu).state == RUNSTATE_runnable;
}
+/*
+ * called by:
+ * - arch/x86/xen/enlighten.c|192| <<xen_vcpu_restore>> xen_setup_runstate_info(cpu);
+ * - arch/x86/xen/enlighten.c|1293| <<xen_start_kernel>> xen_setup_runstate_info(0);
+ * - arch/x86/xen/smp.c|311| <<xen_cpu_up>> xen_setup_runstate_info(cpu);
+ * - arch/x86/xen/suspend.c|37| <<xen_hvm_post_suspend>> xen_setup_runstate_info(cpu);
+ * - arch/x86/xen/time.c|482| <<xen_time_init>> xen_setup_runstate_info(cpu);
+ * - arch/x86/xen/time.c|503| <<xen_hvm_setup_cpu_clockevents>> xen_setup_runstate_info(cpu);
+ */
void xen_setup_runstate_info(int cpu)
{
struct vcpu_register_runstate_memory_area area;
@@ -337,6 +351,11 @@ static int xen_vcpuop_set_next_event(unsigned long delta,
return ret;
}
+/*
+ * 在以下使用xen_vcpuop_clockevent:
+ * - arch/x86/xen/time.c|430| <<xen_timer_resume>> if (xen_clockevent != &xen_vcpuop_clockevent)
+ * - arch/x86/xen/time.c|454| <<xen_time_init>> xen_clockevent = &xen_vcpuop_clockevent;
+ */
static const struct clock_event_device xen_vcpuop_clockevent = {
.name = "xen",
.features = CLOCK_EVT_FEAT_ONESHOT,
@@ -352,6 +371,14 @@ static const struct clock_event_device xen_vcpuop_clockevent = {
.set_next_event = xen_vcpuop_set_next_event,
};
+/*
+ * 在以下使用xen_clockevent:
+ * - arch/x86/xen/time.c|410| <<xen_setup_timer>> memcpy(evt, xen_clockevent, sizeof(*evt)); ---> 其实只在这里被每个percpu应用
+ * - arch/x86/xen/time.c|430| <<xen_timer_resume>> if (xen_clockevent != &xen_vcpuop_clockevent)
+ * - arch/x86/xen/time.c|454| <<xen_time_init>> xen_clockevent = &xen_vcpuop_clockevent;
+ *
+ * 在xen_time_init()中被置换为xen_vcpuop_clockevent
+ */
static const struct clock_event_device *xen_clockevent =
&xen_timerop_clockevent;
@@ -359,6 +386,13 @@ struct xen_clock_event_device {
struct clock_event_device evt;
char name[16];
};
+/*
+ * 在以下使用xen_clock_events:
+ * - arch/x86/xen/time.c|393| <<xen_timer_interrupt>> struct clock_event_device *evt = &__get_cpu_var(xen_clock_events).evt;
+ * - arch/x86/xen/time.c|411| <<xen_teardown_timer>> evt = &per_cpu(xen_clock_events, cpu).evt;
+ * - arch/x86/xen/time.c|427| <<xen_setup_timer>> struct xen_clock_event_device *xevt = &per_cpu(xen_clock_events, cpu);
+ * - arch/x86/xen/time.c|454| <<xen_setup_cpu_clockevents>> clockevents_register_device(&__get_cpu_var(xen_clock_events).evt);
+ */
static DEFINE_PER_CPU(struct xen_clock_event_device, xen_clock_events) = { .evt.irq = -1 };
static irqreturn_t xen_timer_interrupt(int irq, void *dev_id)
@@ -389,8 +423,24 @@ void xen_teardown_timer(int cpu)
}
}
+/*
+ * called by:
+ * - arch/x86/xen/enlighten.c|1399| <<xen_hvm_cpu_notify>> xen_setup_timer(cpu);
+ * - arch/x86/xen/smp.c|312| <<xen_cpu_up>> xen_setup_timer(cpu);
+ * - arch/x86/xen/time.c|477| <<xen_time_init>> xen_setup_timer(cpu);
+ *
+ * 除了申请VIRQ_TIMER到xen_timer_interrupt()
+ * 根据拷贝的xen_clockevent简单初始化percpu的&per_cpu(xen_clock_events, cpu)
+ */
void xen_setup_timer(int cpu)
{
+ /*
+ * 在以下使用xen_clock_events:
+ * - arch/x86/xen/time.c|393| <<xen_timer_interrupt>> struct clock_event_device *evt = &__get_cpu_var(xen_clock_events).evt;
+ * - arch/x86/xen/time.c|411| <<xen_teardown_timer>> evt = &per_cpu(xen_clock_events, cpu).evt;
+ * - arch/x86/xen/time.c|427| <<xen_setup_timer>> struct xen_clock_event_device *xevt = &per_cpu(xen_clock_events, cpu);
+ * - arch/x86/xen/time.c|454| <<xen_setup_cpu_clockevents>> clockevents_register_device(&__get_cpu_var(xen_clock_events).evt);
+ */
struct xen_clock_event_device *xevt = &per_cpu(xen_clock_events, cpu);
struct clock_event_device *evt = &xevt->evt;
int irq;
@@ -407,6 +457,63 @@ void xen_setup_timer(int cpu)
IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING|IRQF_TIMER,
xevt->name, NULL);
+ /*
+ * struct xen_clock_event_device {
+ * evt = {
+ * name = 0xffffffff817b686d "xen",
+ * features = 2,
+ * max_delta_ns = 4294967295,
+ * min_delta_ns = 337500,
+ * mult = 1,
+ * shift = 0,
+ * rating = 500,
+ * irq = 1839,
+ * cpumask = 0xffffffff8160e9c0 <cpu_bit_bitmap+512>,
+ * set_next_event = 0xffffffff81007e30 <xen_vcpuop_set_next_event>,
+ * set_mode = 0xffffffff81007a00 <xen_vcpuop_set_mode>,
+ * event_handler = 0xffffffff810afc30 <hrtimer_interrupt>,
+ * broadcast = 0x0,
+ * list = {
+ * next = 0xffffffff81ab90e0 <clockevent_devices>,
+ * prev = 0xffffffff81a9a460 <pit_ce+96>
+ * },
+ * mode = CLOCK_EVT_MODE_ONESHOT,
+ * next_event = {
+ * tv64 = 595753849715438
+ * },
+ * retries = 58435
+ * },
+ * name = "timer0\000\000\000\000\000\000\000\000\000"
+ * }
+ *
+ * struct xen_clock_event_device {
+ * evt = {
+ * name = 0xffffffff817b686d "xen",
+ * features = 2,
+ * max_delta_ns = 4294967295,
+ * min_delta_ns = 100000,
+ * mult = 1,
+ * shift = 0,
+ * rating = 500,
+ * irq = 1834,
+ * cpumask = 0xffffffff8160ebc0 <cpu_bit_bitmap+1024>,
+ * set_next_event = 0xffffffff81007e30 <xen_vcpuop_set_next_event>,
+ * set_mode = 0xffffffff81007a00 <xen_vcpuop_set_mode>,
+ * event_handler = 0xffffffff810afc30 <hrtimer_interrupt>,
+ * broadcast = 0x0,
+ * list = {
+ * next = 0xffffffff81a9a460 <pit_ce+96>,
+ * prev = 0xffff88008188f600
+ * },
+ * mode = CLOCK_EVT_MODE_ONESHOT,
+ * next_event = {
+ * tv64 = 595753850003906
+ * },
+ * retries = 24322
+ * },
+ * name = "timer1\000\000\000\000\000\000\000\000\000"
+ * }
+ */
memcpy(evt, xen_clockevent, sizeof(*evt));
evt->cpumask = cpumask_of(cpu);
@@ -414,10 +521,27 @@ void xen_setup_timer(int cpu)
}
+/*
+ * called by:
+ * - arch/x86/xen/smp.c|76| <<cpu_bringup>> xen_setup_cpu_clockevents();
+ * - arch/x86/xen/time.c|604| <<xen_time_init>> xen_setup_cpu_clockevents();
+ * - arch/x86/xen/time.c|642| <<xen_hvm_setup_cpu_clockevents>> xen_setup_cpu_clockevents();
+ *
+ * 用clockevents_register_device()注册percpu的&__get_cpu_var(xen_clock_events).evt
+ */
void xen_setup_cpu_clockevents(void)
{
BUG_ON(preemptible());
+ /*
+ * 在以下使用xen_clock_events:
+ * - arch/x86/xen/time.c|393| <<xen_timer_interrupt>> struct clock_event_device *evt = &__get_cpu_var(xen_clock_events).evt;
+ * - arch/x86/xen/time.c|411| <<xen_teardown_timer>> evt = &per_cpu(xen_clock_events, cpu).evt;
+ * - arch/x86/xen/time.c|427| <<xen_setup_timer>> struct xen_clock_event_device *xevt = &per_cpu(xen_clock_events, cpu);
+ * - arch/x86/xen/time.c|454| <<xen_setup_cpu_clockevents>> clockevents_register_device(&__get_cpu_var(xen_clock_events).evt);
+ *
+ * 每个cpu都注册一遍
+ */
clockevents_register_device(&__get_cpu_var(xen_clock_events).evt);
}
@@ -450,7 +574,16 @@ static void __init xen_time_init(void)
if (HYPERVISOR_vcpu_op(VCPUOP_stop_periodic_timer, cpu, NULL) == 0) {
/* Successfully turned off 100Hz tick, so we have the
vcpuop-based timer interface */
+ /*
+ * vmcore里这一行打印一次"Xen: using vcpuop timer interface"
+ */
printk(KERN_DEBUG "Xen: using vcpuop timer interface\n");
+ /*
+ * 在以下使用xen_clockevent:
+ * - arch/x86/xen/time.c|410| <<xen_setup_timer>> memcpy(evt, xen_clockevent, sizeof(*evt));
+ * - arch/x86/xen/time.c|430| <<xen_timer_resume>> if (xen_clockevent != &xen_vcpuop_clockevent)
+ * - arch/x86/xen/time.c|454| <<xen_time_init>> xen_clockevent = &xen_vcpuop_clockevent;
+ */
xen_clockevent = &xen_vcpuop_clockevent;
}
@@ -458,13 +591,28 @@ static void __init xen_time_init(void)
xen_read_wallclock(&tp);
do_settimeofday(&tp);
+ /*
+ * 设置c->x86_capability的tsc标志
+ */
setup_force_cpu_cap(X86_FEATURE_TSC);
+ /* 使用VCPUOP_register_runstate_memory_area注册runstate内存 */
xen_setup_runstate_info(cpu);
+ /*
+ * 除了申请VIRQ_TIMER到xen_timer_interrupt()
+ * 根据拷贝的xen_clockevent简单初始化percpu的&per_cpu(xen_clock_events, cpu)
+ */
xen_setup_timer(cpu);
+ /*
+ * 用clockevents_register_device()注册percpu的&__get_cpu_var(xen_clock_events).evt
+ */
xen_setup_cpu_clockevents();
}
+/*
+ * called by:
+ * - arch/x86/xen/enlighten.c|1170| <<xen_start_kernel>> xen_init_time_ops();
+ */
void __init xen_init_time_ops(void)
{
pv_time_ops = xen_time_ops;
@@ -481,15 +629,31 @@ void __init xen_init_time_ops(void)
static void xen_hvm_setup_cpu_clockevents(void)
{
int cpu = smp_processor_id();
+ /*
+ * called by:
+ * - arch/x86/xen/enlighten.c|192| <<xen_vcpu_restore>> xen_setup_runstate_info(cpu);
+ * - arch/x86/xen/enlighten.c|1293| <<xen_start_kernel>> xen_setup_runstate_info(0);
+ * - arch/x86/xen/smp.c|311| <<xen_cpu_up>> xen_setup_runstate_info(cpu);
+ * - arch/x86/xen/suspend.c|37| <<xen_hvm_post_suspend>> xen_setup_runstate_info(cpu);
+ * - arch/x86/xen/time.c|482| <<xen_time_init>> xen_setup_runstate_info(cpu);
+ * - arch/x86/xen/time.c|503| <<xen_hvm_setup_cpu_clockevents>> xen_setup_runstate_info(cpu);
+ */
xen_setup_runstate_info(cpu);
/*
* xen_setup_timer(cpu) - snprintf is bad in atomic context. Hence
* doing it xen_hvm_cpu_notify (which gets called by smp_init during
* early bootup and also during CPU hotplug events).
*/
+ /*
+ * 用clockevents_register_device()注册percpu的&__get_cpu_var(xen_clock_events).evt
+ */
xen_setup_cpu_clockevents();
}
+/*
+ * called by:
+ * - arch/x86/xen/enlighten.c|1440| <<xen_hvm_guest_init>> xen_hvm_init_time_ops();
+ */
void __init xen_hvm_init_time_ops(void)
{
/* vector callback is needed otherwise we cannot receive interrupts
@@ -504,7 +668,19 @@ void __init xen_hvm_init_time_ops(void)
}
pv_time_ops = xen_time_ops;
+ /*
+ * 在以下调用setup_percpu_clockev():
+ * - arch/x86/kernel/apic/apic.c|1839| <<APIC_init_uniprocessor>> x86_init.timers.setup_percpu_clockev();
+ * - arch/x86/kernel/smpboot.c|386| <<start_secondary>> x86_cpuinit.setup_percpu_clockev();
+ * - arch/x86/kernel/smpboot.c|1221| <<native_smp_prepare_cpus>> x86_init.timers.setup_percpu_clockev();
+ */
x86_init.timers.setup_percpu_clockev = xen_time_init;
+ /*
+ * 在以下调用xen_hvm_setup_cpu_clockevents():
+ * - arch/x86/kernel/apic/apic.c|1839| <<APIC_init_uniprocessor>> x86_init.timers.setup_percpu_clockev();
+ * - arch/x86/kernel/smpboot.c|386| <<start_secondary>> x86_cpuinit.setup_percpu_clockev();
+ * - arch/x86/kernel/smpboot.c|1221| <<native_smp_prepare_cpus>> x86_init.timers.setup_percpu_clockev();
+ */
x86_cpuinit.setup_percpu_clockev = xen_hvm_setup_cpu_clockevents;
x86_platform.calibrate_tsc = xen_tsc_khz;
--
2.17.1