qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v3.1 00/31] NUMA series, and hostmem improvement


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH v3.1 00/31] NUMA series, and hostmem improvements
Date: Thu, 08 May 2014 16:51:56 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0

Il 06/05/2014 11:27, Hu Tao ha scritto:
> This series includes work on QOMifying the memory backends.
> the idea is to delegate all properties of the memory backend to
> a new QOM class hierarchy, in which the concrete classes
> are hostmem-ram and hostmem-file.  The backend is passed to the
> machine via "-numa node,memdev=foo" where "foo" is the id of the
> backend object.

Hello,

I noticed now that if you have the host-nodes property set Linux
requires you to set a policy other than "default" too.  If you don't,
the mbind system call fails.

What about squashing something like this?

Paolo

diff --git a/backends/hostmem.c b/backends/hostmem.c
index d3f8476..a0a3111 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -299,12 +299,23 @@ host_memory_backend_memory_init(UserCreatable *uc, Error 
**errp)
 
 #ifdef CONFIG_NUMA
     unsigned long maxnode = find_last_bit(backend->host_nodes, MAX_NODES);
+    unsigned policy = backend->policy;
+
+    /* Linux does not accept MPOL_DEFAULT with nonzero bitmap, but
+     * "-object memory-ram,size=128M,hostnodes=0,policy=bind" is a
+     * bit of a mouthful.  So if the host_nodes bitmap is nonzero,
+     * pick the BIND policy.
+     */
+    if (find_first_bit(backend->host_nodes, MAX_NODES) != MAX_NODES &&
+        policy == MPOL_DEFAULT) {
+        policy = MPOL_BIND;
+    }
 
     /* This is a workaround for a long standing bug in Linux'
      * mbind implementation, which cuts off the last specified
      * node.
      */
-    if (mbind(ptr, sz, backend->policy, backend->host_nodes, maxnode + 2, 0)) {
+    if (mbind(ptr, sz, policy, backend->host_nodes, maxnode + 2, 0)) {
         error_setg_errno(errp, errno,
                          "cannot bind memory to host NUMA nodes");




reply via email to

[Prev in Thread] Current Thread [Next in Thread]