[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-mm
Subject:    [RFC] move around pgtable headers
From:       Dave Hansen <haveblue () us ! ibm ! com>
Date:       2003-02-26 1:47:53
[Download RAW message or body]

I was screwing around with changing some macros in pgtable-3level.h into
static inlines and I quickly ran into some dependency problems.  Mainly,
pgtable-3level.h was included from pgtable.h before __pmd_offset() was
defined, and I wanted to use __pmd_offset() in a function instead of a
macro.

Anyway I have some _really_ rough demonstration of what I would like to
do in the attached patch.  What I want to see is some more explicit
definitions of what the dependencies are in the various header files.
Is this anything that people would like to see expanded?

I haven't even gotten close to moving all of the macros into the ops.h
file, but you can probably get the idea.

 page.h                 |   26 ------------------------
 pgtable-2level.h       |   19 +++--------------
 pgtable-3level.h       |   53 +++++++++++++++++++----------------------
 pgtable.h              |    3 --
 pgtable/const-2level.h |   17 +++++++++++++++
 pgtable/const-3level.h |   25 +++++++++++++++++++++++
 pgtable/const.h        |   12 +++++++++++
 pgtable/ops.h          |   17 +++++++++++++++
 pgtable/types-2level.h |   10 +++++++++
 pgtable/types-3level.h |   10 +++++++++
 pgtable/types.h        |   12 +++++++++++
 13 files changed, 132 insertions(+), 72 deletions(-)

-- 
Dave Hansen
haveblue@us.ibm.com

["pgtable-moves.patch" (text/plain)]

Binary files linux-2.5.62-clean/include/asm-i386/.page.h.swp and \
linux-2.5.62-vm_names/include/asm-i386/.page.h.swp differ Binary files \
linux-2.5.62-clean/include/asm-i386/.pgtable-3level.h.swp and \
                linux-2.5.62-vm_names/include/asm-i386/.pgtable-3level.h.swp differ
diff -urN linux-2.5.62-clean/include/asm-i386/page.h \
                linux-2.5.62-vm_names/include/asm-i386/page.h
--- linux-2.5.62-clean/include/asm-i386/page.h	Mon Feb 17 14:55:57 2003
+++ linux-2.5.62-vm_names/include/asm-i386/page.h	Tue Feb 25 17:18:40 2003
@@ -13,6 +13,7 @@
 #ifndef __ASSEMBLY__
 
 #include <linux/config.h>
+#include <asm/pgtable/types.h>
 
 #ifdef CONFIG_X86_USE_3DNOW
 
@@ -36,22 +37,6 @@
 #define clear_user_page(page, vaddr, pg)	clear_page(page)
 #define copy_user_page(to, from, vaddr, pg)	copy_page(to, from)
 
-/*
- * These are used to make use of C type-checking..
- */
-#ifdef CONFIG_X86_PAE
-typedef struct { unsigned long pte_low, pte_high; } pte_t;
-typedef struct { unsigned long long pmd; } pmd_t;
-typedef struct { unsigned long long pgd; } pgd_t;
-#define pte_val(x)	((x).pte_low | ((unsigned long long)(x).pte_high << 32))
-#define HPAGE_SHIFT	21
-#else
-typedef struct { unsigned long pte_low; } pte_t;
-typedef struct { unsigned long pmd; } pmd_t;
-typedef struct { unsigned long pgd; } pgd_t;
-#define pte_val(x)	((x).pte_low)
-#define HPAGE_SHIFT	22
-#endif
 #define PTE_MASK	PAGE_MASK
 
 #ifdef CONFIG_HUGETLB_PAGE
@@ -61,15 +46,6 @@
 #endif
 
 typedef struct { unsigned long pgprot; } pgprot_t;
-
-#define pmd_val(x)	((x).pmd)
-#define pgd_val(x)	((x).pgd)
-#define pgprot_val(x)	((x).pgprot)
-
-#define __pte(x) ((pte_t) { (x) } )
-#define __pmd(x) ((pmd_t) { (x) } )
-#define __pgd(x) ((pgd_t) { (x) } )
-#define __pgprot(x)	((pgprot_t) { (x) } )
 
 #endif /* !__ASSEMBLY__ */
 
diff -urN linux-2.5.62-clean/include/asm-i386/pgtable/const-2level.h \
                linux-2.5.62-vm_names/include/asm-i386/pgtable/const-2level.h
--- linux-2.5.62-clean/include/asm-i386/pgtable/const-2level.h	Wed Dec 31 16:00:00 \
                1969
+++ linux-2.5.62-vm_names/include/asm-i386/pgtable/const-2level.h	Tue Feb 25 15:16:16 \
2003 @@ -0,0 +1,17 @@
+
+/*
+ * traditional i386 two-level paging structure:
+ */
+
+#define PGDIR_SHIFT	22
+#define PTRS_PER_PGD	1024
+
+/*
+ * the i386 is two-level, so we don't really have any
+ * PMD directory physically.
+ */
+#define PMD_SHIFT	22
+#define PTRS_PER_PMD	1
+
+#define PTRS_PER_PTE	1024
+
diff -urN linux-2.5.62-clean/include/asm-i386/pgtable/const-3level.h \
                linux-2.5.62-vm_names/include/asm-i386/pgtable/const-3level.h
--- linux-2.5.62-clean/include/asm-i386/pgtable/const-3level.h	Wed Dec 31 16:00:00 \
                1969
+++ linux-2.5.62-vm_names/include/asm-i386/pgtable/const-3level.h	Tue Feb 25 15:14:02 \
2003 @@ -0,0 +1,25 @@
+/*
+ * Intel Physical Address Extension (PAE) Mode - three-level page
+ * tables on PPro+ CPUs.
+ *
+ * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com> 
+ */
+ 
+/*
+ * PGDIR_SHIFT determines what a top-level page table entry can map
+ */
+#define PGDIR_SHIFT     30 
+#define PTRS_PER_PGD    4
+
+/*
+ * PMD_SHIFT determines the size of the area a middle-level
+ * page table can map
+ */
+#define PMD_SHIFT       21
+#define PTRS_PER_PMD    512
+
+/*
+ * entries per page directory level
+ */
+#define PTRS_PER_PTE    512
+
diff -urN linux-2.5.62-clean/include/asm-i386/pgtable/const.h \
                linux-2.5.62-vm_names/include/asm-i386/pgtable/const.h
--- linux-2.5.62-clean/include/asm-i386/pgtable/const.h	Wed Dec 31 16:00:00 1969
+++ linux-2.5.62-vm_names/include/asm-i386/pgtable/const.h	Tue Feb 25 17:24:29 2003
@@ -0,0 +1,12 @@
+#ifndef _I386_PGTABLE_CONST_H_
+#define _I386_PGTABLE_CONST_H_
+
+#include <linux/config.h>
+
+#ifdef CONFIG_X86_PAE
+ #include <asm/pgtable/const-3level.h>
+#else
+ #include <asm/pgtable/const-2level.h>
+#endif
+
+#endif
diff -urN linux-2.5.62-clean/include/asm-i386/pgtable/ops.h \
                linux-2.5.62-vm_names/include/asm-i386/pgtable/ops.h
--- linux-2.5.62-clean/include/asm-i386/pgtable/ops.h	Wed Dec 31 16:00:00 1969
+++ linux-2.5.62-vm_names/include/asm-i386/pgtable/ops.h	Tue Feb 25 17:28:40 2003
@@ -0,0 +1,17 @@
+#ifndef __I386_PGTABLE_OPS_H_
+#define __I386_PGTABLE_OPS_H_
+
+#define pmd_val(x)      ((x).pmd)
+#define pgd_val(x)      ((x).pgd)
+#define pgprot_val(x)   ((x).pgprot)
+
+#define __pte(x) ((pte_t) { (x) } )
+#define __pmd(x) ((pmd_t) { (x) } )
+#define __pgd(x) ((pgd_t) { (x) } )
+#define __pgprot(x)     ((pgprot_t) { (x) } )
+
+
+#define __pmd_offset(address) \
+		(((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
+
+#endif
diff -urN linux-2.5.62-clean/include/asm-i386/pgtable/types-2level.h \
                linux-2.5.62-vm_names/include/asm-i386/pgtable/types-2level.h
--- linux-2.5.62-clean/include/asm-i386/pgtable/types-2level.h	Wed Dec 31 16:00:00 \
                1969
+++ linux-2.5.62-vm_names/include/asm-i386/pgtable/types-2level.h	Tue Feb 25 15:23:03 \
2003 @@ -0,0 +1,10 @@
+#ifndef _I386_PGTABLE_TYPES_2LEVEL_H_
+#define _I386_PGTABLE_TYPES_2LEVEL_H_
+
+typedef struct { unsigned long pte_low; } pte_t;
+typedef struct { unsigned long pmd; } pmd_t;
+typedef struct { unsigned long pgd; } pgd_t;
+#define pte_val(x)	((x).pte_low)
+#define HPAGE_SHIFT	22
+
+#endif
diff -urN linux-2.5.62-clean/include/asm-i386/pgtable/types-3level.h \
                linux-2.5.62-vm_names/include/asm-i386/pgtable/types-3level.h
--- linux-2.5.62-clean/include/asm-i386/pgtable/types-3level.h	Wed Dec 31 16:00:00 \
                1969
+++ linux-2.5.62-vm_names/include/asm-i386/pgtable/types-3level.h	Tue Feb 25 15:23:21 \
2003 @@ -0,0 +1,10 @@
+#ifndef _I386_PGTABLE_TYPES_3LEVEL_H_
+#define _I386_PGTABLE_TYPES_3LEVEL_H_
+
+typedef struct { unsigned long pte_low, pte_high; } pte_t;
+typedef struct { unsigned long long pmd; } pmd_t;
+typedef struct { unsigned long long pgd; } pgd_t;
+#define pte_val(x)	((x).pte_low | ((unsigned long long)(x).pte_high << 32))
+#define HPAGE_SHIFT	21
+
+#endif
diff -urN linux-2.5.62-clean/include/asm-i386/pgtable/types.h \
                linux-2.5.62-vm_names/include/asm-i386/pgtable/types.h
--- linux-2.5.62-clean/include/asm-i386/pgtable/types.h	Wed Dec 31 16:00:00 1969
+++ linux-2.5.62-vm_names/include/asm-i386/pgtable/types.h	Tue Feb 25 17:20:19 2003
@@ -0,0 +1,12 @@
+#ifndef _I386_PGTABLE_TYPES_H_
+#define _I386_PGTABLE_TYPES_H_
+
+#include <linux/config.h>
+
+#ifdef CONFIG_X86_PAE
+ #include <asm/pgtable/types-3level.h>
+#else
+ #include <asm/pgtable/types-2level.h>
+#endif
+
+#endif
diff -urN linux-2.5.62-clean/include/asm-i386/pgtable-2level.h \
                linux-2.5.62-vm_names/include/asm-i386/pgtable-2level.h
--- linux-2.5.62-clean/include/asm-i386/pgtable-2level.h	Mon Feb 17 14:56:16 2003
+++ linux-2.5.62-vm_names/include/asm-i386/pgtable-2level.h	Tue Feb 25 17:27:42 2003
@@ -1,21 +1,10 @@
 #ifndef _I386_PGTABLE_2LEVEL_H
 #define _I386_PGTABLE_2LEVEL_H
 
-/*
- * traditional i386 two-level paging structure:
- */
-
-#define PGDIR_SHIFT	22
-#define PTRS_PER_PGD	1024
-
-/*
- * the i386 is two-level, so we don't really have any
- * PMD directory physically.
- */
-#define PMD_SHIFT	22
-#define PTRS_PER_PMD	1
-
-#define PTRS_PER_PTE	1024
+/* these are order-dependent right now */
+#include <asm/pgtable/types.h>
+#include <asm/pgtable/const.h>
+#include <asm/pgtable/ops.h>
 
 #define pte_ERROR(e) \
 	printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, (e).pte_low)
diff -urN linux-2.5.62-clean/include/asm-i386/pgtable-3level.h \
                linux-2.5.62-vm_names/include/asm-i386/pgtable-3level.h
--- linux-2.5.62-clean/include/asm-i386/pgtable-3level.h	Mon Feb 17 14:56:48 2003
+++ linux-2.5.62-vm_names/include/asm-i386/pgtable-3level.h	Tue Feb 25 17:29:33 2003
@@ -1,30 +1,10 @@
 #ifndef _I386_PGTABLE_3LEVEL_H
 #define _I386_PGTABLE_3LEVEL_H
 
-/*
- * Intel Physical Address Extension (PAE) Mode - three-level page
- * tables on PPro+ CPUs.
- *
- * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
- */
-
-/*
- * PGDIR_SHIFT determines what a top-level page table entry can map
- */
-#define PGDIR_SHIFT	30
-#define PTRS_PER_PGD	4
-
-/*
- * PMD_SHIFT determines the size of the area a middle-level
- * page table can map
- */
-#define PMD_SHIFT	21
-#define PTRS_PER_PMD	512
-
-/*
- * entries per page directory level
- */
-#define PTRS_PER_PTE	512
+/* these are order-dependent right now, careful */ 
+#include <asm/pgtable/types-3level.h>
+#include <asm/pgtable/const-3level.h>
+#include <asm/pgtable/ops.h> /* for __pmd_offset */
 
 #define pte_ERROR(e) \
 	printk("%s:%d: bad pte %p(%08lx%08lx).\n", __FILE__, __LINE__, &(e), (e).pte_high, \
(e).pte_low) @@ -64,12 +44,27 @@
  */
 static inline void pgd_clear (pgd_t * pgd) { }
 
-#define pgd_page(pgd) \
-((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
+/* 
+ * the __va() will only work on lowmem addresses, so this 
+ * assumes that the PMD pages (the things pointed to by PGD
+ * entries) are in lowmem.
+ */
+static inline pmd_t *pgd_entry_to_pmd_page(pgd_t *pgd)
+{
+	/* the '&' strips out the flags from the PGD entry */
+	void * pmd_vaddr = __va(pgd_val(*pgd) & PAGE_MASK);
+	return (pmd_t *)pmd_vaddr;
+}
+
+#define pmd_offset(dir,address) pgd_entry_to_pmd_entry(dir,address)
 
-/* Find an entry in the second-level page table.. */
-#define pmd_offset(dir, address) ((pmd_t *) pgd_page(*(dir)) + \
-			__pmd_offset(address))
+/* Find a single entry in the second-level page table.. */
+static inline pmd_t *pgd_entry_to_pmd_entry(pgd_t *pgd_entry, 
+					    unsigned long address) 
+{
+	pmd_t *pmd_page = pgd_entry_to_pmd_page(pgd_entry);
+	return &pmd_page[__pmd_offset(address)];
+}
 
 static inline pte_t ptep_get_and_clear(pte_t *ptep)
 {
diff -urN linux-2.5.62-clean/include/asm-i386/pgtable.h \
                linux-2.5.62-vm_names/include/asm-i386/pgtable.h
--- linux-2.5.62-clean/include/asm-i386/pgtable.h	Mon Feb 17 14:56:43 2003
+++ linux-2.5.62-vm_names/include/asm-i386/pgtable.h	Tue Feb 25 15:17:52 2003
@@ -242,9 +242,6 @@
 /* to find an entry in a kernel page-table-directory */
 #define pgd_offset_k(address) pgd_offset(&init_mm, address)
 
-#define __pmd_offset(address) \
-		(((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
-
 /* Find an entry in the third-level page table.. */
 #define __pte_offset(address) \
 		(((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))


--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic