ARC: Make vmalloc size configurable
authorNoam Camus <noamc@ezchip.com>
Sun, 7 Sep 2014 19:52:33 +0000 (22:52 +0300)
committerVineet Gupta <vgupta@synopsys.com>
Mon, 9 May 2016 04:02:32 +0000 (09:32 +0530)
On ARC, lower 2G of address space is translated and used for
 - user vaddr space (region 0 to 5)
 - unused kernel-user gutter (region 6)
 - kernel vaddr space (region 7)

where each region simply represents 256MB of address space.

The kernel vaddr space of 256MB is used to implement vmalloc, modules
So far this was enough, but not on EZChip system with 4K CPUs (given
that per cpu mechanism uses vmalloc for allocating chunks)

So allow VMALLOC_SIZE to be configurable by expanding down into the unused
kernel-user gutter region which at default 256M was excessive anyways.

Also use _BITUL() to fix a build error since PGDIR_SIZE cannot use "1UL"
as called from assembly code in mm/tlbex.S

Signed-off-by: Noam Camus <noamc@ezchip.com>
[vgupta: rewrote changelog, debugged bootup crash due to int vs. hex]
Acked-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/Kconfig
arch/arc/include/asm/pgtable.h
arch/arc/include/asm/processor.h
arch/arc/mm/tlb.c

index 4f1482aa8823b63ac00ad391c58c5e7babc8a932..30ad63413660972b62d86558f5c36d464d34be1f 100644 (file)
@@ -492,6 +492,17 @@ config ARCH_DMA_ADDR_T_64BIT
 config ARC_PLAT_NEEDS_PHYS_TO_DMA
        bool
 
+config ARC_KVADDR_SIZE
+       int "Kernel Virtaul Address Space size (MB)"
+       range 0 512
+       default "256"
+       help
+         The kernel address space is carved out of 256MB of translated address
+         space for catering to vmalloc, modules, pkmap, fixmap. This however may
+         not suffice vmalloc requirements of a 4K CPU EZChip system. So allow
+         this to be stretched to 512 MB (by extending into the reserved
+         kernel-user gutter)
+
 config ARC_CURR_IN_REG
        bool "Dedicate Register r25 for current_task pointer"
        default y
index 10d4b8b8e5450e83468f96f16d9ad18b5c62d3b0..034bbdc0ff61c3bffadd0284d776240d8137767d 100644 (file)
 #define BITS_FOR_PTE   (PGDIR_SHIFT - PAGE_SHIFT)
 #define BITS_FOR_PGD   (32 - PGDIR_SHIFT)
 
-#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)    /* vaddr span, not PDG sz */
+#define PGDIR_SIZE     _BITUL(PGDIR_SHIFT)     /* vaddr span, not PDG sz */
 #define PGDIR_MASK     (~(PGDIR_SIZE-1))
 
 #define        PTRS_PER_PTE    _BITUL(BITS_FOR_PTE)
index 1d694c1ef6d6bf33ccb17745db6e58e816915875..d0a9211ec7695f084b0188037ab3e4eff14dabde 100644 (file)
@@ -97,7 +97,7 @@ extern unsigned int get_wchan(struct task_struct *p);
 #endif /* !__ASSEMBLY__ */
 
 /*
- * System Memory Map on ARC
+ * Default System Memory Map on ARC
  *
  * ---------------------------- (lower 2G, Translated) -------------------------
  * 0x0000_0000         0x5FFF_FFFF     (user vaddr: TASK_SIZE)
@@ -109,18 +109,17 @@ extern unsigned int get_wchan(struct task_struct *p);
  * 0xC000_0000         0xFFFF_FFFF     (peripheral uncached space)
  * -----------------------------------------------------------------------------
  */
-#define VMALLOC_START  0x70000000
 
-/*
- * 1 PGDIR_SIZE each for fixmap/pkmap, 2 PGDIR_SIZE gutter
- * See asm/highmem.h for details
- */
-#define VMALLOC_SIZE   (PAGE_OFFSET - VMALLOC_START - PGDIR_SIZE * 4)
-#define VMALLOC_END    (VMALLOC_START + VMALLOC_SIZE)
+#define TASK_SIZE      0x60000000
 
-#define USER_KERNEL_GUTTER    0x10000000
+#define VMALLOC_START  (PAGE_OFFSET - (CONFIG_ARC_KVADDR_SIZE << 20))
+
+/* 1 PGDIR_SIZE each for fixmap/pkmap, 2 PGDIR_SIZE gutter (see asm/highmem.h) */
+#define VMALLOC_SIZE   ((CONFIG_ARC_KVADDR_SIZE << 20) - PGDIR_SIZE * 4)
+
+#define VMALLOC_END    (VMALLOC_START + VMALLOC_SIZE)
 
-#define TASK_SIZE      (VMALLOC_START - USER_KERNEL_GUTTER)
+#define USER_KERNEL_GUTTER    (VMALLOC_START - TASK_SIZE)
 
 #define STACK_TOP       TASK_SIZE
 #define STACK_TOP_MAX   STACK_TOP
index 7046c12c58edd3779990c3b16911c72d4a985e37..745a9aeb2d9677ec9bf63cf46eef1e096eb15763 100644 (file)
@@ -814,6 +814,11 @@ void arc_mmu_init(void)
 
        printk(arc_mmu_mumbojumbo(0, str, sizeof(str)));
 
+       /*
+        * Can't be done in processor.h due to header include depenedencies
+        */
+       BUILD_BUG_ON(!IS_ALIGNED((CONFIG_ARC_KVADDR_SIZE << 20), PMD_SIZE));
+
        /* For efficiency sake, kernel is compile time built for a MMU ver
         * This must match the hardware it is running on.
         * Linux built for MMU V2, if run on MMU V1 will break down because V1