|
@@ -22,9 +22,6 @@ struct mmu_gather {
|
|
|
unsigned int fullmm; /* non-zero means full mm flush */
|
|
|
};
|
|
|
|
|
|
-/* Users of the generic TLB shootdown code must declare this storage space. */
|
|
|
-DECLARE_PER_CPU(struct mmu_gather, mmu_gathers);
|
|
|
-
|
|
|
static inline void __tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep,
|
|
|
unsigned long address)
|
|
|
{
|
|
@@ -47,27 +44,20 @@ static inline void init_tlb_gather(struct mmu_gather *tlb)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* tlb_gather_mmu
|
|
|
- * Return a pointer to an initialized struct mmu_gather.
|
|
|
- */
|
|
|
-static inline struct mmu_gather *
|
|
|
-tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush)
|
|
|
+static inline void
|
|
|
+tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned int full_mm_flush)
|
|
|
{
|
|
|
- struct mmu_gather *tlb = &get_cpu_var(mmu_gathers);
|
|
|
-
|
|
|
tlb->mm = mm;
|
|
|
tlb->fullmm = full_mm_flush;
|
|
|
|
|
|
init_tlb_gather(tlb);
|
|
|
-
|
|
|
- return tlb;
|
|
|
}
|
|
|
|
|
|
extern void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start,
|
|
|
unsigned long end);
|
|
|
|
|
|
static inline void
|
|
|
-tlb_flush_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
|
|
|
+tlb_flush_mmu(struct mmu_gather *tlb)
|
|
|
{
|
|
|
if (!tlb->need_flush)
|
|
|
return;
|
|
@@ -83,12 +73,10 @@ tlb_flush_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
|
|
|
static inline void
|
|
|
tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
|
|
|
{
|
|
|
- tlb_flush_mmu(tlb, start, end);
|
|
|
+ tlb_flush_mmu(tlb);
|
|
|
|
|
|
/* keep the page table cache within bounds */
|
|
|
check_pgt_cache();
|
|
|
-
|
|
|
- put_cpu_var(mmu_gathers);
|
|
|
}
|
|
|
|
|
|
/* tlb_remove_page
|
|
@@ -96,11 +84,16 @@ tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
|
|
|
* while handling the additional races in SMP caused by other CPUs
|
|
|
* caching valid mappings in their TLBs.
|
|
|
*/
|
|
|
-static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
|
|
+static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
|
|
{
|
|
|
tlb->need_flush = 1;
|
|
|
free_page_and_swap_cache(page);
|
|
|
- return;
|
|
|
+ return 1; /* avoid calling tlb_flush_mmu */
|
|
|
+}
|
|
|
+
|
|
|
+static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
|
|
+{
|
|
|
+ __tlb_remove_page(tlb, page);
|
|
|
}
|
|
|
|
|
|
/**
|