diff options
author | Jeremy Fitzhardinge <jeremy@goop.org> | 2007-05-02 13:27:14 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2007-05-02 13:27:14 -0400 |
commit | d6dd61c831226f9cd7750885da04d360d6455101 (patch) | |
tree | 30f84a429821d207f7de5dd6225d3d9515042c0a /include/asm-i386/paravirt.h | |
parent | 5311ab62cdc7788784971ed816ce85e926f3e994 (diff) |
[PATCH] x86: PARAVIRT: add hooks to intercept mm creation and destruction
Add hooks to allow a paravirt implementation to track the lifetime of
an mm. Paravirtualization requires three hooks, but only two are
needed in common code. They are:
arch_dup_mmap, which is called when a new mmap is created at fork
arch_exit_mmap, which is called when the last process reference to an
mm is dropped, which typically happens on exit and exec.
The third hook is activate_mm, which is called from the arch-specific
activate_mm() macro/function, and so doesn't need stub versions for
other architectures. It's called when an mm is first used.
Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: linux-arch@vger.kernel.org
Cc: James Bottomley <James.Bottomley@SteelEye.com>
Acked-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/asm-i386/paravirt.h')
-rw-r--r-- | include/asm-i386/paravirt.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/include/asm-i386/paravirt.h b/include/asm-i386/paravirt.h index f93599dc7756..61c03f1e0c29 100644 --- a/include/asm-i386/paravirt.h +++ b/include/asm-i386/paravirt.h | |||
@@ -119,6 +119,12 @@ struct paravirt_ops | |||
119 | 119 | ||
120 | void (*io_delay)(void); | 120 | void (*io_delay)(void); |
121 | 121 | ||
122 | void (*activate_mm)(struct mm_struct *prev, | ||
123 | struct mm_struct *next); | ||
124 | void (*dup_mmap)(struct mm_struct *oldmm, | ||
125 | struct mm_struct *mm); | ||
126 | void (*exit_mmap)(struct mm_struct *mm); | ||
127 | |||
122 | #ifdef CONFIG_X86_LOCAL_APIC | 128 | #ifdef CONFIG_X86_LOCAL_APIC |
123 | void (*apic_write)(unsigned long reg, unsigned long v); | 129 | void (*apic_write)(unsigned long reg, unsigned long v); |
124 | void (*apic_write_atomic)(unsigned long reg, unsigned long v); | 130 | void (*apic_write_atomic)(unsigned long reg, unsigned long v); |
@@ -395,6 +401,23 @@ static inline void startup_ipi_hook(int phys_apicid, unsigned long start_eip, | |||
395 | } | 401 | } |
396 | #endif | 402 | #endif |
397 | 403 | ||
404 | static inline void paravirt_activate_mm(struct mm_struct *prev, | ||
405 | struct mm_struct *next) | ||
406 | { | ||
407 | paravirt_ops.activate_mm(prev, next); | ||
408 | } | ||
409 | |||
410 | static inline void arch_dup_mmap(struct mm_struct *oldmm, | ||
411 | struct mm_struct *mm) | ||
412 | { | ||
413 | paravirt_ops.dup_mmap(oldmm, mm); | ||
414 | } | ||
415 | |||
416 | static inline void arch_exit_mmap(struct mm_struct *mm) | ||
417 | { | ||
418 | paravirt_ops.exit_mmap(mm); | ||
419 | } | ||
420 | |||
398 | #define __flush_tlb() paravirt_ops.flush_tlb_user() | 421 | #define __flush_tlb() paravirt_ops.flush_tlb_user() |
399 | #define __flush_tlb_global() paravirt_ops.flush_tlb_kernel() | 422 | #define __flush_tlb_global() paravirt_ops.flush_tlb_kernel() |
400 | #define __flush_tlb_single(addr) paravirt_ops.flush_tlb_single(addr) | 423 | #define __flush_tlb_single(addr) paravirt_ops.flush_tlb_single(addr) |