On 06/23/2014 03:59 PM, Michal Privoznik wrote: > On the Linux kernel, if huge pages are allocated the size they cut off > from memory is accounted under the 'MemUsed' in the meminfo file. > However, we want the sum to be subtracted from 'MemTotal'. This patch > implements this feature. After this change, we can enable reporting > of the ordinary system pages in the capability XML: > > <capabilities> > > <host> > <uuid>01281cda-f352-cb11-a9db-e905fe22010c</uuid> > <cpu> > <arch>x86_64</arch> > <model>Haswell</model> > <vendor>Intel</vendor> > <topology sockets='1' cores='1' threads='1'/> > <feature/> > <pages unit='KiB' size='4'/> > <pages unit='KiB' size='2048'/> > <pages unit='KiB' size='1048576'/> > </cpu> > <power_management/> > <migration_features/> > <topology> > <cells num='4'> > <cell id='0'> > <memory unit='KiB'>4048248</memory> > <pages unit='KiB' size='4'>748382</pages> > <pages unit='KiB' size='2048'>3</pages> > <pages unit='KiB' size='1048576'>1</pages> > <distances/> > <cpus num='1'> > <cpu id='0' socket_id='0' core_id='0' siblings='0'/> > </cpus> > </cell> > ... > </cells> > </topology> > </host> > </capabilities> > > You can see the beautiful thing about this: if you sum up all the > <pages/> you'll get <memory/>. > > Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> > --- > src/nodeinfo.c | 2 +- > src/util/virnuma.c | 65 +++++++++++++++++++++++++++++++----------------------- > src/util/virnuma.h | 1 + > 3 files changed, 39 insertions(+), 29 deletions(-) > > @@ -647,6 +649,13 @@ virNumaGetHugePageInfo(int node, > * total number of pages in the pool (both free and taken) > * and count for free pages in the pool. > * > + * The @huge_page_sum parameter exists there due to the Linux s/there// > + * kernel limitation. The problem is, if there are some huge > + * pages allocated, they are accounted under the 'MemUsed' field > + * in the meminfo file instead of being subtracted from the > + * 'MemTotal'. We must do the subtraction ourselves. > + * If unsure, pass 0. > + * > * If you're interested in just one bit, pass NULL to the other one. > * > * As a special case, if @node == -1, overall info is fetched > @@ -657,6 +666,7 @@ virNumaGetHugePageInfo(int node, > int > virNumaGetPageInfo(int node, > unsigned int page_size, > + unsigned long long huge_page_sum, > unsigned int *page_avail, > unsigned int *page_free) > { > @@ -666,7 +676,6 @@ virNumaGetPageInfo(int node, > /* sysconf() returns page size in bytes, > * the @page_size is however in kibibytes */ > if (page_size == system_page_size / 1024) { > -# if 0 > unsigned long long memsize, memfree; > > /* TODO: come up with better algorithm that takes huge pages into > @@ -679,16 +688,14 @@ virNumaGetPageInfo(int node, > goto cleanup; > } > > + /* see description above */ I think you can just move the comment above here. > + memsize -= huge_page_sum; > + > if (page_avail) > *page_avail = memsize / system_page_size; > > if (page_free) > *page_free = memfree / system_page_size; ACK Jan
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list