From: Paul Davies <pauld@gelato.unsw.edu.au>
To: linux-mm@kvack.org
Cc: Paul Davies <pauld@gelato.unsw.edu.au>
Subject: [PATCH 4/29] Introduce Page Table Interface (PTI)
Date: Sat, 13 Jan 2007 13:46:01 +1100 [thread overview]
Message-ID: <20070113024601.29682.32487.sendpatchset@weill.orchestra.cse.unsw.EDU.AU> (raw)
In-Reply-To: <20070113024540.29682.27024.sendpatchset@weill.orchestra.cse.unsw.EDU.AU>
PATCH 04
* Creates /include/linux/pt.h and defines the clean page table interface
there. This file includes the chosen page table implementation
(at the moment, only the default implementation).
* Creates /include/linux/pt-default.h to hold a small subset of
the default page table implementation (for performance reasons).
* It keeps lookup_page_table and build_page_table static inlined.
* Locking should be inside the implementation.
Signed-Off-By: Paul Davies <pauld@gelato.unsw.edu.au>
---
pt-default.h | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
pt.h | 60 +++++++++++++++++++++++
2 files changed, 212 insertions(+)
Index: linux-2.6.20-rc4/include/linux/pt-default.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.20-rc4/include/linux/pt-default.h 2007-01-11 13:01:45.067046000 +1100
@@ -0,0 +1,152 @@
+#ifndef _LINUX_PT_DEFAULT_H
+#define _LINUX_PT_DEFAULT_H
+
+#include <asm/pgtable.h>
+#include <asm/pgalloc.h>
+
+#include <linux/hugetlb.h>
+#include <linux/highmem.h>
+
+typedef struct pt_struct { pmd_t *pmd; } pt_path_t;
+
+static inline int create_user_page_table(struct mm_struct *mm)
+{
+ mm->page_table.pgd = pgd_alloc(NULL);
+
+ if (unlikely(!mm->page_table.pgd))
+ return -ENOMEM;
+ return 0;
+}
+
+static inline void destroy_user_page_table(struct mm_struct *mm)
+{
+ pgd_free(mm->page_table.pgd);
+}
+
+static inline pte_t *lookup_page_table(struct mm_struct *mm,
+ unsigned long address, pt_path_t *pt_path)
+{
+ pgd_t *pgd;
+ pud_t *pud;
+ pmd_t *pmd;
+
+ if (mm!=&init_mm) { /* Look up user page table */
+ pgd = pgd_offset(mm, address);
+ if (pgd_none_or_clear_bad(pgd))
+ return NULL;
+ } else { /* Look up kernel page table */
+ pgd = pgd_offset_k(address);
+ if (pgd_none_or_clear_bad(pgd))
+ return NULL;
+ }
+
+ pud = pud_offset(pgd, address);
+ if (pud_none_or_clear_bad(pud)) {
+ return NULL;
+ }
+
+ pmd = pmd_offset(pud, address);
+ if (pmd_none_or_clear_bad(pmd)) {
+ return NULL;
+ }
+
+ if(pt_path)
+ pt_path->pmd = pmd;
+
+ return pte_offset_map(pmd, address);
+}
+
+static inline pte_t *build_page_table(struct mm_struct *mm,
+ unsigned long address, pt_path_t *pt_path)
+{
+ pgd_t *pgd;
+ pud_t *pud;
+ pmd_t *pmd;
+
+ pgd = pgd_offset(mm, address);
+ pud = pud_alloc(mm, pgd, address);
+ if (!pud)
+ return NULL;
+ pmd = pmd_alloc(mm, pud, address);
+ if (!pmd)
+ return NULL;
+
+ pt_path->pmd = pmd;
+ return pte_alloc_map(mm, pmd, address);
+}
+
+#define INIT_PT .page_table.pgd = swapper_pg_dir,
+
+#define lock_pte(mm, pt_path) \
+ ({ spin_lock(pte_lockptr(mm, pt_path.pmd));})
+
+#define unlock_pte(mm, pt_path) \
+ ({ spin_unlock(pte_lockptr(mm, pt_path.pmd)); })
+
+#define lookup_page_table_lock(mm, pt_path, address) \
+({ \
+ spinlock_t *__ptl = pte_lockptr(mm, pt_path.pmd); \
+ pte_t *__pte = pte_offset_map(pt_path.pmd, address); \
+ spin_lock(__ptl); \
+ __pte; \
+})
+
+#define atomic_pte_same(mm, pte, orig_pte, pt_path) \
+({ \
+ spinlock_t *ptl = pte_lockptr(mm, pt_path.pmd); \
+ int __same; \
+ spin_lock(ptl); \
+ __same = pte_same(*pte, orig_pte); \
+ spin_unlock(ptl); \
+ __same; \
+})
+
+#define is_huge_page(mm, address, pt_path, flags, page) \
+({ \
+ int __ret=0; \
+ if(pmd_huge(*pt_path.pmd)) { \
+ BUG_ON(flags & FOLL_GET); \
+ page = follow_huge_pmd(mm, address, pt_path.pmd, flags & FOLL_WRITE); \
+ __ret = 1; \
+ } \
+ __ret; \
+})
+
+#define set_pt_path(pt_path, ppt_path) (*(ppt_path)= (pt_path)) /* fix this */
+
+#define CLUSTER_SIZE min(32*PAGE_SIZE, PMD_SIZE)
+
+static inline pte_t *lookup_gate_area(struct mm_struct *mm,
+ unsigned long pg)
+{
+ pgd_t *pgd;
+ pud_t *pud;
+ pmd_t *pmd;
+ pte_t *pte;
+
+ if (pg > TASK_SIZE)
+ pgd = pgd_offset_k(pg);
+ else
+ pgd = pgd_offset_gate(mm, pg);
+ BUG_ON(pgd_none(*pgd));
+ pud = pud_offset(pgd, pg);
+ BUG_ON(pud_none(*pud));
+ pmd = pmd_offset(pud, pg);
+ if (pmd_none(*pmd))
+ return NULL;
+ pte = pte_offset_map(pmd, pg);
+ return pte;
+}
+
+#define vma_optimization \
+({ \
+ while (next && next->vm_start <= vma->vm_end + PMD_SIZE \
+ && !is_vm_hugetlb_page(next)) { \
+ vma = next; \
+ next = vma->vm_next; \
+ anon_vma_unlink(vma); \
+ unlink_file_vma(vma); \
+ } \
+})
+
+#endif
Index: linux-2.6.20-rc4/include/linux/pt.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.20-rc4/include/linux/pt.h 2007-01-11 13:04:06.307868000 +1100
@@ -0,0 +1,60 @@
+#ifndef _LINUX_PT_H
+#define _LINUX_PT_H
+
+#include <linux/swap.h>
+
+#ifdef CONFIG_PT_DEFAULT
+#include <linux/pt-default.h>
+#endif
+
+int create_user_page_table(struct mm_struct *mm);
+
+void destroy_user_page_table(struct mm_struct *mm);
+
+pte_t *build_page_table(struct mm_struct *mm, unsigned long address,
+ pt_path_t *pt_path);
+
+pte_t *lookup_page_table(struct mm_struct *mm, unsigned long address,
+ pt_path_t *pt_path);
+
+void free_pt_range(struct mmu_gather **tlb, unsigned long addr,
+ unsigned long end, unsigned long floor, unsigned long ceiling);
+
+int copy_dual_iterator(struct mm_struct *dst_mm, struct mm_struct *src_mm,
+ unsigned long addr, unsigned long end, struct vm_area_struct *vma);
+
+unsigned long unmap_page_range_iterator(struct mmu_gather *tlb,
+ struct vm_area_struct *vma, unsigned long addr, unsigned long end,
+ long *zap_work, struct zap_details *details);
+
+int zeromap_build_iterator(struct mm_struct *mm,
+ unsigned long addr, unsigned long end, pgprot_t prot);
+
+int remap_build_iterator(struct mm_struct *mm,
+ unsigned long addr, unsigned long end, unsigned long pfn,
+ pgprot_t prot);
+
+void change_protection_read_iterator(struct vm_area_struct *vma,
+ unsigned long addr, unsigned long end, pgprot_t newprot,
+ int dirty_accountable);
+
+void vunmap_read_iterator(unsigned long addr, unsigned long end);
+
+int vmap_build_iterator(unsigned long addr,
+ unsigned long end, pgprot_t prot, struct page ***pages);
+
+int unuse_vma_read_iterator(struct vm_area_struct *vma,
+ unsigned long addr, unsigned long end, swp_entry_t entry, struct page *page);
+
+/*void smaps_read_iterator(struct vm_area_struct *vma,
+ unsigned long addr, unsigned long end, struct mem_size_stats *mss);*/
+
+int check_policy_read_iterator(struct vm_area_struct *vma,
+ unsigned long addr, unsigned long end, const nodemask_t *nodes,
+ unsigned long flags, void *private);
+
+unsigned long move_page_tables(struct vm_area_struct *vma,
+ unsigned long old_addr, struct vm_area_struct *new_vma,
+ unsigned long new_addr, unsigned long len);
+
+#endif
--
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:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2007-01-13 2:46 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-01-13 2:45 [PATCH 0/29] Page Table Interface Explanation Paul Davies
2007-01-13 2:45 ` [PATCH 1/29] Abstract current page table implementation Paul Davies
2007-01-13 2:45 ` [PATCH 2/29] " Paul Davies
2007-01-13 2:45 ` [PATCH 3/29] " Paul Davies
2007-01-16 18:55 ` Christoph Lameter
2007-01-13 2:46 ` Paul Davies [this message]
2007-01-16 19:02 ` [PATCH 4/29] Introduce Page Table Interface (PTI) Christoph Lameter
2007-01-13 2:46 ` [PATCH 5/29] Start calling simple PTI functions Paul Davies
2007-01-16 19:04 ` Christoph Lameter
2007-01-18 6:43 ` Paul Cameron Davies
2007-01-13 2:46 ` [PATCH 6/29] Tweak IA64 arch dependent files to work with PTI Paul Davies
2007-01-16 19:05 ` Christoph Lameter
2007-01-13 2:46 ` [PATCH 7/29] Continue calling simple PTI functions Paul Davies
2007-01-16 19:08 ` Christoph Lameter
2007-01-13 2:46 ` [PATCH 8/29] Clean up page fault handers Paul Davies
2007-01-13 2:46 ` [PATCH 9/29] Clean up page fault handlers Paul Davies
2007-01-13 2:46 ` [PATCH 10/29] Call simple PTI functions Paul Davies
2007-01-13 2:46 ` [PATCH 11/29] Call simple PTI functions cont Paul Davies
2007-01-13 2:46 ` [PATCH 12/29] Abstract page table tear down Paul Davies
2007-01-13 2:46 ` [PATCH 13/29] Finish abstracting " Paul Davies
2007-01-13 2:46 ` [PATCH 14/29] Abstract copy page range iterator Paul Davies
2007-01-13 2:46 ` [PATCH 15/29] Finish abstracting copy page range Paul Davies
2007-01-13 2:47 ` [PATCH 16/29] Abstract unmap page range iterator Paul Davies
2007-01-13 2:47 ` [PATCH 17/29] Finish abstracting unmap page range Paul Davies
2007-01-13 2:47 ` [PATCH 18/29] Abstract zeromap " Paul Davies
2007-01-13 2:47 ` [PATCH 19/29] Abstract remap pfn range Paul Davies
2007-01-13 2:47 ` [PATCH 20/29] Abstract change protection iterator Paul Davies
2007-01-13 2:47 ` [PATCH 21/29] Abstract unmap vm area Paul Davies
2007-01-13 2:47 ` [PATCH 22/29] Abstract map " Paul Davies
2007-01-13 2:47 ` [PATCH 23/29] Abstract unuse_vma Paul Davies
2007-01-13 2:47 ` [PATCH 24/29] Abstract smaps iterator Paul Davies
2007-01-13 2:47 ` [PATCH 25/29] Abstact mempolicy iterator Paul Davies
2007-01-13 2:47 ` [PATCH 26/29] Abstract mempolicy iterator cont Paul Davies
2007-01-13 2:48 ` [PATCH 27/29] Abstract implementation dependent code for mremap Paul Davies
2007-01-13 2:48 ` [PATCH 28/29] Abstract ioremap iterator Paul Davies
2007-01-13 2:48 ` [PATCH 29/29] Tweak i386 arch dependent files to work with PTI Paul Davies
2007-01-13 2:48 ` [PATCH 1/5] Introduce IA64 page table interface Paul Davies
2007-01-13 2:48 ` [PATCH 2/5] Abstract pgtable Paul Davies
2007-01-13 2:48 ` [PATCH 3/5] Abstact pgtable continued Paul Davies
2007-01-13 2:48 ` [PATCH 4/5] Abstract assembler lookup Paul Davies
2007-01-13 2:48 ` [PATCH 5/5] Abstract pgalloc Paul Davies
2007-01-13 2:48 ` [PATCH 1/12] Alternate page table implementation (GPT) Paul Davies
2007-01-13 2:48 ` [PATCH 2/12] Alternate page table implementation cont Paul Davies
2007-01-13 2:48 ` [PATCH 3/12] " Paul Davies
2007-01-13 2:49 ` [PATCH 4/12] " Paul Davies
2007-01-13 2:49 ` [PATCH 5/12] " Paul Davies
2007-01-13 2:49 ` [PATCH 6/12] " Paul Davies
2007-01-13 2:49 ` [PATCH 7/12] " Paul Davies
2007-01-13 2:49 ` [PATCH 8/12] " Paul Davies
2007-01-13 2:49 ` [PATCH 9/12] " Paul Davies
2007-01-13 2:49 ` [PATCH 10/12] " Paul Davies
2007-01-13 2:49 ` [PATCH 11/12] " Paul Davies
2007-01-13 2:49 ` [PATCH 12/12] " Paul Davies
2007-01-13 19:29 ` [PATCH 0/29] Page Table Interface Explanation Peter Zijlstra
2007-01-14 10:06 ` Paul Cameron Davies
2007-01-16 18:49 ` Christoph Lameter
2007-01-18 6:22 ` Paul Cameron Davies
2007-01-16 18:51 ` Christoph Lameter
2007-01-18 6:53 ` Paul Cameron Davies
2007-01-16 19:14 ` Christoph Lameter
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=20070113024601.29682.32487.sendpatchset@weill.orchestra.cse.unsw.EDU.AU \
--to=pauld@gelato.unsw.edu.au \
--cc=linux-mm@kvack.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;
as well as URLs for NNTP newsgroup(s).