> Date: Tue, 20 Jun 2017 11:04:58 +1000
> From: David Gwynne <[email protected]>
>
> now RBT is in userland, we can actually use the API instead of hand
> rolling the copying of the tree topology.
>
> ok?
ok kettenis@
> Index: lib/libkvm/kvm_proc.c
> ===================================================================
> RCS file: /cvs/src/lib/libkvm/kvm_proc.c,v
> retrieving revision 1.58
> diff -u -p -r1.58 kvm_proc.c
> --- lib/libkvm/kvm_proc.c 7 Nov 2016 00:26:33 -0000 1.58
> +++ lib/libkvm/kvm_proc.c 20 Jun 2017 01:03:05 -0000
> @@ -77,6 +77,7 @@
> #include <sys/ioctl.h>
> #include <sys/tty.h>
> #include <stdlib.h>
> +#include <stddef.h>
> #include <string.h>
> #include <unistd.h>
> #include <nlist.h>
> @@ -108,6 +109,9 @@ static int proc_verify(kvm_t *, const st
> static void ps_str_a(struct ps_strings *, u_long *, int *);
> static void ps_str_e(struct ps_strings *, u_long *, int *);
>
> +RBT_PROTOTYPE(uvm_map_addr, vm_map_entry, daddrs.addr_entry,
> + uvm_mapentry_addrcmp);
> +
> static struct vm_anon *
> _kvm_findanon(kvm_t *kd, struct vm_amap *amapp, int slot)
> {
> @@ -166,7 +170,6 @@ _kvm_ureadm(kvm_t *kd, const struct kinf
> struct vm_anon *anonp, anon;
> struct vm_map_entry vme;
> struct vm_page pg;
> - unsigned long rboff;
>
> if (kd->swapspc == 0) {
> kd->swapspc = _kvm_malloc(kd, kd->nbpg);
> @@ -174,26 +177,23 @@ _kvm_ureadm(kvm_t *kd, const struct kinf
> return (NULL);
> }
>
> - rboff = (unsigned long)&vme.daddrs.addr_entry - (unsigned long)&vme;
> -
> /*
> * Look through the address map for the memory object
> * that corresponds to the given virtual address.
> */
> if (KREAD(kd, (u_long)p->p_vmspace, &vm))
> return (NULL);
> - addr = (u_long)&vm.vm_map.addr.rbh_root.rbt_root;
> + addr = (u_long)RBT_ROOT(uvm_map_addr, &vm.vm_map.addr);
> while (1) {
> if (addr == 0)
> return (NULL);
> - addr -= rboff;
> if (KREAD(kd, addr, &vme))
> return (NULL);
>
> if (va < vme.start)
> - addr = (u_long)vme.daddrs.addr_entry.rbt_left;
> + addr = (u_long)RBT_LEFT(uvm_map_addr, &vme);
> else if (va >= vme.end + vme.guard + vme.fspace)
> - addr = (u_long)vme.daddrs.addr_entry.rbt_right;
> + addr = (u_long)RBT_RIGHT(uvm_map_addr, &vme);
> else if (va >= vme.end)
> return (NULL);
> else
> @@ -543,3 +543,13 @@ kvm_ureadm(kvm_t *kd, const struct kinfo
> }
> return (ssize_t)(cp - buf);
> }
> +
> +static inline int
> +uvm_mapentry_addrcmp(const struct vm_map_entry *e1,
> + const struct vm_map_entry *e2)
> +{
> + return e1->start < e2->start ? -1 : e1->start > e2->start;
> +}
> +
> +RBT_GENERATE(uvm_map_addr, vm_map_entry, daddrs.addr_entry,
> + uvm_mapentry_addrcmp);
> Index: lib/libkvm/shlib_version
> ===================================================================
> RCS file: /cvs/src/lib/libkvm/shlib_version,v
> retrieving revision 1.19
> diff -u -p -r1.19 shlib_version
> --- lib/libkvm/shlib_version 2 Oct 2016 23:11:55 -0000 1.19
> +++ lib/libkvm/shlib_version 20 Jun 2017 01:03:05 -0000
> @@ -1,2 +1,2 @@
> major=16
> -minor=2
> +minor=3
> Index: usr.sbin/procmap/procmap.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/procmap/procmap.c,v
> retrieving revision 1.63
> diff -u -p -r1.63 procmap.c
> --- usr.sbin/procmap/procmap.c 16 Sep 2016 04:45:35 -0000 1.63
> +++ usr.sbin/procmap/procmap.c 20 Jun 2017 01:03:05 -0000
> @@ -580,10 +580,10 @@ load_vm_map_entries(kvm_t *kd, struct vm
>
> /* RBTs point at rb_entries inside nodes */
> ld = load_vm_map_entries(kd, RBT_LEFT(uvm_map_addr, result), result);
> - result->daddrs.addr_entry.rbt_left = &ld->daddrs.addr_entry;
> + RBT_SET_LEFT(uvm_map_addr, result, ld);
> ld = load_vm_map_entries(kd, RBT_RIGHT(uvm_map_addr, result), result);
> - result->daddrs.addr_entry.rbt_right = &ld->daddrs.addr_entry;
> - result->daddrs.addr_entry.rbt_parent = &parent->daddrs.addr_entry;
> + RBT_SET_RIGHT(uvm_map_addr, result, ld);
> + RBT_SET_PARENT(uvm_map_addr, result, parent);
>
> return result;
> }
>
>