[3.13.y.z extended stable] Patch "sparc64: Kill unnecessary tables and increase MAX_BANKS." has been added to staging queue

Kamal Mostafa kamal at canonical.com
Fri Oct 31 20:53:32 UTC 2014

This is a note to let you know that I have just added a patch titled

    sparc64: Kill unnecessary tables and increase MAX_BANKS.

to the linux-3.13.y-queue branch of the 3.13.y.z extended stable tree 
which can be found at:


This patch is scheduled to be released in version

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.13.y.z tree, see



>From e7153bb8e9bd86bced76624d32557c5a32983ed5 Mon Sep 17 00:00:00 2001
From: "David S. Miller" <davem at davemloft.net>
Date: Sat, 27 Sep 2014 21:30:57 -0700
Subject: sparc64: Kill unnecessary tables and increase MAX_BANKS.

[ Upstream commit d195b71bad4347d2df51072a537f922546a904f1 ]

swapper_low_pmd_dir and swapper_pud_dir are actually completely
useless and unnecessary.

We just need swapper_pg_dir[].  Naturally the other page table chunks
will be allocated on an as-needed basis.  Since the kernel actually
accesses these tables in the PAGE_OFFSET view, there is not even a TLB
locality advantage of placing them in the kernel image.

Use the hard coded vmlinux.ld.S slot for swapper_pg_dir which is
naturally page aligned.

Increase MAX_BANKS to 1024 in order to handle heavily fragmented
virtual guests.

Even with this MAX_BANKS increase, the kernel is 20K+ smaller.

Signed-off-by: David S. Miller <davem at davemloft.net>
Acked-by: Bob Picco <bob.picco at oracle.com>
Signed-off-by: Kamal Mostafa <kamal at canonical.com>
 arch/sparc/include/asm/pgtable_64.h |  1 -
 arch/sparc/kernel/vmlinux.lds.S     |  5 +++--
 arch/sparc/mm/init_64.c             | 25 ++-----------------------
 3 files changed, 5 insertions(+), 26 deletions(-)

diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h
index ad1def4..e8dfabf 100644
--- a/arch/sparc/include/asm/pgtable_64.h
+++ b/arch/sparc/include/asm/pgtable_64.h
@@ -927,7 +927,6 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,

 extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
-extern pmd_t swapper_low_pmd_dir[PTRS_PER_PMD];

 extern void paging_init(void);
 extern unsigned long find_ecache_flush_span(unsigned long size);
diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S
index 0bacceb..0924305 100644
--- a/arch/sparc/kernel/vmlinux.lds.S
+++ b/arch/sparc/kernel/vmlinux.lds.S
@@ -35,8 +35,9 @@ jiffies = jiffies_64;

-	/* swapper_low_pmd_dir is sparc64 only */
-	swapper_low_pmd_dir = 0x0000000000402000;
+#ifdef CONFIG_SPARC64
+	swapper_pg_dir = 0x0000000000402000;
 	.text TEXTSTART :
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
index ca634b3..39c52fc 100644
--- a/arch/sparc/mm/init_64.c
+++ b/arch/sparc/mm/init_64.c
@@ -85,7 +85,7 @@ extern struct tsb swapper_tsb[KERNEL_TSB_NENTRIES];

 static unsigned long cpu_pgsz_mask;

-#define MAX_BANKS	32
+#define MAX_BANKS	1024

 static struct linux_prom64_registers pavail[MAX_BANKS];
 static int pavail_ents;
@@ -1936,12 +1936,6 @@ static void __init sun4v_linear_pte_xor_finalize(void)

 static unsigned long last_valid_pfn;

-/* These must be page aligned in order to not trigger the
- * alignment tests of pgd_bad() and pud_bad().
- */
-pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__ ((aligned (PAGE_SIZE)));
-static pud_t swapper_pud_dir[PTRS_PER_PUD] __attribute__ ((aligned (PAGE_SIZE)));
 static void sun4u_pgprot_init(void);
 static void sun4v_pgprot_init(void);

@@ -1949,8 +1943,6 @@ void __init paging_init(void)
 	unsigned long end_pfn, shift, phys_base;
 	unsigned long real_end, i;
-	pud_t *pud;
-	pmd_t *pmd;
 	int node;

@@ -2045,20 +2037,7 @@ void __init paging_init(void)
 	init_mm.pgd += ((shift) / (sizeof(pgd_t)));

-	memset(swapper_low_pmd_dir, 0, sizeof(swapper_low_pmd_dir));
-	/* The kernel page tables we publish into what the rest of the
-	 * world sees must be adjusted so that they see the PAGE_OFFSET
-	 * address of these in-kerenel data structures.  However right
-	 * here we must access them from the kernel image side, because
-	 * the trap tables haven't been taken over and therefore we cannot
-	 * take TLB misses in the PAGE_OFFSET linear mappings yet.
-	 */
-	pud = swapper_pud_dir + (shift / sizeof(pud_t));
-	pgd_set(&swapper_pg_dir[0], pud);
-	pmd = swapper_low_pmd_dir + (shift / sizeof(pmd_t));
-	pud_set(&swapper_pud_dir[0], pmd);
+	memset(swapper_pg_dir, 0, sizeof(swapper_pg_dir));



More information about the kernel-team mailing list