Date: Sat, 24 Feb 2001 00:51:42 +0100 From: Thomas Moestl <tmoestl@gmx.net> To: cvs-all@freebsd.org Subject: Re: cvs commit: src/sys/sys conf.h src/sys/vm swap_pager.c vm_swap.c Message-ID: <20010224005142.A2470@crow.dom2ip.de>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
On Fri, Feb 23, 2001 at 05:50:55PM -0500, Robert Watson wrote:
> On Fri, 23 Feb 2001, Bill Fumerola wrote:
> > On Fri, Feb 23, 2001 at 01:49:09PM -0800, Mike Smith wrote:
> > > JFYI, convention for implementing this sort of thing is to have a node
> > > "vm.swapdev_acct" and then pass it an extra OID value which is the index.
> > <aol>
> > yes
> > </aol>
> > speaking as someone who has been spending too much time w/ snmp, it would
> > be really good if all indexed sysctls followed this convention.
> Thomas is generating updated patches that address this concern and
> hopefully we'll get something committed in the next day or two to re-work
> the MIB a bit.
I propose the attached set of patches. They change the old model to a
hierarchy like:
vm.swap.nswapdev: 1
vm.swap.dev.0.flags: 1
vm.swap.dev.0.nblks: 65536
vm.swap.dev.0.used: 8176
vm.swap.dev.0.dev: { major = 116, minor = 0x20001 }
all have fixed ID's, the nodes for devices (vm.swap.dev.0, vm.swap.dev.1
etc) have the ID's 1, 2 and so forth (0 being reserved). There
are some other swap related sysctls in vm, but I wouldn't like to move
those do vm.swap (for compatability reasons). If this is a problem,
I'd rather rename vm.swap.
I'm right now still testing these, but I think they should be ready
tomorrow. swd.diff is for the kernel part, libkvmswd.diff makes libkvm
use the ID's to index the devices (cheaper).
Please comment,
-thomas
[-- Attachment #2 --]
diff -cr sys.swd.orig/vm/vm_param.h sys.swd/vm/vm_param.h
*** sys.swd.orig/vm/vm_param.h Fri Feb 23 23:08:51 2001
--- sys.swd/vm/vm_param.h Sat Feb 24 00:18:25 2001
***************
*** 87,93 ****
#define VM_V_PAGEOUT_FREE_MIN 9 /* cnt.v_pageout_free_min */
#define VM_PAGEOUT_ALGORITHM 10 /* pageout algorithm */
#define VM_SWAPPING_ENABLED 11 /* swapping enabled */
! #define VM_MAXID 12 /* number of valid vm ids */
#define CTL_VM_NAMES { \
{ 0, 0 }, \
--- 87,111 ----
#define VM_V_PAGEOUT_FREE_MIN 9 /* cnt.v_pageout_free_min */
#define VM_PAGEOUT_ALGORITHM 10 /* pageout algorithm */
#define VM_SWAPPING_ENABLED 11 /* swapping enabled */
! #define VM_SWAP 12 /* swap stats */
! #define VM_MAXID 13 /* number of valid vm ids */
!
! /*
! * sysctl vm.swap.* indentifiers.
! */
! #define VM_SWAP_NSWAPDEV 1 /* number of configured dev's */
! #define VM_SWAP_DEV 2 /* node to hold the devices */
!
! /*
! * sysctl vm.swap.dev.* indentifiers VM_SWAP_FIRSRTDEV is the oid of the first
! * swap device, the oid of a swap device being (number + VM_SWAP_FIRSTDEV).
! */
! #define VM_SWAP_DEV_FLAGS 1 /* flags for swap device */
! #define VM_SWAP_DEV_NBLKS 2 /* # of blocks */
! #define VM_SWAP_DEV_USED 3 /* # of blocks in use */
! #define VM_SWAP_DEV_DEV 4 /* udev_t of the device */
!
! #define VM_SWAP_DEV_FIRST 1 /* Node for the first device */
#define CTL_VM_NAMES { \
{ 0, 0 }, \
***************
*** 102,107 ****
--- 120,126 ----
{ "v_pageout_free_min", CTLTYPE_INT}, \
{ "pageout_algorithm", CTLTYPE_INT}, \
{ "swapping_enabled", CTLTYPE_INT},\
+ { "swap", CTLTYPE_NODE},\
}
/*
Only in sys.swd/vm: vm_param.h~
diff -cr sys.swd.orig/vm/vm_swap.c sys.swd/vm/vm_swap.c
*** sys.swd.orig/vm/vm_swap.c Fri Feb 23 23:08:51 2001
--- sys.swd/vm/vm_swap.c Sat Feb 24 00:18:45 2001
***************
*** 55,60 ****
--- 55,61 ----
#include <vm/vm.h>
#include <vm/vm_extern.h>
#include <vm/vm_zone.h>
+ #include <vm/vm_param.h>
#include <vm/swap_pager.h>
/*
***************
*** 70,76 ****
int nswdev = NSWAPDEV;
int vm_swap_size;
static int ncswdev = 0; /* # of configured swap devs */
! SYSCTL_INT(_vm, OID_AUTO, nswapdev, CTLFLAG_RD,
&ncswdev, 0, "Number of swap devices");
static int swapdev_strategy __P((struct vop_strategy_args *ap));
--- 71,80 ----
int nswdev = NSWAPDEV;
int vm_swap_size;
static int ncswdev = 0; /* # of configured swap devs */
!
! SYSCTL_NODE(_vm, VM_SWAP, swap, CTLFLAG_RD, 0, "Swap statistics");
! SYSCTL_NODE(_vm_swap, VM_SWAP_DEV, dev, CTLFLAG_RD, 0, "Swap devices");
! SYSCTL_INT(_vm_swap, VM_SWAP_NSWAPDEV, nswapdev, CTLFLAG_RD,
&ncswdev, 0, "Number of swap devices");
static int swapdev_strategy __P((struct vop_strategy_args *ap));
***************
*** 251,257 ****
int error;
u_long aligned_nblks;
struct sysctl_oid *oid;
! char name[11];
if (!swapdev_vp) {
error = getnewvnode(VT_NON, NULL, swapdev_vnodeop_p,
--- 255,261 ----
int error;
u_long aligned_nblks;
struct sysctl_oid *oid;
! char name[5];
if (!swapdev_vp) {
error = getnewvnode(VT_NON, NULL, swapdev_vnodeop_p,
***************
*** 338,358 ****
* Add sysctl entries for new swap area. XXX: if some day swap devices
* can be removed, add an oid member to swdevt.
*/
! if (snprintf(name, sizeof(name), "swapdev%d", ncswdev) < sizeof(name)) {
! oid = SYSCTL_ADD_NODE(NULL, SYSCTL_STATIC_CHILDREN(_vm),
! OID_AUTO, name, CTLFLAG_RD, NULL, "Swap device stats");
if (oid != NULL) {
! SYSCTL_ADD_INT(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
! "flags", CTLFLAG_RD, &sp->sw_flags, 0, "Flags");
! SYSCTL_ADD_INT(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
! "nblks", CTLFLAG_RD, &sp->sw_nblks, 0,
! "Number of blocks");
! SYSCTL_ADD_INT(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
! "used", CTLFLAG_RD, &sp->sw_used, 0,
! "Number of blocks in use");
! SYSCTL_ADD_OPAQUE(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
! "dev", CTLFLAG_RD, &sp->sw_dev, sizeof(sp->sw_dev),
! "T,dev_t", "Device");
}
} else
printf("XXX: swaponvp() name buffer too small!\n");
--- 342,364 ----
* Add sysctl entries for new swap area. XXX: if some day swap devices
* can be removed, add an oid member to swdevt.
*/
! if (snprintf(name, sizeof(name), "%d", ncswdev) < sizeof(name)) {
! oid = SYSCTL_ADD_NODE(NULL, SYSCTL_STATIC_CHILDREN(_vm_swap_dev),
! ncswdev + VM_SWAP_DEV_FIRST, name, CTLFLAG_RD, NULL,
! "Swap device stats");
if (oid != NULL) {
! SYSCTL_ADD_INT(NULL, SYSCTL_CHILDREN(oid),
! VM_SWAP_DEV_FLAGS, "flags", CTLFLAG_RD,
! &sp->sw_flags, 0, "Flags");
! SYSCTL_ADD_INT(NULL, SYSCTL_CHILDREN(oid),
! VM_SWAP_DEV_NBLKS, "nblks", CTLFLAG_RD,
! &sp->sw_nblks, 0, "Number of blocks");
! SYSCTL_ADD_INT(NULL, SYSCTL_CHILDREN(oid),
! VM_SWAP_DEV_USED, "used", CTLFLAG_RD, &sp->sw_used,
! 0, "Number of blocks in use");
! SYSCTL_ADD_OPAQUE(NULL, SYSCTL_CHILDREN(oid),
! VM_SWAP_DEV_DEV, "dev", CTLFLAG_RD, &sp->sw_dev,
! sizeof(sp->sw_dev), "T,dev_t", "Device");
}
} else
printf("XXX: swaponvp() name buffer too small!\n");
Only in sys.swd/vm: vm_swap.c~
[-- Attachment #3 --]
diff -cr libkvm.1o/kvm_getswapinfo.c libkvm.1os/kvm_getswapinfo.c
*** libkvm.1o/kvm_getswapinfo.c Fri Feb 23 01:09:53 2001
--- libkvm.1os/kvm_getswapinfo.c Sat Feb 24 00:37:54 2001
***************
*** 25,30 ****
--- 25,32 ----
#include <sys/blist.h>
#include <sys/sysctl.h>
+ #include <vm/vm_param.h>
+
#include <err.h>
#include <fcntl.h>
#include <kvm.h>
***************
*** 64,70 ****
static int kvm_getswapinfo_sysctl(kvm_t *, struct kvm_swap *, int, int);
static int nlist_init(kvm_t *);
static int getsysctl(kvm_t *, char *, void *, int);
! static int getsysctl2(kvm_t *, char *, char *, char *, int, void *, int);
#define SVAR(var) __STRING(var) /* to force expansion */
--- 66,72 ----
static int kvm_getswapinfo_sysctl(kvm_t *, struct kvm_swap *, int, int);
static int nlist_init(kvm_t *);
static int getsysctl(kvm_t *, char *, void *, int);
! static int getsysctloid(kvm_t *, int *, int, void *, int);
#define SVAR(var) __STRING(var) /* to force expansion */
***************
*** 458,466 ****
#define GETSYSCTL(kd, name, var) \
getsysctl(kd, name, &(var), sizeof(var))
! #define GETSYSCTL2(kd, pref, suff, buf, var) \
! getsysctl2(kd, pref, suff, buf, sizeof(buf), &(var), \
! sizeof(var))
int
kvm_getswapinfo_sysctl(
--- 460,467 ----
#define GETSYSCTL(kd, name, var) \
getsysctl(kd, name, &(var), sizeof(var))
! #define GETSYSCTLOID(kd, oid, oidlen, var) \
! getsysctloid(kd, oid, oidlen, &(var), sizeof(var))
int
kvm_getswapinfo_sysctl(
***************
*** 471,481 ****
) {
int ti = 0;
udev_t dev;
- char node[15];
- char buf[20];
int used, ttl, i;
! if (!GETSYSCTL(kd, "vm.nswapdev", unswdev))
return -1;
ti = unswdev;
--- 472,484 ----
) {
int ti = 0;
udev_t dev;
int used, ttl, i;
+ int soid[5];
! soid[0] = CTL_VM;
! soid[1] = VM_SWAP;
! soid[2] = VM_SWAP_NSWAPDEV;
! if (!GETSYSCTLOID(kd, soid, 3, unswdev))
return -1;
ti = unswdev;
***************
*** 488,510 ****
if (!GETSYSCTL(kd, "vm.dmmax", dmmax))
return -1;
for (i = 0; i < unswdev; ++i) {
! if (snprintf(node, sizeof(node), "vm.swapdev%d.", i) >=
! sizeof(node)) {
! _kvm_err(kd, kd->program, "XXX: node buffer too small");
! return -1;
! }
!
! if (!GETSYSCTL2(kd, node, "nblks", buf, ttl))
return -1;
! if (!GETSYSCTL2(kd, node, "used", buf, used))
return -1;
ttl -= dmmax;
if (i < ti) {
! if (!GETSYSCTL2(kd, node, "dev", buf, dev))
return -1;
! if (!GETSYSCTL2(kd, node, "flags", buf,
swap_ary[i].ksw_flags))
return -1;
swap_ary[i].ksw_total = ttl;
--- 491,514 ----
if (!GETSYSCTL(kd, "vm.dmmax", dmmax))
return -1;
+ soid[2] = VM_SWAP_DEV;
for (i = 0; i < unswdev; ++i) {
! soid[3] = i + 1;
!
! soid[4] = VM_SWAP_DEV_NBLKS;
! if (!GETSYSCTLOID(kd, soid, 5, ttl))
return -1;
! soid[4] = VM_SWAP_DEV_USED;
! if (!GETSYSCTLOID(kd, soid, 5, used))
return -1;
ttl -= dmmax;
if (i < ti) {
! soid[4] = VM_SWAP_DEV_DEV;
! if (!GETSYSCTLOID(kd, soid, 5, dev))
return -1;
! soid[4] = VM_SWAP_DEV_FLAGS;
! if (!GETSYSCTLOID(kd, soid, 5,
swap_ary[i].ksw_flags))
return -1;
swap_ary[i].ksw_total = ttl;
***************
*** 587,608 ****
}
static int
! getsysctl2 (
kvm_t *kd,
! char *pref,
! char *suff,
! char *buf,
! int buflen,
void *ptr,
int len
) {
! if (strlcpy(buf, pref, buflen) >= buflen) {
! _kvm_err(kd, kd->program, "getsysctl2: string buffer too small");
return (0);
}
! if (strlcat(buf, suff, buflen) >= buflen) {
! _kvm_err(kd, kd->program, "getsysctl2: string buffer too small");
return (0);
}
! return getsysctl(kd, buf, ptr, len);
}
--- 591,611 ----
}
static int
! getsysctloid (
kvm_t *kd,
! int *oid,
! int oidlen,
void *ptr,
int len
) {
! int nlen = len;
! if (sysctl(oid, oidlen, ptr, &nlen, NULL, 0) == -1) {
! _kvm_err(kd, kd->program, "cannot read sysctl.");
return (0);
}
! if (nlen != len) {
! _kvm_err(kd, kd->program, "sysctl has unexpected size");
return (0);
}
! return (1);
}
Only in libkvm.1o: kvm_getswapinfo.c~
Binary files libkvm.1o/kvm_getswapinfo.o and libkvm.1os/kvm_getswapinfo.o differ
Binary files libkvm.1o/libkvm.a and libkvm.1os/libkvm.a differ
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010224005142.A2470>
