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