powerpc/mm: Rename mmu_context_hash64.c to mmu_context_book3s64.c
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Fri, 29 Apr 2016 13:26:03 +0000 (23:26 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 1 May 2016 08:33:07 +0000 (18:33 +1000)
This file now contains both hash and radix specific code. Rename it to
indicate this better.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/mm/Makefile
arch/powerpc/mm/mmu_context_book3s64.c [new file with mode: 0644]
arch/powerpc/mm/mmu_context_hash64.c [deleted file]

index d734934cbb1e584d0dc1774b3a3cc1159521fcaa..9589236028f4f205e6a0c03c0fcb255de96e1841 100644 (file)
@@ -14,11 +14,10 @@ obj-$(CONFIG_PPC_MMU_NOHASH)        += mmu_context_nohash.o tlb_nohash.o \
 obj-$(CONFIG_PPC_BOOK3E)       += tlb_low_$(CONFIG_WORD_SIZE)e.o
 hash64-$(CONFIG_PPC_NATIVE)    := hash_native_64.o
 obj-$(CONFIG_PPC_BOOK3E_64)   += pgtable-book3e.o
-obj-$(CONFIG_PPC_STD_MMU_64)   += pgtable-hash64.o hash_utils_64.o slb_low.o slb.o $(hash64-y)
+obj-$(CONFIG_PPC_STD_MMU_64)   += pgtable-hash64.o hash_utils_64.o slb_low.o slb.o $(hash64-y) mmu_context_book3s64.o
 obj-$(CONFIG_PPC_RADIX_MMU)    += pgtable-radix.o
-obj-$(CONFIG_PPC_STD_MMU_32)   += ppc_mmu_32.o hash_low_32.o
-obj-$(CONFIG_PPC_STD_MMU)      += tlb_hash$(CONFIG_WORD_SIZE).o \
-                                  mmu_context_hash$(CONFIG_WORD_SIZE).o
+obj-$(CONFIG_PPC_STD_MMU_32)   += ppc_mmu_32.o hash_low_32.o mmu_context_hash32.o
+obj-$(CONFIG_PPC_STD_MMU)      += tlb_hash$(CONFIG_WORD_SIZE).o
 ifeq ($(CONFIG_PPC_STD_MMU_64),y)
 obj-$(CONFIG_PPC_4K_PAGES)     += hash64_4k.o
 obj-$(CONFIG_PPC_64K_PAGES)    += hash64_64k.o
diff --git a/arch/powerpc/mm/mmu_context_book3s64.c b/arch/powerpc/mm/mmu_context_book3s64.c
new file mode 100644 (file)
index 0000000..b5288b4
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ *  MMU context allocation for 64-bit kernels.
+ *
+ *  Copyright (C) 2004 Anton Blanchard, IBM Corp. <anton@samba.org>
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version
+ *  2 of the License, or (at your option) any later version.
+ *
+ */
+
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/mm.h>
+#include <linux/spinlock.h>
+#include <linux/idr.h>
+#include <linux/export.h>
+#include <linux/gfp.h>
+#include <linux/slab.h>
+
+#include <asm/mmu_context.h>
+#include <asm/pgalloc.h>
+
+#include "icswx.h"
+
+static DEFINE_SPINLOCK(mmu_context_lock);
+static DEFINE_IDA(mmu_context_ida);
+
+int __init_new_context(void)
+{
+       int index;
+       int err;
+
+again:
+       if (!ida_pre_get(&mmu_context_ida, GFP_KERNEL))
+               return -ENOMEM;
+
+       spin_lock(&mmu_context_lock);
+       err = ida_get_new_above(&mmu_context_ida, 1, &index);
+       spin_unlock(&mmu_context_lock);
+
+       if (err == -EAGAIN)
+               goto again;
+       else if (err)
+               return err;
+
+       if (index > MAX_USER_CONTEXT) {
+               spin_lock(&mmu_context_lock);
+               ida_remove(&mmu_context_ida, index);
+               spin_unlock(&mmu_context_lock);
+               return -ENOMEM;
+       }
+
+       return index;
+}
+EXPORT_SYMBOL_GPL(__init_new_context);
+static int radix__init_new_context(struct mm_struct *mm, int index)
+{
+       unsigned long rts_field;
+
+       /*
+        * set the process table entry,
+        */
+       rts_field = 3ull << PPC_BITLSHIFT(2);
+       process_tb[index].prtb0 = cpu_to_be64(rts_field | __pa(mm->pgd) | RADIX_PGD_INDEX_SIZE);
+       return 0;
+}
+
+int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
+{
+       int index;
+
+       index = __init_new_context();
+       if (index < 0)
+               return index;
+
+       if (radix_enabled()) {
+               radix__init_new_context(mm, index);
+       } else {
+
+               /* The old code would re-promote on fork, we don't do that
+                * when using slices as it could cause problem promoting slices
+                * that have been forced down to 4K
+                */
+               if (slice_mm_new_context(mm))
+                       slice_set_user_psize(mm, mmu_virtual_psize);
+               subpage_prot_init_new_context(mm);
+       }
+       mm->context.id = index;
+#ifdef CONFIG_PPC_ICSWX
+       mm->context.cop_lockp = kmalloc(sizeof(spinlock_t), GFP_KERNEL);
+       if (!mm->context.cop_lockp) {
+               __destroy_context(index);
+               subpage_prot_free(mm);
+               mm->context.id = MMU_NO_CONTEXT;
+               return -ENOMEM;
+       }
+       spin_lock_init(mm->context.cop_lockp);
+#endif /* CONFIG_PPC_ICSWX */
+
+#ifdef CONFIG_PPC_64K_PAGES
+       mm->context.pte_frag = NULL;
+#endif
+#ifdef CONFIG_SPAPR_TCE_IOMMU
+       mm_iommu_init(&mm->context);
+#endif
+       return 0;
+}
+
+void __destroy_context(int context_id)
+{
+       spin_lock(&mmu_context_lock);
+       ida_remove(&mmu_context_ida, context_id);
+       spin_unlock(&mmu_context_lock);
+}
+EXPORT_SYMBOL_GPL(__destroy_context);
+
+#ifdef CONFIG_PPC_64K_PAGES
+static void destroy_pagetable_page(struct mm_struct *mm)
+{
+       int count;
+       void *pte_frag;
+       struct page *page;
+
+       pte_frag = mm->context.pte_frag;
+       if (!pte_frag)
+               return;
+
+       page = virt_to_page(pte_frag);
+       /* drop all the pending references */
+       count = ((unsigned long)pte_frag & ~PAGE_MASK) >> PTE_FRAG_SIZE_SHIFT;
+       /* We allow PTE_FRAG_NR fragments from a PTE page */
+       if (page_ref_sub_and_test(page, PTE_FRAG_NR - count)) {
+               pgtable_page_dtor(page);
+               free_hot_cold_page(page, 0);
+       }
+}
+
+#else
+static inline void destroy_pagetable_page(struct mm_struct *mm)
+{
+       return;
+}
+#endif
+
+
+void destroy_context(struct mm_struct *mm)
+{
+#ifdef CONFIG_SPAPR_TCE_IOMMU
+       mm_iommu_cleanup(&mm->context);
+#endif
+
+#ifdef CONFIG_PPC_ICSWX
+       drop_cop(mm->context.acop, mm);
+       kfree(mm->context.cop_lockp);
+       mm->context.cop_lockp = NULL;
+#endif /* CONFIG_PPC_ICSWX */
+
+       if (radix_enabled())
+               process_tb[mm->context.id].prtb1 = 0;
+       else
+               subpage_prot_free(mm);
+       destroy_pagetable_page(mm);
+       __destroy_context(mm->context.id);
+       mm->context.id = MMU_NO_CONTEXT;
+}
+
+#ifdef CONFIG_PPC_RADIX_MMU
+void radix__switch_mmu_context(struct mm_struct *prev, struct mm_struct *next)
+{
+       mtspr(SPRN_PID, next->context.id);
+       asm volatile("isync": : :"memory");
+}
+#endif
diff --git a/arch/powerpc/mm/mmu_context_hash64.c b/arch/powerpc/mm/mmu_context_hash64.c
deleted file mode 100644 (file)
index b5288b4..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  MMU context allocation for 64-bit kernels.
- *
- *  Copyright (C) 2004 Anton Blanchard, IBM Corp. <anton@samba.org>
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version
- *  2 of the License, or (at your option) any later version.
- *
- */
-
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/mm.h>
-#include <linux/spinlock.h>
-#include <linux/idr.h>
-#include <linux/export.h>
-#include <linux/gfp.h>
-#include <linux/slab.h>
-
-#include <asm/mmu_context.h>
-#include <asm/pgalloc.h>
-
-#include "icswx.h"
-
-static DEFINE_SPINLOCK(mmu_context_lock);
-static DEFINE_IDA(mmu_context_ida);
-
-int __init_new_context(void)
-{
-       int index;
-       int err;
-
-again:
-       if (!ida_pre_get(&mmu_context_ida, GFP_KERNEL))
-               return -ENOMEM;
-
-       spin_lock(&mmu_context_lock);
-       err = ida_get_new_above(&mmu_context_ida, 1, &index);
-       spin_unlock(&mmu_context_lock);
-
-       if (err == -EAGAIN)
-               goto again;
-       else if (err)
-               return err;
-
-       if (index > MAX_USER_CONTEXT) {
-               spin_lock(&mmu_context_lock);
-               ida_remove(&mmu_context_ida, index);
-               spin_unlock(&mmu_context_lock);
-               return -ENOMEM;
-       }
-
-       return index;
-}
-EXPORT_SYMBOL_GPL(__init_new_context);
-static int radix__init_new_context(struct mm_struct *mm, int index)
-{
-       unsigned long rts_field;
-
-       /*
-        * set the process table entry,
-        */
-       rts_field = 3ull << PPC_BITLSHIFT(2);
-       process_tb[index].prtb0 = cpu_to_be64(rts_field | __pa(mm->pgd) | RADIX_PGD_INDEX_SIZE);
-       return 0;
-}
-
-int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
-{
-       int index;
-
-       index = __init_new_context();
-       if (index < 0)
-               return index;
-
-       if (radix_enabled()) {
-               radix__init_new_context(mm, index);
-       } else {
-
-               /* The old code would re-promote on fork, we don't do that
-                * when using slices as it could cause problem promoting slices
-                * that have been forced down to 4K
-                */
-               if (slice_mm_new_context(mm))
-                       slice_set_user_psize(mm, mmu_virtual_psize);
-               subpage_prot_init_new_context(mm);
-       }
-       mm->context.id = index;
-#ifdef CONFIG_PPC_ICSWX
-       mm->context.cop_lockp = kmalloc(sizeof(spinlock_t), GFP_KERNEL);
-       if (!mm->context.cop_lockp) {
-               __destroy_context(index);
-               subpage_prot_free(mm);
-               mm->context.id = MMU_NO_CONTEXT;
-               return -ENOMEM;
-       }
-       spin_lock_init(mm->context.cop_lockp);
-#endif /* CONFIG_PPC_ICSWX */
-
-#ifdef CONFIG_PPC_64K_PAGES
-       mm->context.pte_frag = NULL;
-#endif
-#ifdef CONFIG_SPAPR_TCE_IOMMU
-       mm_iommu_init(&mm->context);
-#endif
-       return 0;
-}
-
-void __destroy_context(int context_id)
-{
-       spin_lock(&mmu_context_lock);
-       ida_remove(&mmu_context_ida, context_id);
-       spin_unlock(&mmu_context_lock);
-}
-EXPORT_SYMBOL_GPL(__destroy_context);
-
-#ifdef CONFIG_PPC_64K_PAGES
-static void destroy_pagetable_page(struct mm_struct *mm)
-{
-       int count;
-       void *pte_frag;
-       struct page *page;
-
-       pte_frag = mm->context.pte_frag;
-       if (!pte_frag)
-               return;
-
-       page = virt_to_page(pte_frag);
-       /* drop all the pending references */
-       count = ((unsigned long)pte_frag & ~PAGE_MASK) >> PTE_FRAG_SIZE_SHIFT;
-       /* We allow PTE_FRAG_NR fragments from a PTE page */
-       if (page_ref_sub_and_test(page, PTE_FRAG_NR - count)) {
-               pgtable_page_dtor(page);
-               free_hot_cold_page(page, 0);
-       }
-}
-
-#else
-static inline void destroy_pagetable_page(struct mm_struct *mm)
-{
-       return;
-}
-#endif
-
-
-void destroy_context(struct mm_struct *mm)
-{
-#ifdef CONFIG_SPAPR_TCE_IOMMU
-       mm_iommu_cleanup(&mm->context);
-#endif
-
-#ifdef CONFIG_PPC_ICSWX
-       drop_cop(mm->context.acop, mm);
-       kfree(mm->context.cop_lockp);
-       mm->context.cop_lockp = NULL;
-#endif /* CONFIG_PPC_ICSWX */
-
-       if (radix_enabled())
-               process_tb[mm->context.id].prtb1 = 0;
-       else
-               subpage_prot_free(mm);
-       destroy_pagetable_page(mm);
-       __destroy_context(mm->context.id);
-       mm->context.id = MMU_NO_CONTEXT;
-}
-
-#ifdef CONFIG_PPC_RADIX_MMU
-void radix__switch_mmu_context(struct mm_struct *prev, struct mm_struct *next)
-{
-       mtspr(SPRN_PID, next->context.id);
-       asm volatile("isync": : :"memory");
-}
-#endif
This page took 0.028542 seconds and 5 git commands to generate.