linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Paul Davies <pauld@gelato.unsw.edu.au>
To: linux-mm@kvack.org
Cc: Paul Davies <pauld@gelato.unsw.edu.au>
Subject: [PATCH 3/12] Alternate page table implementation cont...
Date: Sat, 13 Jan 2007 13:48:56 +1100	[thread overview]
Message-ID: <20070113024856.29682.96009.sendpatchset@weill.orchestra.cse.unsw.EDU.AU> (raw)
In-Reply-To: <20070113024540.29682.27024.sendpatchset@weill.orchestra.cse.unsw.EDU.AU>

PATCH GPT 03
 * Adds the GPT as a page table type
 * include the GPT in include/linux/pt.h
 * Adds some of the GPT implementation in pt-gpt.h
 and include it in pt.h

Signed-Off-By: Paul Davies <pauld@gelato.unsw.edu.au>

---

 gpt.h     |  120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 pt-gpt.h  |  115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 pt-type.h |    5 ++
 pt.h      |    6 ++-
 4 files changed, 245 insertions(+), 1 deletion(-)
Index: linux-2.6.20-rc4/include/linux/pt-type.h
===================================================================
--- linux-2.6.20-rc4.orig/include/linux/pt-type.h	2007-01-11 16:46:47.518747000 +1100
+++ linux-2.6.20-rc4/include/linux/pt-type.h	2007-01-11 16:58:19.345390000 +1100
@@ -5,4 +5,9 @@
 typedef struct { pgd_t *pgd; } pt_t;
 #endif
 
+#ifdef CONFIG_GPT
+#include <linux/gpt.h>
+typedef gpt_t pt_t;
+#endif
+
 #endif
Index: linux-2.6.20-rc4/include/linux/pt-gpt.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.20-rc4/include/linux/pt-gpt.h	2007-01-11 16:58:19.345390000 +1100
@@ -0,0 +1,115 @@
+#ifndef _LINUX_PT_GPT_H
+#define _LINUX_PT_GPT_H
+
+#include <asm/pgtable.h>
+
+#include <linux/hugetlb.h>
+#include <linux/gpt.h>
+
+typedef struct pt_struct { } pt_path_t;
+
+static inline int create_user_page_table(struct mm_struct *mm)
+{
+	mm->page_table = gpt_node_invalid_init();
+
+	return 0;
+}
+
+static inline void destroy_user_page_table(struct mm_struct *mm)
+{
+
+}
+
+static inline pte_t *lookup_page_table(struct mm_struct *mm,
+		unsigned long address, pt_path_t *pt_path)
+{
+	gpt_thunk_t thunk;
+
+    thunk.key = gpt_key_init(extract_key(address), GPT_KEY_LENGTH_MAX);
+    thunk.node_p = &(mm->page_table);
+    if(!gpt_node_inspect_find(&thunk) ||
+       (gpt_node_type(*thunk.node_p) != GPT_NODE_TYPE_LEAF)) {
+		return NULL;
+    }
+    return gpt_node_leaf_read_ptep(thunk.node_p);
+}
+
+static inline pte_t *build_page_table(struct mm_struct *mm,
+		unsigned long address, pt_path_t *pt_path)
+{
+	int is_root;
+	pte_t pte;
+	gpt_thunk_t update_thunk;
+	gpt_node_t leaf;
+
+	update_thunk.key = gpt_key_init(extract_key(address),
+                                        GPT_KEY_LENGTH_MAX);
+	pte_clear(mm, address, &pte); /* Should set coverage/page-size here. */
+	leaf = gpt_node_leaf_init(pte);
+
+	update_thunk.node_p = (gpt_node_t *)&mm->page_table;
+	is_root = gpt_node_update_find(&update_thunk);
+	if(gptLevelRestructureInsert(is_root, &update_thunk) < GPT_OK) {
+		return gpt_node_leaf_read_ptep(update_thunk.node_p);
+	}
+	if(gpt_node_insert(leaf, update_thunk) < GPT_OK) {
+		return NULL;
+    }
+	gpt_node_internal_traverse(&update_thunk);
+	return gpt_node_leaf_read_ptep(update_thunk.node_p);
+}
+
+#define INIT_PT
+
+#define lock_pte(mm, pt_path) \
+	({ spin_lock(&mm->page_table_lock);})
+
+/*
+ * Unlocks the ptes notionally pointed to by the
+ * page table path.
+ */
+#define unlock_pte(mm, pt_path) \
+	({ spin_unlock(&mm->page_table_lock);})
+
+/*
+ * Looks up a page table from a saved path.  It also
+ * locks the page table.
+ */
+#define lookup_page_table_lock(mm, pt_path, address) \
+	({ pte_t *__pte = lookup_page_table(mm, address, NULL);\
+	   spin_lock(&mm->page_table_lock); \
+	   __pte; })
+
+/*
+ * Check that the original pte hasn't change.
+ */
+
+#define atomic_pte_same(mm, pte, orig_pte, pt_path) \
+({ \
+	int __same; \
+	spin_lock(&mm->page_table_lock); \
+	__same = pte_same(*pte, orig_pte); \
+	spin_unlock(&mm->page_table_lock); \
+	__same; \
+})
+
+#define is_huge_page(mm, address, pt_path, flags, page) \
+({ \
+	int __ret=0; \
+  	__ret; \
+})
+
+#define set_pt_path(pt_path, ppt_path) ((pt_path) = *(ppt_path))
+
+#define CLUSTER_SIZE	min(32*PAGE_SIZE, 32*PAGE_SIZE)
+
+static inline pte_t *lookup_gate_area(struct mm_struct *mm,
+			unsigned long pg)
+{
+	panic("Implement\n");
+	return NULL;
+}
+
+#define vma_optimization do {} while(0)
+
+#endif
Index: linux-2.6.20-rc4/include/linux/pt.h
===================================================================
--- linux-2.6.20-rc4.orig/include/linux/pt.h	2007-01-11 16:46:48.246747000 +1100
+++ linux-2.6.20-rc4/include/linux/pt.h	2007-01-11 16:58:19.345390000 +1100
@@ -1,6 +1,10 @@
 #ifndef _LINUX_PT_H
 #define _LINUX_PT_H
 
