vm_radix.h revision 238269
139211Sgibbs/*
239211Sgibbs * Copyright (c) 2011 Jeffrey Roberson <jeff@freebsd.org>
339211Sgibbs * Copyright (c) 2008 Mayur Shardul <mayur.shardul@gmail.com>
439211Sgibbs * All rights reserved.
539211Sgibbs *
639211Sgibbs * Redistribution and use in source and binary forms, with or without
739211Sgibbs * modification, are permitted provided that the following conditions
839211Sgibbs * are met:
939211Sgibbs * 1. Redistributions of source code must retain the above copyright
1039211Sgibbs *    notice, this list of conditions and the following disclaimer.
1139211Sgibbs * 2. Redistributions in binary form must reproduce the above copyright
1239211Sgibbs *    notice, this list of conditions and the following disclaimer in the
1339211Sgibbs *    documentation and/or other materials provided with the distribution.
1439211Sgibbs *
1539211Sgibbs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1639211Sgibbs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1739211Sgibbs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1839211Sgibbs * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1939211Sgibbs * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2039211Sgibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2139211Sgibbs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2239211Sgibbs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2339211Sgibbs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2439211Sgibbs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2539211Sgibbs * SUCH DAMAGE.
2639211Sgibbs *
2739211Sgibbs */
2839211Sgibbs
2983551Sdillon#ifndef _VM_RADIX_H_
3083551Sdillon#define _VM_RADIX_H_
3183551Sdillon
3239211Sgibbs/*
3339211Sgibbs * Radix tree root.  The height and pointer are set together to permit
3439211Sgibbs * coherent lookups while the root is modified.
35110998Sphk */
3681133Stmmstruct vm_radix {
3739211Sgibbs	uintptr_t	rt_root;		/* root + height */
3839451Sken};
3939211Sgibbs
4081133Stmm#ifdef _KERNEL
4181133Stmm
4239211Sgibbsvoid	vm_radix_init(void);
4339211Sgibbsint 	vm_radix_insert(struct vm_radix *, vm_pindex_t, void *);
4439211Sgibbsvoid	*vm_radix_lookup(struct vm_radix *, vm_pindex_t);
4581133Stmmint	vm_radix_lookupn(struct vm_radix *, vm_pindex_t, vm_pindex_t, void **,
4681133Stmm	    int, vm_pindex_t *, u_int *);
47121064Sbdevoid	*vm_radix_lookup_le(struct vm_radix *, vm_pindex_t);
4839211Sgibbsvoid	vm_radix_reclaim_allnodes(struct vm_radix *);
4939211Sgibbsvoid	vm_radix_remove(struct vm_radix *, vm_pindex_t);
5039211Sgibbs
51113710Sphk/*
52113710Sphk * Look up any entry at a position greater or equal to index.
53113710Sphk */
54113710Sphkstatic inline void *
55113710Sphkvm_radix_lookup_ge(struct vm_radix *rtree, vm_pindex_t index)
56113710Sphk{
57113710Sphk        void *val;
58113710Sphk	u_int dummy;
5981133Stmm
6081133Stmm        if (vm_radix_lookupn(rtree, index, 0, &val, 1, &index, &dummy))
6181133Stmm                return (val);
6281883Sken        return (NULL);
6381883Sken}
6481133Stmm
6581133Stmmstatic inline void *
6639211Sgibbsvm_radix_last(struct vm_radix *rtree)
6739211Sgibbs{
6839211Sgibbs
6939211Sgibbs	return vm_radix_lookup_le(rtree, 0);
7039211Sgibbs}
7139211Sgibbs
7239211Sgibbsstatic inline void *
7339211Sgibbsvm_radix_first(struct vm_radix *rtree)
7439211Sgibbs{
7539211Sgibbs
7639211Sgibbs	return vm_radix_lookup_ge(rtree, 0);
7739211Sgibbs}
7839211Sgibbs
7939211Sgibbsstatic inline void *
8039211Sgibbsvm_radix_next(struct vm_radix *rtree, vm_pindex_t index)
8139211Sgibbs{
8239211Sgibbs
8339211Sgibbs	if (index == -1)
8439211Sgibbs		return (NULL);
8539211Sgibbs	return vm_radix_lookup_ge(rtree, index + 1);
8639211Sgibbs}
8739211Sgibbs
8839211Sgibbsstatic inline void *
8939211Sgibbsvm_radix_prev(struct vm_radix *rtree, vm_pindex_t index)
9039211Sgibbs{
9139211Sgibbs
9239211Sgibbs	if (index == 0)
9381133Stmm		return (NULL);
9481133Stmm	return vm_radix_lookup_le(rtree, index - 1);
9581133Stmm}
9681133Stmm
9781133Stmm#endif /* _KERNEL */
9881133Stmm#endif /* !_VM_RADIX_H_ */
9981133Stmm