From owner-freebsd-current@freebsd.org Mon Jul 10 14:12:53 2017 Return-Path: Delivered-To: freebsd-current@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 97CE2DA94A9 for ; Mon, 10 Jul 2017 14:12:53 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from kib.kiev.ua (kib.kiev.ua [IPv6:2001:470:d5e7:1::1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 2555866351 for ; Mon, 10 Jul 2017 14:12:52 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from tom.home (kib@localhost [127.0.0.1]) by kib.kiev.ua (8.15.2/8.15.2) with ESMTPS id v6AECbfZ018599 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 10 Jul 2017 17:12:37 +0300 (EEST) (envelope-from kostikbel@gmail.com) DKIM-Filter: OpenDKIM Filter v2.10.3 kib.kiev.ua v6AECbfZ018599 Received: (from kostik@localhost) by tom.home (8.15.2/8.15.2/Submit) id v6AECbJK018598; Mon, 10 Jul 2017 17:12:37 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: tom.home: kostik set sender to kostikbel@gmail.com using -f Date: Mon, 10 Jul 2017 17:12:37 +0300 From: Konstantin Belousov To: Otac??lio Cc: Tomoaki AOKI , 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: <20170710141237.GS1935@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> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.8.3 (2017-05-23) X-Spam-Status: No, score=-2.0 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_ADSP_CUSTOM_MED,FREEMAIL_FROM,NML_ADSP_CUSTOM_MED autolearn=no autolearn_force=no version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on tom.home X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 10 Jul 2017 14:12:53 -0000 On Mon, Jul 10, 2017 at 10:51:43AM -0300, Otac??lio wrote: > 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 > #include > #include > > #define _WANT_VMMETER > > #include > > /* 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) Use of struct vmmeter is wrong, as discussed. The structure is for kernel internal interfaces. The behaviour changed because the structure member was of type uint32_t but become a pointer. You initialize the size of the storage to receive MIB value to sizeof(int), which leaves half of the pointer storage not filled. Stop using vmmeter, use correct types for the MIBs values, and pass correct size to sysctl(3) call. > 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; > }