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);