Skip to content

Commit

Permalink
[PATCH] ppc64: More hugepage fixes
Browse files Browse the repository at this point in the history
My previous patch fixing invalidation of huge PTEs wasn't good enough, we
still had an issue if a PTE invalidation batch contained both small and
large pages.  This patch fixes this by making sure the batch is flushed if
the page size fed to it changes.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Benjamin Herrenschmidt authored and Linus Torvalds committed Sep 28, 2005
1 parent 485ef69 commit 0f9578b
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 4 deletions.
5 changes: 2 additions & 3 deletions arch/ppc64/mm/hash_native.c
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ static void native_flush_hash_range(unsigned long context,
hpte_t *hptep;
unsigned long hpte_v;
struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch);
unsigned long large;
unsigned long large = batch->large;

local_irq_save(flags);

Expand All @@ -356,7 +356,6 @@ static void native_flush_hash_range(unsigned long context,

va = (vsid << 28) | (batch->addr[i] & 0x0fffffff);
batch->vaddr[j] = va;
large = pte_huge(batch->pte[i]);
if (large)
vpn = va >> HPAGE_SHIFT;
else
Expand Down Expand Up @@ -406,7 +405,7 @@ static void native_flush_hash_range(unsigned long context,
asm volatile("ptesync":::"memory");

for (i = 0; i < j; i++)
__tlbie(batch->vaddr[i], 0);
__tlbie(batch->vaddr[i], large);

asm volatile("eieio; tlbsync; ptesync":::"memory");

Expand Down
4 changes: 3 additions & 1 deletion arch/ppc64/mm/tlb.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,14 +143,16 @@ void hpte_update(struct mm_struct *mm, unsigned long addr,
* up scanning and resetting referenced bits then our batch context
* will change mid stream.
*/
if (unlikely(i != 0 && context != batch->context)) {
if (i != 0 && (context != batch->context ||
batch->large != pte_huge(pte))) {
flush_tlb_pending();
i = 0;
}

if (i == 0) {
batch->context = context;
batch->mm = mm;
batch->large = pte_huge(pte);
}
batch->pte[i] = __pte(pte);
batch->addr[i] = addr;
Expand Down
1 change: 1 addition & 0 deletions include/asm-ppc64/tlbflush.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ struct ppc64_tlb_batch {
pte_t pte[PPC64_TLB_BATCH_NR];
unsigned long addr[PPC64_TLB_BATCH_NR];
unsigned long vaddr[PPC64_TLB_BATCH_NR];
unsigned int large;
};
DECLARE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);

Expand Down

0 comments on commit 0f9578b

Please sign in to comment.