[PATCH 14/20] ia64: Preemptible mmu_gather

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Peter Zijlstra
Date: Saturday, August 28, 2010 - 7:16 am

Fix up the ia64 mmu_gather code to conform to the new API.

Cc: Tony Luck <tony.luck@intel.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
---
 arch/ia64/include/asm/tlb.h |   38 +++++++++++++++++++++++++-------------
 1 file changed, 25 insertions(+), 13 deletions(-)

Index: linux-2.6/arch/ia64/include/asm/tlb.h
===================================================================
--- linux-2.6.orig/arch/ia64/include/asm/tlb.h
+++ linux-2.6/arch/ia64/include/asm/tlb.h
@@ -47,21 +47,21 @@
 #include <asm/machvec.h>
 
 #ifdef CONFIG_SMP
-# define FREE_PTE_NR		2048
 # define tlb_fast_mode(tlb)	((tlb)->nr == ~0U)
 #else
-# define FREE_PTE_NR		0
 # define tlb_fast_mode(tlb)	(1)
 #endif
 
 struct mmu_gather {
 	struct mm_struct	*mm;
 	unsigned int		nr;		/* == ~0U => fast mode */
+	unsigned int		max;
 	unsigned char		fullmm;		/* non-zero means full mm flush */
 	unsigned char		need_flush;	/* really unmapped some PTEs? */
 	unsigned long		start_addr;
 	unsigned long		end_addr;
-	struct page 		*pages[FREE_PTE_NR];
+	struct page		**pages;
+	struct page		*local[8];
 };
 
 struct ia64_tr_entry {
@@ -90,9 +90,6 @@ extern struct ia64_tr_entry *ia64_idtrs[
 #define RR_RID_MASK	0x00000000ffffff00L
 #define RR_TO_RID(val) 	((val >> 8) & 0xffffff)
 
-/* Users of the generic TLB shootdown code must declare this storage space. */
-DECLARE_PER_CPU(struct mmu_gather, mmu_gathers);
-
 /*
  * Flush the TLB for address range START to END and, if not in fast mode, release the
  * freed pages that where gathered up to this point.
@@ -147,15 +144,25 @@ ia64_tlb_flush_mmu (struct mmu_gather *t
 	}
 }
 
-/*
- * 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_alloc_pages(struct mmu_gather *tlb)
+{
+	unsigned long addr = __get_free_pages(GFP_ATOMIC, 0);
+
+	if (addr) {
+		tlb->pages = (void *)addr;
+		tlb->max = PAGE_SIZE / sizeof(void *);
+	}
+}
+
+
+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->max = ARRAY_SIZE(tlb->local);
+	tlb->pages = tlb->local;
 	/*
 	 * Use fast mode if only 1 CPU is online.
 	 *
@@ -191,7 +198,8 @@ tlb_finish_mmu (struct mmu_gather *tlb, 
 	/* keep the page table cache within bounds */
 	check_pgt_cache();
 
-	put_cpu_var(mmu_gathers);
+	if (tlb->pages != tlb->local)
+		free_pages((unsigned long)tlb->pages, 0);
 }
 
 /*
@@ -208,8 +216,12 @@ tlb_remove_page (struct mmu_gather *tlb,
 		free_page_and_swap_cache(page);
 		return;
 	}
+
+	if (!tlb->nr && tlb->pages == tlb->local)
+		__tlb_alloc_pages(tlb);
+
 	tlb->pages[tlb->nr++] = page;
-	if (tlb->nr >= FREE_PTE_NR)
+	if (tlb->nr >= tlb->max)
 		ia64_tlb_flush_mmu(tlb, tlb->start_addr, tlb->end_addr);
 }
 


--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 00/20] mm: Preemptibility -v4, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 01/20] powerpc: Use call_rcu_sched() for pagetables, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 02/20] mm: Improve page_lock_anon_vma() comment, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 05/20] mm: Simplify anon_vma refcounts, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 06/20] mm: Use refcounts for page_lock_anon_vma(), Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 07/20] mm: Preemptible mmu_gather, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 08/20] powerpc: Preemptible mmu_gather, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 09/20] sparc: Preemptible mmu_gather, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 10/20] s390: preemptible mmu_gather, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 12/20] sh: Preemptible mmu_gather, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 13/20] um: Preemptible mmu_gather, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 14/20] ia64: Preemptible mmu_gather, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 16/20] lockdep, mutex: Provide mutex_lock_nest_lock, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 17/20] mutex: Provide mutex_is_contended, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 19/20] mm: Extended batches for generic mmu_gather, Peter Zijlstra, (Sat Aug 28, 7:16 am)
[PATCH 20/20] mm: Optimize page_lock_anon_vma() fast-path, Peter Zijlstra, (Sat Aug 28, 7:16 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Peter Zijlstra, (Sat Aug 28, 7:32 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Piotr Hosowicz, (Sat Aug 28, 7:56 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Peter Zijlstra, (Sat Aug 28, 8:10 am)
Re: [PATCH 05/20] mm: Simplify anon_vma refcounts, Pekka Enberg, (Sat Aug 28, 8:13 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Piotr Hosowicz, (Sat Aug 28, 8:17 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Pekka Enberg, (Sat Aug 28, 8:19 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Peter Zijlstra, (Sat Aug 28, 8:23 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Peter Zijlstra, (Sat Aug 28, 8:27 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Piotr Hosowicz, (Sat Aug 28, 9:01 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, David Miller, (Sat Aug 28, 3:28 pm)
Re: [PATCH 00/20] mm: Preemptibility -v4, Peter Zijlstra, (Sat Aug 28, 3:41 pm)
Re: [PATCH 00/20] mm: Preemptibility -v4, Piotr Hosowicz, (Sun Aug 29, 5:46 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Peter Zijlstra, (Sun Aug 29, 6:37 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Piotr Hosowicz, (Sun Aug 29, 6:43 am)
Re: [PATCH 14/20] ia64: Preemptible mmu_gather, Peter Zijlstra, (Mon Aug 30, 8:44 am)
Re: [PATCH 01/20] powerpc: Use call_rcu_sched() for pagetables, Benjamin Herrenschmidt, (Mon Aug 30, 11:10 pm)
Re: [PATCH 08/20] powerpc: Preemptible mmu_gather, Benjamin Herrenschmidt, (Mon Aug 30, 11:26 pm)
Re: [PATCH 08/20] powerpc: Preemptible mmu_gather, Benjamin Herrenschmidt, (Mon Aug 30, 11:31 pm)
Re: [PATCH 08/20] powerpc: Preemptible mmu_gather, Peter Zijlstra, (Tue Aug 31, 2:14 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Piotr Hosowicz, (Tue Aug 31, 7:02 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Piotr Hosowicz, (Tue Aug 31, 7:14 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Piotr Hosowicz, (Thu Sep 2, 7:53 am)
Re: [PATCH 00/20] mm: Preemptibility -v4, Alex,Shi, (Mon Sep 13, 10:36 pm)
Re: [PATCH 00/20] mm: Preemptibility -v4, Peter Zijlstra, (Tue Sep 14, 12:42 am)