summaryrefslogtreecommitdiff
path: root/mach-defpager/priv.h
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2014-03-15 14:06:15 +0100
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-03-25 08:55:55 +0100
commit07e46eb2e25583f0f3e06342f0c854769b353b10 (patch)
tree45f4d44f2b23064f64da6df2a4d47b79a027ed64 /mach-defpager/priv.h
parent6d5511668545d00da4e3e5dd142b4f082c76b083 (diff)
mach-defpager: replace the magic typecast with a hash table
Previously, the mach-defpager used a "magic typecast" for object lookups. It renamed the port to the address of the associated object, and upon receiving a message it would cast the port name back to a pointer. While this might seem like an optimization, it actually makes the port handling in the kernel less efficient. Ports with small continuous names are stored in an array, while other ports get spilled in a splay tree. Replace the linked list of default_port_t objects with a hash table. Do not rename the ports, rather use the hash table to lookup objects associated with ports. * mach-defpager/default_pager.c (struct pager_port): Replace queue with hash table, remove count, move type declaration to priv.h. (pager_port_list_init): Adjust accordingly. (pager_port_list_insert): Likewise. (pager_port_list_delete): Likewise. (destroy_paging_partition): Replace queue_iterate with HURD_IHASH_ITERATE. (S_default_pager_objects): Likewise. (S_default_pager_object_pages): Likewise. (seqnos_memory_object_create): Do not rename the port but store it in the hash table. (S_default_pager_object_create): Likewise. * mach-defpager/priv.h (struct dstruct): Add fast-removal pointer. (pnameof): Remove obsolete macro definition. (dnameof): Likewise. * mach-defpager/mig-decls.h (begin_using_default_pager): Replace the magic typecast with a hash table lookup. * mach-defpager/Makefile (HURDLIBS): Add ihash.
Diffstat (limited to 'mach-defpager/priv.h')
-rw-r--r--mach-defpager/priv.h20
1 files changed, 16 insertions, 4 deletions
diff --git a/mach-defpager/priv.h b/mach-defpager/priv.h
index 20711b2c..36845657 100644
--- a/mach-defpager/priv.h
+++ b/mach-defpager/priv.h
@@ -29,6 +29,7 @@
#include <mach.h>
#include <queue.h>
+#include <hurd/ihash.h>
/*
* Bitmap allocation.
@@ -150,6 +151,7 @@ typedef struct dpager *dpager_t;
* Mapping between pager port and paging object.
*/
struct dstruct {
+ hurd_ihash_locp_t htable_locp; /* for the ihash table */
queue_chain_t links; /* Link in pager-port list */
pthread_mutex_t lock; /* Lock for the structure */
@@ -180,9 +182,19 @@ struct dstruct {
typedef struct dstruct * default_pager_t;
#define DEFAULT_PAGER_NULL ((default_pager_t)0)
-/* given a data structure return a good port-name to associate it to */
-#define pnameof(_x_) (((vm_offset_t) (_x_)) + 1)
-/* reverse, assumes no-odd-pointers */
-#define dnameof(_x_) (((vm_offset_t) (_x_)) & ~1)
+/*
+ * List of all pagers. A specific pager is
+ * found directly via its port, this list is
+ * only used for monitoring purposes by the
+ * default_pager_object* calls
+ */
+struct pager_port {
+ struct hurd_ihash htable;
+ pthread_mutex_t lock;
+ queue_head_t leak_queue;
+};
+
+/* The list of pagers. */
+extern struct pager_port all_pagers;
#endif /* __MACH_DEFPAGER_PRIV_H__ */