diff options
author | Jeremy Fitzhardinge <jeremy@goop.org> | 2008-06-25 00:19:12 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-08 07:11:01 -0400 |
commit | eba0045ff87bab465d3c80c289f3bf709c1800f5 (patch) | |
tree | e015805494c1ddb427fa568619163913270963bd /include/asm-x86/paravirt.h | |
parent | 67350a5c4514c280665cdb45439d32a008a264ba (diff) |
x86/paravirt: add a pgd_alloc/free hooks
Add hooks which are called at pgd_alloc/free time. The pgd_alloc hook
may return an error code, which if non-zero, causes the pgd allocation
to be failed. The hooks may be used to allocate/free auxillary
per-pgd information.
also fix:
> * Ingo Molnar <mingo@elte.hu> wrote:
>
> include/asm/pgalloc.h: In function ‘paravirt_pgd_free':
> include/asm/pgalloc.h:14: error: parameter name omitted
> arch/x86/kernel/entry_64.S: In file included from
> arch/x86/kernel/traps_64.c:51:include/asm/pgalloc.h: In function ‘paravirt_pgd_free':
> include/asm/pgalloc.h:14: error: parameter name omitted
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: Stephen Tweedie <sct@redhat.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/asm-x86/paravirt.h')
-rw-r--r-- | include/asm-x86/paravirt.h | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h index 41f5447efd88..5467e2cff4bc 100644 --- a/include/asm-x86/paravirt.h +++ b/include/asm-x86/paravirt.h | |||
@@ -219,7 +219,14 @@ struct pv_mmu_ops { | |||
219 | void (*flush_tlb_others)(const cpumask_t *cpus, struct mm_struct *mm, | 219 | void (*flush_tlb_others)(const cpumask_t *cpus, struct mm_struct *mm, |
220 | unsigned long va); | 220 | unsigned long va); |
221 | 221 | ||
222 | /* Hooks for allocating/releasing pagetable pages */ | 222 | /* Hooks for allocating and freeing a pagetable top-level */ |
223 | int (*pgd_alloc)(struct mm_struct *mm); | ||
224 | void (*pgd_free)(struct mm_struct *mm, pgd_t *pgd); | ||
225 | |||
226 | /* | ||
227 | * Hooks for allocating/releasing pagetable pages when they're | ||
228 | * attached to a pagetable | ||
229 | */ | ||
223 | void (*alloc_pte)(struct mm_struct *mm, u32 pfn); | 230 | void (*alloc_pte)(struct mm_struct *mm, u32 pfn); |
224 | void (*alloc_pmd)(struct mm_struct *mm, u32 pfn); | 231 | void (*alloc_pmd)(struct mm_struct *mm, u32 pfn); |
225 | void (*alloc_pmd_clone)(u32 pfn, u32 clonepfn, u32 start, u32 count); | 232 | void (*alloc_pmd_clone)(u32 pfn, u32 clonepfn, u32 start, u32 count); |
@@ -925,6 +932,16 @@ static inline void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, | |||
925 | PVOP_VCALL3(pv_mmu_ops.flush_tlb_others, &cpumask, mm, va); | 932 | PVOP_VCALL3(pv_mmu_ops.flush_tlb_others, &cpumask, mm, va); |
926 | } | 933 | } |
927 | 934 | ||
935 | static inline int paravirt_pgd_alloc(struct mm_struct *mm) | ||
936 | { | ||
937 | return PVOP_CALL1(int, pv_mmu_ops.pgd_alloc, mm); | ||
938 | } | ||
939 | |||
940 | static inline void paravirt_pgd_free(struct mm_struct *mm, pgd_t *pgd) | ||
941 | { | ||
942 | PVOP_VCALL2(pv_mmu_ops.pgd_free, mm, pgd); | ||
943 | } | ||
944 | |||
928 | static inline void paravirt_alloc_pte(struct mm_struct *mm, unsigned pfn) | 945 | static inline void paravirt_alloc_pte(struct mm_struct *mm, unsigned pfn) |
929 | { | 946 | { |
930 | PVOP_VCALL2(pv_mmu_ops.alloc_pte, mm, pfn); | 947 | PVOP_VCALL2(pv_mmu_ops.alloc_pte, mm, pfn); |