aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-i386/paravirt.h
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2007-05-02 13:27:14 -0400
committerAndi Kleen <andi@basil.nowhere.org>2007-05-02 13:27:14 -0400
commitd6dd61c831226f9cd7750885da04d360d6455101 (patch)
tree30f84a429821d207f7de5dd6225d3d9515042c0a /include/asm-i386/paravirt.h
parent5311ab62cdc7788784971ed816ce85e926f3e994 (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.h23
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
404static inline void paravirt_activate_mm(struct mm_struct *prev,
405 struct mm_struct *next)
406{
407 paravirt_ops.activate_mm(prev, next);
408}
409
410static inline void arch_dup_mmap(struct mm_struct *oldmm,
411 struct mm_struct *mm)
412{
413 paravirt_ops.dup_mmap(oldmm, mm);
414}
415
416static 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)