diff options
| author | simonb <simonb@NetBSD.org> | 2000-11-29 09:52:18 +0000 |
|---|---|---|
| committer | simonb <simonb@NetBSD.org> | 2000-11-29 09:52:18 +0000 |
| commit | 3c1b8a2b35d8a1190ebffdcc4343332754be498d (patch) | |
| tree | 649dd84d5dcfc30f0fc62b852e33aa98f378fa84 /sys | |
| parent | 1ebd90e34709a958ea7702cc406e1eece9b6dc18 (diff) | |
Add a vm.uvmexp2 sysctl that uses a ABI-safe 'struct uvmexp_sysctl'.
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/uvm/uvm_extern.h | 85 | ||||
| -rw-r--r-- | sys/uvm/uvm_meter.c | 92 | ||||
| -rw-r--r-- | sys/uvm/uvm_param.h | 8 |
3 files changed, 179 insertions, 6 deletions
diff --git a/sys/uvm/uvm_extern.h b/sys/uvm/uvm_extern.h index 2753263a509..90f812bb623 100644 --- a/sys/uvm/uvm_extern.h +++ b/sys/uvm/uvm_extern.h @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_extern.h,v 1.53 2000/11/27 08:40:03 chs Exp $ */ +/* $NetBSD: uvm_extern.h,v 1.54 2000/11/29 09:52:18 simonb Exp $ */ /* * @@ -251,6 +251,9 @@ struct uvmexp { int inactive; /* number of pages that we free'd but may want back */ int paging; /* number of pages in the process of being paged out */ int wired; /* number of wired pages */ + /* XXX: Adding anything before this line will break binary + * compatibility with top(1) on NetBSD 1.5. + */ int zeropages; /* number of zero'd pages */ int reserve_pagedaemon; /* number of pages reserved for pagedaemon */ int reserve_kernel; /* number of pages reserved for kernel */ @@ -334,6 +337,86 @@ struct uvmexp { struct uvm_object *mb_object; }; +/* + * The following structure is 64-bit alignment safe. New elements + * should only be added to the end of this structure so binary + * compatibility can be preserved. + */ +struct uvmexp_sysctl { + int64_t pagesize; + int64_t pagemask; + int64_t pageshift; + int64_t npages; + int64_t free; + int64_t active; + int64_t inactive; + int64_t paging; + int64_t wired; + int64_t zeropages; + int64_t reserve_pagedaemon; + int64_t reserve_kernel; + int64_t freemin; + int64_t freetarg; + int64_t inactarg; + int64_t wiredmax; + int64_t nswapdev; + int64_t swpages; + int64_t swpguniq; + int64_t swpginuse; + int64_t swpgonly; + int64_t nswget; + int64_t nanon; + int64_t nanonneeded; + int64_t nfreeanon; + int64_t faults; + int64_t traps; + int64_t intrs; + int64_t swtch; + int64_t softs; + int64_t syscalls; + int64_t pageins; + int64_t swapins; + int64_t swapouts; + int64_t pgswapin; + int64_t pgswapout; + int64_t forks; + int64_t forks_ppwait; + int64_t forks_sharevm; + int64_t pga_zerohit; + int64_t pga_zeromiss; + int64_t zeroaborts; + int64_t fltnoram; + int64_t fltnoanon; + int64_t fltpgwait; + int64_t fltpgrele; + int64_t fltrelck; + int64_t fltrelckok; + int64_t fltanget; + int64_t fltanretry; + int64_t fltamcopy; + int64_t fltnamap; + int64_t fltnomap; + int64_t fltlget; + int64_t fltget; + int64_t flt_anon; + int64_t flt_acow; + int64_t flt_obj; + int64_t flt_prcopy; + int64_t flt_przero; + int64_t pdwoke; + int64_t pdrevs; + int64_t pdswout; + int64_t pdfreed; + int64_t pdscans; + int64_t pdanscan; + int64_t pdobscan; + int64_t pdreact; + int64_t pdbusy; + int64_t pdpageouts; + int64_t pdpending; + int64_t pddeact; +}; + #ifdef _KERNEL extern struct uvmexp uvmexp; #endif diff --git a/sys/uvm/uvm_meter.c b/sys/uvm/uvm_meter.c index 4e5819e5894..a970539030b 100644 --- a/sys/uvm/uvm_meter.c +++ b/sys/uvm/uvm_meter.c @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_meter.c,v 1.14 2000/11/24 18:54:31 chs Exp $ */ +/* $NetBSD: uvm_meter.c,v 1.15 2000/11/29 09:52:19 simonb Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -71,6 +71,7 @@ static fixpt_t cexp[3] = { static void uvm_loadav __P((struct loadavg *)); static void uvm_total __P((struct vmtotal *)); +static int sysctl_uvmexp __P((void *, size_t *)); /* * uvm_meter: calculate load average and wake up the swapper (if needed) @@ -145,8 +146,12 @@ uvm_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) sizeof(vmtotals))); case VM_UVMEXP: - return (sysctl_rdstruct(oldp, oldlenp, newp, &uvmexp, + return (sysctl_rdminstruct(oldp, oldlenp, newp, &uvmexp, sizeof(uvmexp))); + case VM_UVMEXP2: + if (newp) + return (EPERM); + return (sysctl_uvmexp(oldp, oldlenp)); case VM_NKMEMPAGES: return (sysctl_rdint(oldp, oldlenp, newp, nkmempages)); @@ -157,6 +162,89 @@ uvm_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) /* NOTREACHED */ } +static int +sysctl_uvmexp(oldp, oldlenp) + void *oldp; + size_t *oldlenp; +{ + struct uvmexp_sysctl u; + + u.pagesize = uvmexp.pagesize; + u.pagemask = uvmexp.pagemask; + u.pageshift = uvmexp.pageshift; + u.npages = uvmexp.npages; + u.free = uvmexp.free; + u.active = uvmexp.active; + u.inactive = uvmexp.inactive; + u.paging = uvmexp.paging; + u.wired = uvmexp.wired; + u.zeropages = uvmexp.zeropages; + u.reserve_pagedaemon = uvmexp.reserve_pagedaemon; + u.reserve_kernel = uvmexp.reserve_kernel; + u.freemin = uvmexp.freemin; + u.freetarg = uvmexp.freetarg; + u.inactarg = uvmexp.inactarg; + u.wiredmax = uvmexp.wiredmax; + u.nswapdev = uvmexp.nswapdev; + u.swpages = uvmexp.swpages; + u.swpguniq = uvmexp.swpguniq; + u.swpginuse = uvmexp.swpginuse; + u.swpgonly = uvmexp.swpgonly; + u.nswget = uvmexp.nswget; + u.nanon = uvmexp.nanon; + u.nanonneeded = uvmexp.nanonneeded; + u.nfreeanon = uvmexp.nfreeanon; + u.faults = uvmexp.faults; + u.traps = uvmexp.traps; + u.intrs = uvmexp.intrs; + u.swtch = uvmexp.swtch; + u.softs = uvmexp.softs; + u.syscalls = uvmexp.syscalls; + u.pageins = uvmexp.pageins; + u.swapins = uvmexp.swapins; + u.swapouts = uvmexp.swapouts; + u.pgswapin = uvmexp.pgswapin; + u.pgswapout = uvmexp.pgswapout; + u.forks = uvmexp.forks; + u.forks_ppwait = uvmexp.forks_ppwait; + u.forks_sharevm = uvmexp.forks_sharevm; + u.pga_zerohit = uvmexp.pga_zerohit; + u.pga_zeromiss = uvmexp.pga_zeromiss; + u.zeroaborts = uvmexp.zeroaborts; + u.fltnoram = uvmexp.fltnoram; + u.fltnoanon = uvmexp.fltnoanon; + u.fltpgwait = uvmexp.fltpgwait; + u.fltpgrele = uvmexp.fltpgrele; + u.fltrelck = uvmexp.fltrelck; + u.fltrelckok = uvmexp.fltrelckok; + u.fltanget = uvmexp.fltanget; + u.fltanretry = uvmexp.fltanretry; + u.fltamcopy = uvmexp.fltamcopy; + u.fltnamap = uvmexp.fltnamap; + u.fltnomap = uvmexp.fltnomap; + u.fltlget = uvmexp.fltlget; + u.fltget = uvmexp.fltget; + u.flt_anon = uvmexp.flt_anon; + u.flt_acow = uvmexp.flt_acow; + u.flt_obj = uvmexp.flt_obj; + u.flt_prcopy = uvmexp.flt_prcopy; + u.flt_przero = uvmexp.flt_przero; + u.pdwoke = uvmexp.pdwoke; + u.pdrevs = uvmexp.pdrevs; + u.pdswout = uvmexp.pdswout; + u.pdfreed = uvmexp.pdfreed; + u.pdscans = uvmexp.pdscans; + u.pdanscan = uvmexp.pdanscan; + u.pdobscan = uvmexp.pdobscan; + u.pdreact = uvmexp.pdreact; + u.pdbusy = uvmexp.pdbusy; + u.pdpageouts = uvmexp.pdpageouts; + u.pdpending = uvmexp.pdpending; + u.pddeact = uvmexp.pddeact; + + return (sysctl_rdminstruct(oldp, oldlenp, NULL, &u, sizeof(u))); +} + /* * uvm_total: calculate the current state of the system. */ diff --git a/sys/uvm/uvm_param.h b/sys/uvm/uvm_param.h index 121a227084c..f2bbfa34c08 100644 --- a/sys/uvm/uvm_param.h +++ b/sys/uvm/uvm_param.h @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_param.h,v 1.1 2000/06/26 14:59:04 mrg Exp $ */ +/* $NetBSD: uvm_param.h,v 1.2 2000/11/29 09:52:19 simonb Exp $ */ /* * Copyright (c) 1991, 1993 @@ -106,9 +106,10 @@ typedef int boolean_t; */ #define VM_METER 1 /* struct vmmeter */ #define VM_LOADAVG 2 /* struct loadavg */ -#define VM_UVMEXP 3 /* struct uvmexp */ +#define VM_UVMEXP 3 /* struct uvmexp */ #define VM_NKMEMPAGES 4 /* kmem_map pages */ -#define VM_MAXID 5 /* number of valid vm ids */ +#define VM_UVMEXP2 5 /* struct uvmexp_sysctl */ +#define VM_MAXID 6 /* number of valid vm ids */ #define CTL_VM_NAMES { \ { 0, 0 }, \ @@ -116,6 +117,7 @@ typedef int boolean_t; { "loadavg", CTLTYPE_STRUCT }, \ { "uvmexp", CTLTYPE_STRUCT }, \ { "nkmempages", CTLTYPE_INT }, \ + { "uvmexp2", CTLTYPE_STRUCT }, \ } |