+#ifdef CONFIG_GPT
+#include <linux/pt-gpt.h>
+#endif
+
 #include <linux/swap.h>
 
 #ifdef CONFIG_PT_DEFAULT
@@ -48,7 +52,7 @@
 		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);
+		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,
Index: linux-2.6.20-rc4/include/linux/gpt.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.20-rc4/include/linux/gpt.h	2007-01-11 16:58:19.349390000 +1100
@@ -0,0 +1,120 @@
+/**
+ *  include/linux/gpt.h
+ *
+ *  Copyright (C) 2005 - 2006 University of New South Wales, Australia
+ *      Adam 'WeirdArms' Wiggins <awiggins@cse.unsw.edu.au>,
+ *      Paul Davies <pauld@cse.unsw.edu.au>.
+ */
+
+#ifndef _LINUX_GPT_H
+#define _LINUX_GPT_H
+
+#include <asm/pgtable-gpt.h>
+
+#define GPT_SPECIAL 1
+#define GPT_NORMAL  2
+
+#define GPT_ORDER (PAGE_SHIFT - GPT_NODE_LOG2BYTES) // Main levels page-sized.
+
+#define GPT_KEY_VALUE_MAX ((gpt_key_value_t)((1 << GPT_KEY_LENGTH_MAX) - 1))
+
+typedef gpt_node_t gpt_t;
+
+typedef struct {
+	gpt_key_t key;
+	gpt_node_t *node_p;
+} gpt_thunk_t;
+
+typedef enum {GPT_TRAVERSED_FULL = 0, GPT_TRAVERSED_GUARD,
+              GPT_TRAVERSED_MISMATCH, GPT_TRAVERSED_NONE
+} gpt_traversed_t;
+
+#define GPT_ITERATE_INVALIDS  (1 << 0)
+#define GPT_ITERATE_LEAVES    (1 << 1)
+#define GPT_ITERATE_INTERNALS (1 << 2)
+
+#define GPT_ITERATOR_STACK_SIZE (((GPT_KEY_LENGTH_MAX - 1)/GPT_ORDER) + 1)
+
+typedef struct {
+	int8_t flags, coverage, depth, finished;
+	gpt_key_value_t start, limit;
+	gpt_key_t key;
+	gpt_node_t* node_p;
+	gpt_node_t* stack[GPT_ITERATOR_STACK_SIZE];
+} gpt_iterator_t;
+
+/****************
+* Return codes. *
+****************/
+
+#define GPT_OK            0
+#define GPT_FAILED       -1
+#define GPT_INVALID      -2
+#define GPT_NOT_FOUND    -3
+#define GPT_OCCUPIED     -4
+#define GPT_OVERLAP      -5
+#define GPT_ALLOC_FAILED -6
+
+static inline unsigned long extract_key(unsigned long address)
+{
+	address >>= PAGE_SHIFT;
+
+	return address;
+}
+
+static inline unsigned long get_real_address(unsigned long pos_value)
+{
+	pos_value <<= PAGE_SHIFT;
+
+	return pos_value;
+}
+
+int gpt_node_inspect_find(gpt_thunk_t* inspect_thunk_u);
+int gpt_node_update_find(gpt_thunk_t* update_thunk_u);
+int gpt_node_delete(int is_root, gpt_thunk_t update_thunk);
+int gpt_node_insert(gpt_node_t new_node, gpt_thunk_t update_thunk);
+gpt_traversed_t gpt_node_internal_traverse(gpt_thunk_t* thunk_u);
+void gpt_node_restructure_delete(int is_root, int8_t update_coverage,
+                                 gpt_node_t* update_node_u);
+int gpt_node_restructure_insert(int is_root, gpt_thunk_t* update_thunk_u);
+
+gpt_node_t* gpt_level_allocate(int8_t order);
+void gpt_level_deallocate(gpt_node_t* level, int8_t order);
+
+int gpt_iterator_inspect(gpt_iterator_t* iterator, gpt_key_t* key_r,
+                         gpt_node_t** node_p_r);
+
+gpt_node_t gpt_node_get(gpt_node_t* node_p);
+void gpt_node_set(gpt_node_t* node_p, gpt_node_t node);
+int gpt_node_type(gpt_node_t node);
+int gpt_node_valid(gpt_node_t node);
+gpt_node_t gpt_node_invalid_init(void);
+gpt_node_t gpt_node_leaf_init(pte_t pte);
+int8_t gpt_node_leaf_read_coverage(gpt_node_t node);
+pte_t* gpt_node_leaf_read_ptep(gpt_node_t* node_p);
+gpt_node_t gpt_node_internal_init(gpt_node_t* level, int8_t order);
+gpt_node_t gpt_node_internal_dec_children(gpt_node_t node);
+gpt_node_t gpt_node_internal_inc_children(gpt_node_t node);
+gpt_key_value_t gpt_node_internal_count_children(gpt_node_t node);
+gpt_key_value_t gpt_node_internal_first_child(gpt_node_t node);
+int gpt_node_internal_elongation(gpt_node_t node);
+gpt_node_t* gpt_node_internal_read_ptr(gpt_node_t node);
+int8_t gpt_node_internal_read_order(gpt_node_t node);
+gpt_node_t gpt_node_init_guard(gpt_node_t node, gpt_key_t guard);
+gpt_key_t gpt_node_read_guard(gpt_node_t node);
+
+int gptLevelRestructureInsert(int is_root, gpt_thunk_t* update_thunk_u);
+
+int8_t gptNodeReplication(gpt_node_t node, int8_t coverage);
+
+gpt_key_t gpt_key_null(void);
+gpt_key_t gpt_key_init(gpt_key_value_t value, int8_t length);
+gpt_key_value_t gpt_key_read_value(gpt_key_t key);
+int8_t gpt_key_read_length(gpt_key_t key);
+
+void gptKeyCutMSB(int8_t length_msb, gpt_key_t* key_u, gpt_key_t* key_msb_r);
+void gptKeyCutLSB(int8_t length_lsb, gpt_key_t* key_u, gpt_key_t* key_lsb_r);
+void gptKeysMergeLSB(gpt_key_t key_msb, gpt_key_t* key_u);
+int8_t gptKeysCompareStripPrefix(gpt_key_t* key1_u, gpt_key_t* key2_u);
+
+#endif /* !_LINUX_GPT_H */

--
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>

  parent reply	other threads:[~2007-01-13  2:48 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 ` [PATCH 4/29] Introduce Page Table Interface (PTI) Paul Davies
2007-01-16 19:02   ` 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 ` Paul Davies [this message]
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=20070113024856.29682.96009.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