1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-10-19 02:29:40 +00:00

Change the way information about swap devices is exported to be more

canonical: define a versioned struct xswdev, and add a sysctl node
handler that allows the user to get this structure for a certain device
index by specifying this index as last element of the MIB.
This new node handler, vm.swap_info, replaces the old vm.nswapdev
and vm.swapdevX.* (where X was the index) sysctls.
This commit is contained in:
Thomas Moestl 2001-06-01 22:53:10 +00:00
parent 11151a5b42
commit 5c5c8fa826
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=77604
2 changed files with 46 additions and 28 deletions

View File

@ -104,6 +104,18 @@
{ "swapping_enabled", CTLTYPE_INT},\
}
/*
* Structure for swap device statistics
*/
#define XSWDEV_VERSION 1
struct xswdev {
u_int xsw_version;
udev_t xsw_dev;
int xsw_flags;
int xsw_nblks;
int xsw_used;
};
/*
* Return values from the VM routines.
*/

View File

@ -55,6 +55,7 @@
#include <vm/vm.h>
#include <vm/vm_extern.h>
#include <vm/vm_zone.h>
#include <vm/vm_param.h>
#include <vm/swap_pager.h>
/*
@ -69,9 +70,6 @@ struct swdevt *swdevt = should_be_malloced;
static int nswap; /* first block after the interleaved devs */
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));
struct vnode *swapdev_vp;
@ -250,8 +248,6 @@ swaponvp(p, vp, dev, nblks)
swblk_t dvbase;
int error;
u_long aligned_nblks;
struct sysctl_oid *oid;
char name[11];
if (!swapdev_vp) {
error = getnewvnode(VT_NON, NULL, swapdev_vnodeop_p,
@ -334,29 +330,39 @@ swaponvp(p, vp, dev, nblks)
blist_free(swapblist, vsbase, blk);
vm_swap_size += blk;
}
/*
* 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");
ncswdev++;
return (0);
}
static int
sysctl_vm_swap_info(SYSCTL_HANDLER_ARGS)
{
int *name = (int *)arg1;
int error, i, n;
struct xswdev xs;
struct swdevt *sp;
if (arg2 != 1) /* name length */
return (EINVAL);
for (sp = swdevt, i = 0, n = 0 ; i < nswdev; i++, sp++) {
if (sp->sw_vp) {
if (n == *name) {
xs.xsw_version = XSWDEV_VERSION;
xs.xsw_dev = sp->sw_dev;
xs.xsw_flags = sp->sw_flags;
xs.xsw_nblks = sp->sw_nblks;
xs.xsw_used = sp->sw_used;
error = SYSCTL_OUT(req, &xs, sizeof(xs));
return (error);
}
n++;
}
}
return (ENOENT);
}
SYSCTL_NODE(_vm, OID_AUTO, swap_info, CTLFLAG_RD, sysctl_vm_swap_info,
"Swap statistics by device");