[libvirt] [PATCH 1/3] virNumaGetPageInfo: Take huge pages into account
Michal Privoznik
mprivozn at redhat.com
Tue Jun 24 09:56:35 UTC 2014
On 24.06.2014 10:15, Ján Tomko wrote:
> 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 at redhat.com>
>> ---
>> 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//
Fixed.
>
>> + * 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.
This one I'd really like in the function description. I mean, the
@huge_page_sum is a function argument which certainly deserves a
description and the aim of documenting internal functions is to not
force other programmers to actually read the function code. So I'm
keeping it there.
>
>> + memsize -= huge_page_sum;
>> +
>> if (page_avail)
>> *page_avail = memsize / system_page_size;
>>
>> if (page_free)
>> *page_free = memfree / system_page_size;
>
> ACK
>
> Jan
>
Michal
More information about the libvir-list
mailing list