summaryrefslogtreecommitdiffstats
path: root/sys/i386/include/pmap.h
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1996-09-08 16:57:53 +0000
committerdyson <dyson@FreeBSD.org>1996-09-08 16:57:53 +0000
commit6ba270257af91a5aaf788d6e7ccb28acf3ad9e3f (patch)
tree394c6f62b7590c92ba4fde4385637bf0bce8b7c8 /sys/i386/include/pmap.h
parent21e98ea815702e6c7800e081e0b03aad2f670360 (diff)
downloadFreeBSD-src-6ba270257af91a5aaf788d6e7ccb28acf3ad9e3f.zip
FreeBSD-src-6ba270257af91a5aaf788d6e7ccb28acf3ad9e3f.tar.gz
Improve the scalability of certain pmap operations.
Diffstat (limited to 'sys/i386/include/pmap.h')
-rw-r--r--sys/i386/include/pmap.h30
1 files changed, 24 insertions, 6 deletions
diff --git a/sys/i386/include/pmap.h b/sys/i386/include/pmap.h
index 64b682c..2c4e469 100644
--- a/sys/i386/include/pmap.h
+++ b/sys/i386/include/pmap.h
@@ -42,12 +42,13 @@
*
* from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90
* from: @(#)pmap.h 7.4 (Berkeley) 5/12/91
- * $Id: pmap.h,v 1.41 1996/07/27 03:23:32 dyson Exp $
+ * $Id: pmap.h,v 1.42 1996/07/30 03:08:57 dyson Exp $
*/
#ifndef _MACHINE_PMAP_H_
#define _MACHINE_PMAP_H_
+
/*
* Page-directory and page-table entires follow this format, with a few
* of the fields not present here and there, depending on a lot of things.
@@ -113,6 +114,9 @@
#define ISA_HOLE_LENGTH (0x100000-ISA_HOLE_START)
#ifndef LOCORE
+
+#include <sys/queue.h>
+
typedef unsigned int *pd_entry_t;
typedef unsigned int *pt_entry_t;
@@ -158,33 +162,47 @@ pmap_kextract(vm_offset_t va)
}
#endif
+struct vm_page;
+
/*
* Pmap stuff
*/
+struct pv_entry;
+typedef struct {
+ int pv_list_count;
+ struct vm_page *pv_vm_page;
+ TAILQ_HEAD(,pv_entry) pv_list;
+} pv_table_t;
struct pmap {
pd_entry_t *pm_pdir; /* KVA of page directory */
vm_object_t pm_pteobj; /* Container for pte's */
- short pm_dref; /* page directory ref count */
- short pm_count; /* pmap reference count */
+ TAILQ_HEAD(,pv_entry) pm_pvlist; /* list of mappings in pmap */
+ int pm_count; /* reference count */
+ int pm_flags; /* pmap flags */
struct pmap_statistics pm_stats; /* pmap statistics */
- struct vm_map *pm_map; /* map that owns this pmap */
+ struct vm_page *pm_ptphint; /* pmap ptp hint */
};
+#define PM_FLAG_LOCKED 0x1
+#define PM_FLAG_WANTED 0x2
+
typedef struct pmap *pmap_t;
#ifdef KERNEL
extern pmap_t kernel_pmap;
#endif
+
/*
* For each vm_page_t, there is a list of all currently valid virtual
* mappings of that page. An entry is a pv_entry_t, the list is pv_table.
*/
typedef struct pv_entry {
- struct pv_entry *pv_next; /* next pv_entry */
pmap_t pv_pmap; /* pmap where mapping lies */
vm_offset_t pv_va; /* virtual address for mapping */
+ TAILQ_ENTRY(pv_entry) pv_list;
+ TAILQ_ENTRY(pv_entry) pv_plist;
vm_page_t pv_ptem; /* VM page for pte */
} *pv_entry_t;
@@ -200,7 +218,7 @@ extern pt_entry_t *CMAP1;
extern vm_offset_t avail_end;
extern vm_offset_t avail_start;
extern vm_offset_t phys_avail[];
-extern pv_entry_t *pv_table; /* array of entries, one per page */
+pv_table_t *pv_table;
extern vm_offset_t virtual_avail;
extern vm_offset_t virtual_end;
OpenPOWER on IntegriCloud