On Mon, 2002-10-28 at 16:37, John Baldwin wrote:
> 
> On 28-Oct-2002 Joe Marcus Clarke wrote:
> > On Mon, 2002-10-28 at 16:27, John Baldwin wrote:
> >> 
> >> On 28-Oct-2002 Terry Lambert wrote:
> >> > John Baldwin wrote:
> >> >> I mean, do you know what libgtop is used for?  It's used to draw
> >> >> little applets that display load averages and other silly system
> >> >> monitor stuff in small spaces in GUI's.  It seems to work quite
> >> >> happily w/o any inode numbers or dev_t's for non-UFS filesystems.
> >> >> I just don't see why some little graphical applet displaying a load
> >> >> average or disk usage or ethernet device usage needs the inode
> >> >> number and dev_t of vnode's in the kernel.  I mean, geez.
> >> > 
> >> > To build little applets that activate a flashing red light when
> >> > certain files are written?
> >> 
> >> Why do you need the inode number to do that.  Just kqueue on the
> >> file itself using a regular fd, and in that case you can stat(2)
> >> the file if you really need the i-node number.  You don't need
> >> to use libkvm to actually go read the kernel to find this info!
> > 
> > You're probably right.  But without waiting to re-architect libgtop, I
> > think the immediate problem needs to be fixed.  Shall I just commit my
> > original patch that uses libkvm?
> 
> Use v_cachedid and v_cachedfs for all VREG vnodes.  Then you don't
> need to even go near v_tag.  This is fewer kvm_read()'s.  If stable
> has the v_cachedid then it should be using that instead of reading
> in UFS inodes as well.

This look okay?

Joe

> 
> -- 
> 
> John Baldwin <[EMAIL PROTECTED]>  <><  http://www.FreeBSD.org/~jhb/
> "Power Users Use the Power to Serve!"  -  http://www.FreeBSD.org/
> 
-- 
PGP Key : http://www.marcuscom.com/pgp.asc
--- procmap.c.orig      Mon Jun 10 17:34:42 2002
+++ procmap.c   Sat Oct 26 01:20:26 2002
@@ -33,7 +33,11 @@
 #include <sys/proc.h>
 #include <sys/resource.h>
 #include <vm/vm_object.h>
+#if (__FreeBSD_version >= 400011)
+#include <vm/vm.h>
+#else
 #include <vm/vm_prot.h>
+#endif
 #include <vm/vm_map.h>
 
 #include <sys/vnode.h>
@@ -91,8 +95,9 @@
        glibtop_map_entry *maps;
 #if defined __FreeBSD__
        struct vnode vnode;
+#if __FreeBSD_version < 500039
        struct inode inode;
-       struct mount mount;
+#endif
 #endif
        int count, i = 0;
        int update = 0;
@@ -114,7 +119,11 @@
        /* Now we get the memory maps. */
 
        if (kvm_read (server->machine.kd,
+#if (__FreeBSD_version >= 500013)
+                     (unsigned long) pinfo [0].ki_vmspace,
+#else
                      (unsigned long) pinfo [0].kp_proc.p_vmspace,
+#endif
                      (char *) &vmspace, sizeof (vmspace)) != sizeof (vmspace))
                glibtop_error_io_r (server, "kvm_read (vmspace)");
 
@@ -244,6 +253,15 @@
                              &vnode, sizeof (vnode)) != sizeof (vnode))
                        glibtop_error_io_r (server, "kvm_read (vnode)");
 
+#if __FreeBSD_version >= 500039
+               switch (vnode.v_type) {
+                   case VREG:
+                       maps [i-1].inode = vnode.v_cachedid;
+                       maps [i-1].device = vnode.v_cachedfs;
+                   default:
+                       continue;
+               }
+#else
                if ((vnode.v_type != VREG) || (vnode.v_tag != VT_UFS) ||
                    !vnode.v_data) continue;
 
@@ -252,13 +270,9 @@
                              &inode, sizeof (inode)) != sizeof (inode))
                        glibtop_error_io_r (server, "kvm_read (inode)");
 
-               if (kvm_read (server->machine.kd,
-                             (unsigned long) vnode.v_mount,
-                             &mount, sizeof (mount)) != sizeof (mount))
-                       glibtop_error_io_r (server, "kvm_read (mount)");
-
                maps [i-1].inode  = inode.i_number;
                maps [i-1].device = inode.i_dev;
+#endif
 #endif
        } while (entry.next != first);
 

Reply via email to