the current tracking of free static map entries is done as hand
rolled list manipulations using pointers in an rb_entry. it's really
confusing to read.

since its simple list manipulations, this replaces the hand rolled
code with an SLIST.

ok?

Index: uvm.h
===================================================================
RCS file: /cvs/src/sys/uvm/uvm.h,v
retrieving revision 1.60
diff -u -p -r1.60 uvm.h
--- uvm.h       8 Oct 2015 15:58:38 -0000       1.60
+++ uvm.h       8 Aug 2016 11:53:57 -0000
@@ -69,7 +69,7 @@ struct uvm {
        struct mutex aiodoned_lock;
 
        /* static kernel map entry pool */
-       vm_map_entry_t kentry_free;     /* free page pool */
+       SLIST_HEAD(, vm_map_entry) kentry_free; /* free page pool */
 
        /* aio_done is locked by uvm.aiodoned_lock. */
        TAILQ_HEAD(, buf) aio_done;             /* done async i/o reqs */
Index: uvm_map.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_map.c,v
retrieving revision 1.219
diff -u -p -r1.219 uvm_map.c
--- uvm_map.c   30 Jul 2016 16:43:44 -0000      1.219
+++ uvm_map.c   8 Aug 2016 11:53:57 -0000
@@ -1669,25 +1669,23 @@ uvm_mapent_alloc(struct vm_map *map, int
 
        if (map->flags & VM_MAP_INTRSAFE || cold) {
                mtx_enter(&uvm_kmapent_mtx);
-               me = uvm.kentry_free;
-               if (me == NULL) {
+               if (SLIST_EMPTY(&uvm.kentry_free)) {
                        ne = km_alloc(PAGE_SIZE, &kv_page, &kp_dirty,
                            &kd_nowait);
                        if (ne == NULL)
                                panic("uvm_mapent_alloc: cannot allocate map "
                                    "entry");
-                       for (i = 0;
-                           i < PAGE_SIZE / sizeof(struct vm_map_entry) - 1;
-                           i++)
-                               RB_LEFT(&ne[i], daddrs.addr_entry) = &ne[i + 1];
-                       RB_LEFT(&ne[i], daddrs.addr_entry) = NULL;
-                       me = ne;
+                       for (i = 0; i < PAGE_SIZE / sizeof(*ne); i++) {
+                               SLIST_INSERT_HEAD(&uvm.kentry_free,
+                                   &ne[i], daddrs.addr_kentry);
+                       }
                        if (ratecheck(&uvm_kmapent_last_warn_time,
                            &uvm_kmapent_warn_rate))
                                printf("uvm_mapent_alloc: out of static "
                                    "map entries\n");
                }
-               uvm.kentry_free = RB_LEFT(me, daddrs.addr_entry);
+               me = SLIST_FIRST(&uvm.kentry_free);
+               SLIST_REMOVE_HEAD(&uvm.kentry_free, daddrs.addr_kentry);
                uvmexp.kmapent++;
                mtx_leave(&uvm_kmapent_mtx);
                me->flags = UVM_MAP_STATIC;
@@ -1725,8 +1723,7 @@ uvm_mapent_free(struct vm_map_entry *me)
 {
        if (me->flags & UVM_MAP_STATIC) {
                mtx_enter(&uvm_kmapent_mtx);
-               RB_LEFT(me, daddrs.addr_entry) = uvm.kentry_free;
-               uvm.kentry_free = me;
+               SLIST_INSERT_HEAD(&uvm.kentry_free, me, daddrs.addr_kentry);
                uvmexp.kmapent--;
                mtx_leave(&uvm_kmapent_mtx);
        } else if (me->flags & UVM_MAP_KMEM) {
@@ -2795,11 +2792,10 @@ uvm_map_init(void)
 
        /* now set up static pool of kernel map entries ... */
        mtx_init(&uvm_kmapent_mtx, IPL_VM);
-       uvm.kentry_free = NULL;
+       SLIST_INIT(&uvm.kentry_free);
        for (lcv = 0 ; lcv < MAX_KMAPENT ; lcv++) {
-               RB_LEFT(&kernel_map_entry[lcv], daddrs.addr_entry) =
-                   uvm.kentry_free;
-               uvm.kentry_free = &kernel_map_entry[lcv];
+               SLIST_INSERT_HEAD(&uvm.kentry_free,
+                   &kernel_map_entry[lcv], daddrs.addr_kentry);
        }
 
        /* initialize the map-related pools. */
Index: uvm_map.h
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_map.h,v
retrieving revision 1.55
diff -u -p -r1.55 uvm_map.h
--- uvm_map.h   9 Sep 2015 23:33:37 -0000       1.55
+++ uvm_map.h   8 Aug 2016 11:53:57 -0000
@@ -161,6 +161,7 @@ union vm_map_object {
 struct vm_map_entry {
        union {
                RB_ENTRY(vm_map_entry)  addr_entry; /* address tree */
+               SLIST_ENTRY(vm_map_entry) addr_kentry;
        } daddrs;
 
        union {

Reply via email to