diff options
Diffstat (limited to 'arch/x86/kernel/paravirt_32.c')
-rw-r--r-- | arch/x86/kernel/paravirt_32.c | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/arch/x86/kernel/paravirt_32.c b/arch/x86/kernel/paravirt_32.c index fa412515af7..6a80d67c212 100644 --- a/arch/x86/kernel/paravirt_32.c +++ b/arch/x86/kernel/paravirt_32.c | |||
@@ -164,7 +164,6 @@ static void *get_call_destination(u8 type) | |||
164 | { | 164 | { |
165 | struct paravirt_patch_template tmpl = { | 165 | struct paravirt_patch_template tmpl = { |
166 | .pv_init_ops = pv_init_ops, | 166 | .pv_init_ops = pv_init_ops, |
167 | .pv_misc_ops = pv_misc_ops, | ||
168 | .pv_time_ops = pv_time_ops, | 167 | .pv_time_ops = pv_time_ops, |
169 | .pv_cpu_ops = pv_cpu_ops, | 168 | .pv_cpu_ops = pv_cpu_ops, |
170 | .pv_irq_ops = pv_irq_ops, | 169 | .pv_irq_ops = pv_irq_ops, |
@@ -282,6 +281,49 @@ int paravirt_disable_iospace(void) | |||
282 | return ret; | 281 | return ret; |
283 | } | 282 | } |
284 | 283 | ||
284 | static DEFINE_PER_CPU(enum paravirt_lazy_mode, paravirt_lazy_mode) = PARAVIRT_LAZY_NONE; | ||
285 | |||
286 | static inline void enter_lazy(enum paravirt_lazy_mode mode) | ||
287 | { | ||
288 | BUG_ON(x86_read_percpu(paravirt_lazy_mode) != PARAVIRT_LAZY_NONE); | ||
289 | BUG_ON(preemptible()); | ||
290 | |||
291 | x86_write_percpu(paravirt_lazy_mode, mode); | ||
292 | } | ||
293 | |||
294 | void paravirt_leave_lazy(enum paravirt_lazy_mode mode) | ||
295 | { | ||
296 | BUG_ON(x86_read_percpu(paravirt_lazy_mode) != mode); | ||
297 | BUG_ON(preemptible()); | ||
298 | |||
299 | x86_write_percpu(paravirt_lazy_mode, PARAVIRT_LAZY_NONE); | ||
300 | } | ||
301 | |||
302 | void paravirt_enter_lazy_mmu(void) | ||
303 | { | ||
304 | enter_lazy(PARAVIRT_LAZY_MMU); | ||
305 | } | ||
306 | |||
307 | void paravirt_leave_lazy_mmu(void) | ||
308 | { | ||
309 | paravirt_leave_lazy(PARAVIRT_LAZY_MMU); | ||
310 | } | ||
311 | |||
312 | void paravirt_enter_lazy_cpu(void) | ||
313 | { | ||
314 | enter_lazy(PARAVIRT_LAZY_CPU); | ||
315 | } | ||
316 | |||
317 | void paravirt_leave_lazy_cpu(void) | ||
318 | { | ||
319 | paravirt_leave_lazy(PARAVIRT_LAZY_CPU); | ||
320 | } | ||
321 | |||
322 | enum paravirt_lazy_mode paravirt_get_lazy_mode(void) | ||
323 | { | ||
324 | return x86_read_percpu(paravirt_lazy_mode); | ||
325 | } | ||
326 | |||
285 | struct pv_info pv_info = { | 327 | struct pv_info pv_info = { |
286 | .name = "bare hardware", | 328 | .name = "bare hardware", |
287 | .paravirt_enabled = 0, | 329 | .paravirt_enabled = 0, |
@@ -347,6 +389,11 @@ struct pv_cpu_ops pv_cpu_ops = { | |||
347 | 389 | ||
348 | .set_iopl_mask = native_set_iopl_mask, | 390 | .set_iopl_mask = native_set_iopl_mask, |
349 | .io_delay = native_io_delay, | 391 | .io_delay = native_io_delay, |
392 | |||
393 | .lazy_mode = { | ||
394 | .enter = paravirt_nop, | ||
395 | .leave = paravirt_nop, | ||
396 | }, | ||
350 | }; | 397 | }; |
351 | 398 | ||
352 | struct pv_apic_ops pv_apic_ops = { | 399 | struct pv_apic_ops pv_apic_ops = { |
@@ -360,10 +407,6 @@ struct pv_apic_ops pv_apic_ops = { | |||
360 | #endif | 407 | #endif |
361 | }; | 408 | }; |
362 | 409 | ||
363 | struct pv_misc_ops pv_misc_ops = { | ||
364 | .set_lazy_mode = paravirt_nop, | ||
365 | }; | ||
366 | |||
367 | struct pv_mmu_ops pv_mmu_ops = { | 410 | struct pv_mmu_ops pv_mmu_ops = { |
368 | .pagetable_setup_start = native_pagetable_setup_start, | 411 | .pagetable_setup_start = native_pagetable_setup_start, |
369 | .pagetable_setup_done = native_pagetable_setup_done, | 412 | .pagetable_setup_done = native_pagetable_setup_done, |
@@ -414,6 +457,11 @@ struct pv_mmu_ops pv_mmu_ops = { | |||
414 | .dup_mmap = paravirt_nop, | 457 | .dup_mmap = paravirt_nop, |
415 | .exit_mmap = paravirt_nop, | 458 | .exit_mmap = paravirt_nop, |
416 | .activate_mm = paravirt_nop, | 459 | .activate_mm = paravirt_nop, |
460 | |||
461 | .lazy_mode = { | ||
462 | .enter = paravirt_nop, | ||
463 | .leave = paravirt_nop, | ||
464 | }, | ||
417 | }; | 465 | }; |
418 | 466 | ||
419 | EXPORT_SYMBOL_GPL(pv_time_ops); | 467 | EXPORT_SYMBOL_GPL(pv_time_ops); |