Date: Mon, 10 Jul 2017 10:51:43 -0300 From: =?UTF-8?B?T3RhY8OtbGlv?= <otacilio.neto@bsd.com.br> To: Konstantin Belousov <kostikbel@gmail.com>, Tomoaki AOKI <junchoon@dec.sakura.ne.jp> Cc: freebsd-current@freebsd.org Subject: Re: type of vm.stats.vm.v_vnodepgsin vm.stats.vm.v_swappgsin, vm.stats.vm.v_vnodepgsout vm.stats.vm.v_swappgsout on AMD64 r320730 Message-ID: <e1266e0d-5c75-d5c0-668c-d500fa70c3a3@bsd.com.br> In-Reply-To: <20170710094922.GQ1935@kib.kiev.ua> References: <1c37db96-7cd2-91c9-011c-967a32a97f05@bsd.com.br> <20170710154046.58c3d7b14a227a20bea3e55b@dec.sakura.ne.jp> <20170710071807.GO1935@kib.kiev.ua> <20170710184528.8677740bc55681e331c2fbea@dec.sakura.ne.jp> <20170710094922.GQ1935@kib.kiev.ua>
index | next in thread | previous in thread | raw e-mail
Em 10/07/2017 06:49, Konstantin Belousov escreveu:
> On Mon, Jul 10, 2017 at 06:45:28PM +0900, Tomoaki AOKI wrote:
>> Hm, for example, sysutils/lsof (userspace app) depends on kernel
>> source, and I thought the one Otacilio mentioned is something like it.
> lsof purpose is to dig into a kernel memory to gather information about
> the process state and opened files. To do this, lsof authors have to use
> internal kernel data structures.
>
> The library which is discussed in the thread uses public interfaces,
> but then tries to pack the returned data into internal kernel structure.
> If this is true, then the breakage is on the library side.
Hello
This following simple program behaves in the same manner that xosview.
It shows corrects answers for pages_in and pages_out on FreeBSD 11 amd64
and FreeBSD10.3 i386. On FreeBSD 12 r320730 it shows the error answer
that I related previously. If the lines
pageinfo[0] = (uint64_t)vm.v_vnodepgsin + (uint64_t)vm.v_swappgsin;
pageinfo[1] = (uint64_t)vm.v_vnodepgsout + (uint64_t)vm.v_swappgsout;
are patched to
pageinfo[0] = (uint32_t)((uint64_t)vm.v_vnodepgsin +
(uint64_t)vm.v_swappgsin);
pageinfo[1] = (uint32_t)((uint64_t)vm.v_vnodepgsout +
(uint64_t)vm.v_swappgsout);
The program works on all FreeBSD version. My doubt is why now this type
cast (uint32_t) is necessary?
[]'s
-Otacilio
#include <stdio.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#define _WANT_VMMETER
#include <sys/vmmeter.h>
/* meminfo[5] = { active, inactive, wired, cached, free } */
/* pageinfo[2] = { pages_in, pages_out } */
void BSDGetPageStats(uint64_t *meminfo, uint64_t *pageinfo) {
struct vmmeter vm;
size_t size = sizeof(unsigned int);
#define GET_VM_STATS(name) sysctlbyname("vm.stats.vm." #name,
&vm.name, &size, NULL, 0)
GET_VM_STATS(v_active_count);
GET_VM_STATS(v_inactive_count);
GET_VM_STATS(v_wire_count);
GET_VM_STATS(v_free_count);
GET_VM_STATS(v_page_size);
GET_VM_STATS(v_vnodepgsin);
GET_VM_STATS(v_vnodepgsout);
GET_VM_STATS(v_swappgsin);
GET_VM_STATS(v_swappgsout);
if (meminfo) {
meminfo[0] = (uint64_t)vm.v_active_count * vm.v_page_size;
meminfo[1] = (uint64_t)vm.v_inactive_count * vm.v_page_size;
meminfo[2] = (uint64_t)vm.v_wire_count * vm.v_page_size;
meminfo[4] = (uint64_t)vm.v_free_count * vm.v_page_size;
}
if (pageinfo) {
pageinfo[0] = (uint64_t)vm.v_vnodepgsin + (uint64_t)vm.v_swappgsin;
pageinfo[1] = (uint64_t)vm.v_vnodepgsout +
(uint64_t)vm.v_swappgsout;
}
}
int main(int argc, char **argv){
uint64_t meminfo[5];
uint64_t pageinfo[2];
BSDGetPageStats(meminfo, pageinfo);
printf("active memory = %lu bytes\n", meminfo[0]);
printf("inactive memory = %lu bytes\n", meminfo[1]);
printf("wired memory = %lu bytes\n", meminfo[2]);
printf("cached memory = %lu bytes\n", meminfo[3]);
printf("free memory = %lu bytes\n", meminfo[4]);
printf("\npages_in = %lu bytes\n", pageinfo[0]);
printf("pages_out = %lu bytes\n", pageinfo[1]);
return 0;
}
home |
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?e1266e0d-5c75-d5c0-668c-d500fa70c3a3>
