diff options
author | gahr <gahr@FreeBSD.org> | 2008-06-24 05:34:16 +0800 |
---|---|---|
committer | gahr <gahr@FreeBSD.org> | 2008-06-24 05:34:16 +0800 |
commit | 6e1df0d83f7b8ed0ac0ad02f443db009f02c9f1b (patch) | |
tree | 9898d760161b2b1cfb38310069942cbc9f9cd538 /sysutils | |
parent | e5f39f110406c4f04383af4cdc99a4dfda2451cb (diff) | |
download | freebsd-ports-gnome-6e1df0d83f7b8ed0ac0ad02f443db009f02c9f1b.tar.gz freebsd-ports-gnome-6e1df0d83f7b8ed0ac0ad02f443db009f02c9f1b.tar.zst freebsd-ports-gnome-6e1df0d83f7b8ed0ac0ad02f443db009f02c9f1b.zip |
- Unbreak on > 700000 after KVM symbols exporting changes.
PR: 123375
Submitted by: Luke Dean <luked@pobox.com>
Diffstat (limited to 'sysutils')
-rw-r--r-- | sysutils/wmmemmon/Makefile | 8 | ||||
-rw-r--r-- | sysutils/wmmemmon/files/extra-kvm2sysctl.diff | 215 |
2 files changed, 222 insertions, 1 deletions
diff --git a/sysutils/wmmemmon/Makefile b/sysutils/wmmemmon/Makefile index b24973945560..fd85110346fe 100644 --- a/sysutils/wmmemmon/Makefile +++ b/sysutils/wmmemmon/Makefile @@ -23,6 +23,12 @@ MAN1= wmmemmon.1 PORTDOCS= ChangeLog README PLIST_FILES= bin/wmmemmon +.include <bsd.port.pre.mk> + +.if ${OSVERSION} > 700000 +EXTRA_PATCHES= ${PATCHDIR}/extra-kvm2sysctl.diff +.endif + post-patch: @${REINPLACE_CMD} -e '/^DEFS/s|-I\.\.$$|-I.. -I../libdockapp/|g ; \ /^CFLAGS/s|-I../libdockapp/||g' ${WRKSRC}/src/Makefile.in @@ -35,4 +41,4 @@ post-install: .endfor .endif # !NOPORTDOCS -.include <bsd.port.mk> +.include <bsd.port.post.mk> diff --git a/sysutils/wmmemmon/files/extra-kvm2sysctl.diff b/sysutils/wmmemmon/files/extra-kvm2sysctl.diff new file mode 100644 index 000000000000..9930143e582d --- /dev/null +++ b/sysutils/wmmemmon/files/extra-kvm2sysctl.diff @@ -0,0 +1,215 @@ +--- src/mem_freebsd.c.orig 2002-10-14 05:23:26.000000000 -0700 ++++ src/mem_freebsd.c 2008-05-03 13:46:06.000000000 -0700 +@@ -17,38 +17,45 @@ + #include <stdlib.h> + #include "mem.h" + +-#include <kvm.h> ++#include <sys/types.h> ++#include <sys/sysctl.h> ++#include <vm/vm_param.h> + #include <fcntl.h> +-#include <sys/vmmeter.h> + #include <time.h> + +-static kvm_t *kvm_data = NULL; +-static int pageshift; +-static struct nlist nlst[] = { {"_cp_time"}, {"_cnt"}, {0} }; ++static int page_size_mib[4] = { -1, -1, -1, -1 }; ++static int page_count_mib[4] = { -1, -1, -1, -1 }; ++static int free_count_mib[4] = { -1, -1, -1, -1 }; ++static int active_count_mib[4] = { -1, -1, -1, -1 }; ++static int inactive_count_mib[4] = { -1, -1, -1, -1 }; ++static int wire_count_mib[4] = { -1, -1, -1, -1 }; ++static int cache_count_mib[4] = { -1, -1, -1, -1 }; ++static int swappgsout_mib[4] = { -1, -1, -1, -1 }; ++static int swappgsin_mib[4] = { -1, -1, -1, -1 }; ++ ++static size_t page_size_len = 4; ++static size_t page_count_len = 4; ++static size_t free_count_len = 4; ++static size_t active_count_len = 4; ++static size_t inactive_count_len = 4; ++static size_t wire_count_len = 4; ++static size_t cache_count_len = 4; ++static size_t swappgsout_len = 4; ++static size_t swappgsin_len = 4; + + /* initialize function */ + void mem_init(void) + { +- int pagesize = getpagesize(); +- pageshift = 0; ++ init_mib("vm.stats.vm.v_page_size",page_size_mib,&page_size_len); ++ init_mib("vm.stats.vm.v_page_count",page_count_mib,&page_count_len); ++ init_mib("vm.stats.vm.v_free_count",free_count_mib,&free_count_len); ++ init_mib("vm.stats.vm.v_active_count",active_count_mib,&active_count_len); ++ init_mib("vm.stats.vm.v_inactive_count",inactive_count_mib,&inactive_count_len); ++ init_mib("vm.stats.vm.v_wire_count",wire_count_mib,&wire_count_len); ++ init_mib("vm.stats.vm.v_cache_count",cache_count_mib,&cache_count_len); ++ init_mib("vm.stats.vm.v_swappgsout",swappgsout_mib,&swappgsout_len); ++ init_mib("vm.stats.vm.v_swappgsin",swappgsin_mib,&swappgsin_len); + +- while (pagesize > 1) { +- pageshift++; +- pagesize >>= 1; +- } +- +- kvm_data = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open"); +- +- if (kvm_data == NULL) { +- fprintf(stderr, "can't open kernel virtual memory"); +- exit(1); +- } +- kvm_nlist(kvm_data, nlst); +- +- if (nlst[0].n_type == 0 || nlst[1].n_type == 0) { +- fprintf(stderr, "error extracting symbols"); +- exit(1); +- } + /* drop setgid & setuid (the latter should not be there really) */ + seteuid(getuid()); + setegid(getgid()); +@@ -59,26 +66,38 @@ + } + } + +- + /* return mem/swap usage in percent 0 to 100 */ + void mem_getusage(int *per_mem, int *per_swap, const struct mem_options *opts) + { +- struct vmmeter vm; +- int bufspace; ++ unsigned long int page_size; ++ unsigned long int page_count; ++ unsigned long int free_count; ++ unsigned long int active_count; ++ unsigned long int inactive_count; ++ unsigned long int wire_count; ++ unsigned long int cache_count; ++ long int swappgsout; ++ long int swappgsin; ++ ++ static long int saved_swappgsout = -1; ++ static long int saved_swappgsin = -1; ++ + static int swap_firsttime = 1; +- static int swappgsin = -1; +- static int swappgsout = -1; +- static int swapmax = 0, swapused = 0; ++ static long int swapmax = 0, swapused = 0; + time_t cur_time; + static time_t last_time_swap = 0; + u_int mused; + + /* get mem usage */ +- if (kvm_read(kvm_data, nlst[0].n_value, &bufspace, sizeof(bufspace)) != +- sizeof(bufspace)) +- exit(1); +- if (kvm_read(kvm_data, nlst[1].n_value, &vm, sizeof(vm)) != sizeof(vm)) +- exit(1); ++ if (sysctl(page_size_mib, 4, &page_size, &page_size_len, NULL, 0) == -1) return; ++ if (sysctl(page_count_mib, 4, &page_count, &page_count_len, NULL, 0) == -1) return; ++ if (sysctl(free_count_mib, 4, &free_count, &free_count_len, NULL, 0) == -1) return; ++ if (sysctl(active_count_mib, 4, &active_count, &active_count_len, NULL, 0) == -1) return; ++ if (sysctl(inactive_count_mib, 4, &inactive_count, &inactive_count_len, NULL, 0) == -1) return; ++ if (sysctl(wire_count_mib, 4, &wire_count, &wire_count_len, NULL, 0) == -1) return; ++ if (sysctl(cache_count_mib, 4, &cache_count, &cache_count_len, NULL, 0) == -1) return; ++ if (sysctl(swappgsout_mib, 4, &swappgsout, &swappgsout_len, NULL, 0) == -1) return; ++ if (sysctl(swappgsin_mib, 4, &swappgsin, &swappgsin_len, NULL, 0) == -1) return; + + /* get swap usage */ + /* only calculate when first time or when changes took place */ +@@ -86,45 +105,69 @@ + /* otherwise it can eat up to 50% of CPU time on heavy swap activity */ + cur_time = time(NULL); + if (swap_firsttime || +- (((vm.v_swappgsin > swappgsin) || (vm.v_swappgsout > swappgsout)) ++ (((swappgsin > saved_swappgsin) || (swappgsout > saved_swappgsout)) + && cur_time > last_time_swap + 1)) { + +- struct kvm_swap swap; +- int n; +- + swapmax = 0; + swapused = 0; + +- n = kvm_getswapinfo(kvm_data, &swap, 1, 0); +- if (n >= 0 && swap.ksw_total != 0) { +- swapmax = swap.ksw_total; +- swapused = swap.ksw_used; +- } ++ getswapinfo(&swapmax,&swapused); + + swap_firsttime = 0; + last_time_swap = cur_time; + } +- swappgsin = vm.v_swappgsin; +- swappgsout = vm.v_swappgsout; ++ saved_swappgsin = swappgsin; ++ saved_swappgsout = swappgsout; + + #ifdef DEBUG + printf ("-------------------\n"); +- printf ("total:%10d\n", vm.v_page_count * vm.v_page_size); +- printf ("free :%10d\n", vm.v_free_count * vm.v_page_size); +- printf ("act :%10d\n", vm.v_active_count * vm.v_page_size); +- printf ("inact:%10d\n", vm.v_inactive_count * vm.v_page_size); +- printf ("wired:%10d\n", vm.v_wire_count * vm.v_page_size); +- printf ("cache:%10d\n", vm.v_cache_count * vm.v_page_size); ++ printf ("total:%10d\n", page_count * page_size); ++ printf ("free :%10d\n", free_count * page_size); ++ printf ("act :%10d\n", active_count * page_size); ++ printf ("inact:%10d\n", inactive_count * page_size); ++ printf ("wired:%10d\n", wire_count * page_size); ++ printf ("cache:%10d\n", cache_count * page_size); + printf ("-------------------\n"); + #endif + + /* calc mem/swap usage in percent */ +- mused = vm.v_page_count - vm.v_free_count; +- if (opts->ignore_wired) mused -= vm.v_wire_count; +- if (opts->ignore_cached) mused -= vm.v_cache_count; ++ mused = page_count - free_count; ++ if (opts->ignore_wired) mused -= wire_count; ++ if (opts->ignore_cached) mused -= cache_count; + +- *per_mem = 100 * (double) mused / (double) vm.v_page_count; ++ *per_mem = 100 * (double) mused / (double) page_count; + *per_swap = 100 * (double) swapused / (double) swapmax; + + if (*per_mem > 97) *per_mem = 100; + } ++ ++/* sets up the mib for a sysctl */ ++void init_mib(char *sysctlname, int *mib, size_t *len) ++{ ++ if (sysctlnametomib(sysctlname,mib,len) == -1) { ++ fprintf(stderr, "bad sysctl %s\n", sysctlname); ++ exit(1); ++ } ++} ++ ++/* returns total and used number of swap pages */ ++void getswapinfo (long *swapmax, long *swapused) ++{ ++ size_t miblen, size; ++ int mib[16], n; ++ struct xswdev xsw; ++ ++ miblen = sizeof mib / sizeof mib[0]; ++ init_mib("vm.swap_info",mib,&miblen); ++ ++ for (n=0;; n++) ++ { ++ mib[miblen] = n; ++ size = sizeof xsw; ++ if (sysctl(mib,miblen+1,&xsw,&size,NULL,0) == -1) ++ break; ++ *swapmax += (long) xsw.xsw_nblks; ++ *swapused += (long) xsw.xsw_used; ++ } ++} ++ + + |