From owner-p4-projects@FreeBSD.ORG Fri Jul 11 03:41:53 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8F08F1065674; Fri, 11 Jul 2008 03:41:53 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4B193106566C for ; Fri, 11 Jul 2008 03:41:53 +0000 (UTC) (envelope-from mayur@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 3C6278FC17 for ; Fri, 11 Jul 2008 03:41:53 +0000 (UTC) (envelope-from mayur@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m6B3frQC067180 for ; Fri, 11 Jul 2008 03:41:53 GMT (envelope-from mayur@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m6B3fqIu067178 for perforce@freebsd.org; Fri, 11 Jul 2008 03:41:52 GMT (envelope-from mayur@FreeBSD.org) Date: Fri, 11 Jul 2008 03:41:52 GMT Message-Id: <200807110341.m6B3fqIu067178@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to mayur@FreeBSD.org using -f From: Mayur Shardul To: Perforce Change Reviews Cc: Subject: PERFORCE change 145048 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Jul 2008 03:41:53 -0000 http://perforce.freebsd.org/chv.cgi?CH=145048 Change 145048 by mayur@mayur_freebsd_vm on 2008/07/11 03:41:35 radix tree integrated in the kernel. Memory for nodes is preallocated at the boot time. Affected files ... .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/conf/files#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_object.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_object.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_page.c#2 edit Differences ... ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/conf/files#2 (text+ko) ==== @@ -2194,6 +2194,7 @@ vm/vm_unix.c standard vm/vm_zeroidle.c standard vm/vnode_pager.c standard +vm/radix_tree.c standard xdr/xdr.c optional krpc | nfslockd xdr/xdr_array.c optional krpc | nfslockd xdr/xdr_mbuf.c optional krpc | nfslockd ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_object.c#2 (text+ko) ==== @@ -216,6 +216,11 @@ TAILQ_INIT(&object->memq); LIST_INIT(&object->shadow_head); + object->rtree.rt_bits_per_level = 4; + object->rtree.rt_height = 0; + object->rtree.rt_root = NULL; + object->rtree.rt_max_height = (8*sizeof(rtidx_t))/4; + object->rtree.rt_max_index = ~((rtidx_t)0); object->root = NULL; object->type = type; object->size = size; @@ -691,6 +696,7 @@ #endif if (__predict_false(object->cache != NULL)) vm_page_cache_free(object, 0, 0); + radix_tree_shrink(&object->rtree); /* * Let the pager know object is dead. ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_object.h#2 (text+ko) ==== @@ -67,6 +67,8 @@ #ifndef _VM_OBJECT_ #define _VM_OBJECT_ +#include "radix_tree.h" + #include #include #include @@ -88,6 +90,7 @@ LIST_ENTRY(vm_object) shadow_list; /* chain of shadow objects */ TAILQ_HEAD(, vm_page) memq; /* list of resident pages */ vm_page_t root; /* root of the resident page splay tree */ + struct radix_tree rtree; /* root of the resident page radix tree */ vm_pindex_t size; /* Object size */ int generation; /* generation ID */ int ref_count; /* How many refs?? */ ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_page.c#2 (text+ko) ==== @@ -137,6 +137,9 @@ struct mtx vm_page_queue_mtx; struct mtx vm_page_queue_free_mtx; +extern SLIST_HEAD(, radix_node) res_rnodes_head; +extern int rnode_size; + vm_page_t vm_page_array = 0; int vm_page_array_size = 0; long first_page = 0; @@ -269,6 +272,24 @@ vm_page_queues[PQ_ACTIVE].cnt = &cnt.v_active_count; vm_page_queues[PQ_HOLD].cnt = &cnt.v_active_count; + /* reserve memory for radix nodes. */ + rnode_size = sizeof(struct radix_node) + + (sizeof(void *) * (0xf + 1)); + new_end = end - (RESERVED_NODE_COUNT * rnode_size); + new_end = trunc_page(new_end); + mapped = pmap_map(&vaddr, new_end, end, + VM_PROT_READ | VM_PROT_WRITE); + bzero((void *)mapped, end - new_end); + printf("Total number of pages reserved for radix nodes : %u\n", + (end - new_end)/PAGE_SIZE); + end = new_end; + for(i = 0; i < RESERVED_NODE_COUNT; i++) + { + SLIST_INSERT_HEAD(&res_rnodes_head, (struct radix_node *)mapped, + next); + mapped += rnode_size; + } + /* * Allocate memory for use when boot strapping the kernel memory * allocator. @@ -672,6 +693,7 @@ } object->root = m; object->generation++; + radix_tree_insert(pindex,&object->rtree,m); /* * show that the object has one more resident page. @@ -730,6 +752,7 @@ root->right = m->right; } object->root = root; + radix_tree_remove(m->pindex,&object->rtree); TAILQ_REMOVE(&object->memq, m, listq); /* @@ -1648,6 +1671,7 @@ TAILQ_REMOVE(&object->memq, m, listq); object->resident_page_count--; object->generation++; + radix_tree_remove(m->pindex,&object->rtree); /* * Insert the page into the object's collection of cached pages