> Date: Tue, 20 Jun 2017 11:04:58 +1000
> From: David Gwynne <da...@gwynne.id.au>
> 
> 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;
>  }
> 
> 

Reply via email to