]> git.proxmox.com Git - mirror_qemu.git/commit
hostmem: Honor multiple preferred nodes if possible
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 15 Dec 2022 09:55:03 +0000 (10:55 +0100)
committerDavid Hildenbrand <david@redhat.com>
Wed, 28 Dec 2022 13:59:55 +0000 (14:59 +0100)
commit6bb613f0812d1364fc8fcf0846647446884d5148
treeebd4b3ec1817adccfb206581f30db168e8ee0909
parent82ba778e1329f6fb89a23d728c680656698d275a
hostmem: Honor multiple preferred nodes if possible

If a memory-backend is configured with mode
HOST_MEM_POLICY_PREFERRED then
host_memory_backend_memory_complete() calls mbind() as:

  mbind(..., MPOL_PREFERRED, nodemask, ...);

Here, 'nodemask' is a bitmap of host NUMA nodes and corresponds
to the .host-nodes attribute. Therefore, there can be multiple
nodes specified. However, the documentation to MPOL_PREFERRED
says:

  MPOL_PREFERRED
    This mode sets the preferred node for allocation. ...
    If nodemask specifies more than one node ID, the first node
    in the mask will be selected as the preferred node.

Therefore, only the first node is honored and the rest is
silently ignored. Well, with recent changes to the kernel and
numactl we can do better.

The Linux kernel added in v5.15 via commit cfcaa66f8032
("mm/hugetlb: add support for mempolicy MPOL_PREFERRED_MANY")
support for MPOL_PREFERRED_MANY, which accepts multiple preferred
NUMA nodes instead.

Then, numa_has_preferred_many() API was introduced to numactl
(v2.0.15~26) allowing applications to query kernel support.

Wiring this all together, we can pass MPOL_PREFERRED_MANY to the
mbind() call instead and stop ignoring multiple nodes, silently.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Message-Id: <a0b4adce1af5bd2344c2218eb4a04b3ff7bcfdb4.1671097918.git.mprivozn@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
backends/hostmem.c
meson.build