From: "Chen, Kenneth W" <kenneth.w.chen@intel.com>
To: linux-ia64@vger.kernel.org
Subject: RE: HUGEPAGE SIZE a boottime option
Date: Thu, 26 Feb 2004 01:26:25 +0000 [thread overview]
Message-ID: <B05667366EE6204181EABE9C1B1C0EB501F2AB2B@scsmsx401.sc.intel.com> (raw)
In-Reply-To: <20040220010731.GA28820@sgi.com>
[-- Attachment #1: Type: text/plain, Size: 277 bytes --]
We believe we have resolved all the remain issues, all critical
speed path has been taken care of, i.e., vhpt hander and context
switch. There should be no performance penalty with this dynamic
hugetlb page size feature.
David, this is our final tested patch.
- Ken
[-- Attachment #2: htlb_size.patch --]
[-- Type: application/octet-stream, Size: 6424 bytes --]
diff -Nurp linux-2.6.3/arch/ia64/Kconfig linux-2.6.3.htlb/arch/ia64/Kconfig
--- linux-2.6.3/arch/ia64/Kconfig 2004-02-25 17:17:57.000000000 -0800
+++ linux-2.6.3.htlb/arch/ia64/Kconfig 2004-02-25 17:19:05.000000000 -0800
@@ -282,39 +282,6 @@ config FORCE_MAX_ZONEORDER
int
default "18"
-choice
- prompt "Huge TLB page size"
- depends on HUGETLB_PAGE
- default HUGETLB_PAGE_SIZE_16MB
-
-config HUGETLB_PAGE_SIZE_4GB
- depends on MCKINLEY
- bool "4GB"
-
-config HUGETLB_PAGE_SIZE_1GB
- depends on MCKINLEY
- bool "1GB"
-
-config HUGETLB_PAGE_SIZE_256MB
- bool "256MB"
-
-config HUGETLB_PAGE_SIZE_64MB
- bool "64MB"
-
-config HUGETLB_PAGE_SIZE_16MB
- bool "16MB"
-
-config HUGETLB_PAGE_SIZE_4MB
- bool "4MB"
-
-config HUGETLB_PAGE_SIZE_1MB
- bool "1MB"
-
-config HUGETLB_PAGE_SIZE_256KB
- bool "256KB"
-
-endchoice
-
config IA64_PAL_IDLE
bool "Use PAL_HALT_LIGHT in idle loop"
help
diff -Nurp linux-2.6.3/arch/ia64/kernel/ivt.S linux-2.6.3.htlb/arch/ia64/kernel/ivt.S
--- linux-2.6.3/arch/ia64/kernel/ivt.S 2004-02-25 17:17:57.000000000 -0800
+++ linux-2.6.3.htlb/arch/ia64/kernel/ivt.S 2004-02-25 17:19:05.000000000 -0800
@@ -118,10 +118,11 @@ ENTRY(vhpt_miss)
#ifdef CONFIG_HUGETLB_PAGE
extr.u r26=r25,2,6
;;
- cmp.eq p8,p0=HPAGE_SHIFT,r26
+ cmp.ne p8,p0=r18,r26
+ sub r27=r26,r18
;;
(p8) dep r25=r18,r25,2,6
-(p8) shr r22=r22,HPAGE_SHIFT-PAGE_SHIFT
+(p8) shr r22=r22,r27
#endif
;;
cmp.eq p6,p7=5,r17 // is IFA pointing into to region 5?
diff -Nurp linux-2.6.3/arch/ia64/mm/hugetlbpage.c linux-2.6.3.htlb/arch/ia64/mm/hugetlbpage.c
--- linux-2.6.3/arch/ia64/mm/hugetlbpage.c 2004-02-25 17:17:57.000000000 -0800
+++ linux-2.6.3.htlb/arch/ia64/mm/hugetlbpage.c 2004-02-25 17:19:05.000000000 -0800
@@ -1,7 +1,11 @@
/*
* IA-64 Huge TLB Page Support for Kernel.
*
- * Copyright (C) 2002, Rohit Seth <rohit.seth@intel.com>
+ * Copyright (C) 2002-2004 Rohit Seth <rohit.seth@intel.com>
+ * Copyright (C) 2003-2004 Ken Chen <kenneth.w.chen@intel.com>
+ *
+ * Sep, 2003: add numa support
+ * Feb, 2004: dynamic hugetlb page size via command line
*/
#include <linux/config.h>
@@ -23,6 +27,7 @@
static long htlbpagemem;
int htlbpage_max;
static long htlbzone_pages;
+unsigned int hpage_shift=HPAGE_SHIFT_DEFAULT;
static struct list_head hugepage_freelists[MAX_NUMNODES];
static spinlock_t htlbpage_lock = SPIN_LOCK_UNLOCKED;
@@ -520,6 +525,35 @@ static int __init hugetlb_setup(char *s)
}
__setup("hugepages=", hugetlb_setup);
+static int __init hugetlb_setup_sz(char *str)
+{
+ u64 tr_pages;
+ unsigned long long size;
+
+ if (ia64_pal_vm_page_size(&tr_pages, NULL) != 0)
+ /*
+ * shouldn't happen, but just in case.
+ */
+ tr_pages = 0x15557000UL;
+
+ size = memparse(str, &str);
+ if (*str || (size & (size-1)) || !(tr_pages & size) ||
+ size <= PAGE_SIZE ||
+ size >= (1UL << PAGE_SHIFT << MAX_ORDER)) {
+ printk(KERN_WARNING "Invalid huge page size specified\n");
+ return 1;
+ }
+
+ hpage_shift = __ffs(size);
+ /*
+ * boot cpu already executed ia64_mmu_init, and has HPAGE_SHIFT_DEFAULT
+ * override here with new page shift.
+ */
+ ia64_set_rr(0x8000000000000000, hpage_shift << 2);
+ return 1;
+}
+__setup("hugepagesz=", hugetlb_setup_sz);
+
static int __init hugetlb_init(void)
{
int i;
@@ -540,7 +574,7 @@ static int __init hugetlb_init(void)
printk("Total HugeTLB memory allocated, %ld\n", htlbpagemem);
return 0;
}
-module_init(hugetlb_init);
+__initcall(hugetlb_init);
int hugetlb_report_meminfo(char *buf)
{
diff -Nurp linux-2.6.3/arch/ia64/mm/init.c linux-2.6.3.htlb/arch/ia64/mm/init.c
--- linux-2.6.3/arch/ia64/mm/init.c 2004-02-25 17:17:57.000000000 -0800
+++ linux-2.6.3.htlb/arch/ia64/mm/init.c 2004-02-25 17:19:05.000000000 -0800
@@ -342,6 +342,10 @@ ia64_mmu_init (void *my_cpu_data)
ia64_tlb_init();
+#ifdef CONFIG_HUGETLB_PAGE
+ ia64_set_rr(0x8000000000000000, hpage_shift << 2);
+#endif
+
#ifdef CONFIG_IA64_MCA
cpu = smp_processor_id();
diff -Nurp linux-2.6.3/include/asm-ia64/mmu_context.h linux-2.6.3.htlb/include/asm-ia64/mmu_context.h
--- linux-2.6.3/include/asm-ia64/mmu_context.h 2004-02-25 17:18:04.000000000 -0800
+++ linux-2.6.3.htlb/include/asm-ia64/mmu_context.h 2004-02-25 17:19:05.000000000 -0800
@@ -140,8 +140,9 @@ reload_context (mm_context_t context)
{
unsigned long rid;
unsigned long rid_incr = 0;
- unsigned long rr0, rr1, rr2, rr3, rr4;
+ unsigned long rr0, rr1, rr2, rr3, rr4, old_rr4;
+ old_rr4 = ia64_get_rr(0x8000000000000000);
rid = context << 3; /* make space for encoding the region number */
rid_incr = 1 << 8;
@@ -152,7 +153,7 @@ reload_context (mm_context_t context)
rr3 = rr0 + 3*rid_incr;
rr4 = rr0 + 4*rid_incr;
#ifdef CONFIG_HUGETLB_PAGE
- rr4 = (rr4 & (~(0xfcUL))) | (HPAGE_SHIFT << 2);
+ rr4 = (rr4 & (~(0xfcUL))) | (old_rr4 & 0xfc);
#endif
ia64_set_rr(0x0000000000000000, rr0);
diff -Nurp linux-2.6.3/include/asm-ia64/page.h linux-2.6.3.htlb/include/asm-ia64/page.h
--- linux-2.6.3/include/asm-ia64/page.h 2004-02-25 17:18:04.000000000 -0800
+++ linux-2.6.3.htlb/include/asm-ia64/page.h 2004-02-25 17:19:05.000000000 -0800
@@ -37,27 +37,8 @@
#define RGN_MAP_LIMIT ((1UL << (4*PAGE_SHIFT - 12)) - PAGE_SIZE) /* per region addr limit */
#ifdef CONFIG_HUGETLB_PAGE
-
-# if defined(CONFIG_HUGETLB_PAGE_SIZE_4GB)
-# define HPAGE_SHIFT 32
-# elif defined(CONFIG_HUGETLB_PAGE_SIZE_1GB)
-# define HPAGE_SHIFT 30
-# elif defined(CONFIG_HUGETLB_PAGE_SIZE_256MB)
-# define HPAGE_SHIFT 28
-# elif defined(CONFIG_HUGETLB_PAGE_SIZE_64MB)
-# define HPAGE_SHIFT 26
-# elif defined(CONFIG_HUGETLB_PAGE_SIZE_16MB)
-# define HPAGE_SHIFT 24
-# elif defined(CONFIG_HUGETLB_PAGE_SIZE_4MB)
-# define HPAGE_SHIFT 22
-# elif defined(CONFIG_HUGETLB_PAGE_SIZE_1MB)
-# define HPAGE_SHIFT 20
-# elif defined(CONFIG_HUGETLB_PAGE_SIZE_256KB)
-# define HPAGE_SHIFT 18
-# else
-# error Unsupported IA-64 HugeTLB Page Size!
-# endif
-
+# define HPAGE_SHIFT hpage_shift
+# define HPAGE_SHIFT_DEFAULT 28 /* check ia64 SDM for architecture supported size */
# define REGION_HPAGE (4UL) /* note: this is hardcoded in mmu_context.h:reload_context()!*/
# define REGION_SHIFT 61
# define HPAGE_SIZE (__IA64_UL_CONST(1) << HPAGE_SHIFT)
@@ -140,6 +121,7 @@ typedef union ia64_va {
# define is_hugepage_only_range(addr, len) \
(REGION_NUMBER(addr) == REGION_HPAGE && \
REGION_NUMBER((addr)+(len)) == REGION_HPAGE)
+extern unsigned int hpage_shift;
#endif
static __inline__ int
next prev parent reply other threads:[~2004-02-26 1:26 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-02-20 1:07 HUGEPAGE SIZE a boottime option Jack Steiner
2004-02-20 2:35 ` David Mosberger
2004-02-20 4:00 ` Chen, Kenneth W
2004-02-20 19:36 ` Seth, Rohit
2004-02-22 5:27 ` Chris Wedgwood
2004-02-22 23:08 ` Jack Steiner
2004-02-23 16:19 ` Chen, Kenneth W
2004-02-23 16:26 ` Chen, Kenneth W
2004-02-23 18:52 ` David Mosberger
2004-02-23 18:58 ` Chen, Kenneth W
2004-02-24 4:05 ` Jack Steiner
2004-02-26 1:26 ` Chen, Kenneth W [this message]
2004-02-26 2:09 ` Chen, Kenneth W
2004-02-26 5:18 ` David Mosberger
2004-02-26 20:31 ` Chen, Kenneth W
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=B05667366EE6204181EABE9C1B1C0EB501F2AB2B@scsmsx401.sc.intel.com \
--to=kenneth.w.chen@intel.com \
--cc=linux-ia64@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox