Patchwork Don't limit node count by smp count

login
register
mail settings
Submitter Sasha Levin
Date March 30, 2011, 7:14 p.m.
Message ID <1301512475.2976.3.camel@sasha>
Download mbox | patch
Permalink /patch/88954/
State New
Headers show

Comments

Sasha Levin - March 30, 2011, 7:14 p.m.
It is possible to create CPU-less NUMA nodes, node amount shouldn't be
limited by amount of CPUs.

Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
---
 vl.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

case
Anthony Liguori - March 30, 2011, 7:28 p.m.
On 03/30/2011 02:14 PM, Sasha Levin wrote:
> It is possible to create CPU-less NUMA nodes, node amount shouldn't be
> limited by amount of CPUs.

But does this actually work in the code today and does it work with any 
guests?

Regards,

Anthony Liguori

> Signed-off-by: Sasha Levin<levinsasha928@gmail.com>
> ---
>   vl.c |    4 ++--
>   1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index 8bcf2ae..8cc1aa8 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -3002,8 +3002,8 @@ int main(int argc, char **argv, char **envp)
>       if (nb_numa_nodes>  0) {
>           int i;
>
> -        if (nb_numa_nodes>  smp_cpus) {
> -            nb_numa_nodes = smp_cpus;
> +        if (nb_numa_nodes>  MAX_NODES) {
> +            nb_numa_nodes = MAX_NODES;
>           }
>
>           /* If no memory size if given for any node, assume the default
> case
>
>
Sasha Levin - March 30, 2011, 8:17 p.m.
On Wed, 2011-03-30 at 14:28 -0500, Anthony Liguori wrote:
> On 03/30/2011 02:14 PM, Sasha Levin wrote:
> > It is possible to create CPU-less NUMA nodes, node amount shouldn't be
> > limited by amount of CPUs.
> 
> But does this actually work in the code today and does it work with any 
> guests?
> 

I've tested it on an Ubuntu desktop as a guest and it worked
fine, /sys/devices/system/node/has_cpu was as expected.

> Regards,
> 
> Anthony Liguori
> 
> > Signed-off-by: Sasha Levin<levinsasha928@gmail.com>
> > ---
> >   vl.c |    4 ++--
> >   1 files changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/vl.c b/vl.c
> > index 8bcf2ae..8cc1aa8 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -3002,8 +3002,8 @@ int main(int argc, char **argv, char **envp)
> >       if (nb_numa_nodes>  0) {
> >           int i;
> >
> > -        if (nb_numa_nodes>  smp_cpus) {
> > -            nb_numa_nodes = smp_cpus;
> > +        if (nb_numa_nodes>  MAX_NODES) {
> > +            nb_numa_nodes = MAX_NODES;
> >           }
> >
> >           /* If no memory size if given for any node, assume the default
> > case
> >
> >
>
Michael Roth - March 30, 2011, 9:35 p.m.
On 03/30/2011 02:14 PM, Sasha Levin wrote:
> It is possible to create CPU-less NUMA nodes, node amount shouldn't be
> limited by amount of CPUs.
>
> Signed-off-by: Sasha Levin<levinsasha928@gmail.com>
> ---
>   vl.c |    4 ++--
>   1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index 8bcf2ae..8cc1aa8 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -3002,8 +3002,8 @@ int main(int argc, char **argv, char **envp)
>       if (nb_numa_nodes>  0) {
>           int i;
>
> -        if (nb_numa_nodes>  smp_cpus) {
> -            nb_numa_nodes = smp_cpus;
> +        if (nb_numa_nodes>  MAX_NODES) {
> +            nb_numa_nodes = MAX_NODES;
>           }
>
>           /* If no memory size if given for any node, assume the default
> case
>
>

Did a quick test myself and it seems to work from what I can tell:

RHEL6 64-bit guest, QEMU master:

/home/mdroth/dev/kvm/qemu.git/x86_64-softmmu/qemu-system-x86_64 -smp 2 
-numa node,nodeid=1 -numa node,nodeid=2 -numa node,nodeid=3 -drive 
file=/home/mdroth/vm/rhel6_64_base.raw,snapshot=off,if=virtio -bios 
/home/mdroth/dev/kvm/qemu.git/pc-bios/bios.bin -vnc :1 -m 1024 --enable-kvm

...

[mdroth@vm0 ~]$ cat /sys/devices/system/node/node{0,1,2}/cpulist
0
1

[mdroth@vm0 ~]$ cat /sys/devices/system/node/node{0,1,2}/distance
10 20 20
20 10 20
20 20 10
[mdroth@vm0 ~]$ cat /sys/devices/system/node/node{0,1,2}/meminfo

Node 0 MemTotal:         343664 kB
Node 0 MemFree:          181384 kB
Node 0 MemUsed:          162280 kB
Node 0 Active:            26640 kB
Node 0 Inactive:          52752 kB
Node 0 Active(anon):      12272 kB
Node 0 Inactive(anon):        0 kB
Node 0 Active(file):      14368 kB
Node 0 Inactive(file):    52752 kB
Node 0 Unevictable:           0 kB
Node 0 Mlocked:               0 kB
Node 0 Dirty:               116 kB
Node 0 Writeback:             0 kB
Node 0 FilePages:         67220 kB
Node 0 Mapped:            12980 kB
Node 0 AnonPages:         12168 kB
Node 0 Shmem:               104 kB
Node 0 KernelStack:         736 kB
Node 0 PageTables:         2988 kB
Node 0 NFS_Unstable:          0 kB
Node 0 Bounce:                0 kB
Node 0 WritebackTmp:          0 kB
Node 0 Slab:              53356 kB
Node 0 SReclaimable:       8896 kB
Node 0 SUnreclaim:        44460 kB
Node 0 HugePages_Total:     0
Node 0 HugePages_Free:      0
Node 0 HugePages_Surp:      0

Node 1 MemTotal:         344064 kB
Node 1 MemFree:          292756 kB
Node 1 MemUsed:           51308 kB
Node 1 Active:            12548 kB
Node 1 Inactive:          11296 kB
Node 1 Active(anon):       8120 kB
Node 1 Inactive(anon):        4 kB
Node 1 Active(file):       4428 kB
Node 1 Inactive(file):    11292 kB
Node 1 Unevictable:           0 kB
Node 1 Mlocked:               0 kB
Node 1 Dirty:                 4 kB
Node 1 Writeback:             0 kB
Node 1 FilePages:         15776 kB
Node 1 Mapped:             3548 kB
Node 1 AnonPages:          6044 kB
Node 1 Shmem:                56 kB
Node 1 KernelStack:         264 kB
Node 1 PageTables:         1904 kB
Node 1 NFS_Unstable:          0 kB
Node 1 Bounce:                0 kB
Node 1 WritebackTmp:          0 kB
Node 1 Slab:              14696 kB
Node 1 SReclaimable:       1584 kB
Node 1 SUnreclaim:        13112 kB
Node 1 HugePages_Total:     0
Node 1 HugePages_Free:      0
Node 1 HugePages_Surp:      0

Node 2 MemTotal:         360436 kB
Node 2 MemFree:          345112 kB
Node 2 MemUsed:           15324 kB
Node 2 Active:                0 kB
Node 2 Inactive:              0 kB
Node 2 Active(anon):          0 kB
Node 2 Inactive(anon):        0 kB
Node 2 Active(file):          0 kB
Node 2 Inactive(file):        0 kB
Node 2 Unevictable:           0 kB
Node 2 Mlocked:               0 kB
Node 2 Dirty:                 0 kB
Node 2 Writeback:             0 kB
Node 2 FilePages:             0 kB
Node 2 Mapped:                4 kB
Node 2 AnonPages:             0 kB
Node 2 Shmem:                 0 kB
Node 2 KernelStack:           8 kB
Node 2 PageTables:            0 kB
Node 2 NFS_Unstable:          0 kB
Node 2 Bounce:                0 kB
Node 2 WritebackTmp:          0 kB
Node 2 Slab:              10920 kB
Node 2 SReclaimable:       1200 kB
Node 2 SUnreclaim:         9720 kB
Node 2 HugePages_Total:     0
Node 2 HugePages_Free:      0
Node 2 HugePages_Surp:      0
[mdroth@vm0 ~]$

Patch

diff --git a/vl.c b/vl.c
index 8bcf2ae..8cc1aa8 100644
--- a/vl.c
+++ b/vl.c
@@ -3002,8 +3002,8 @@  int main(int argc, char **argv, char **envp)
     if (nb_numa_nodes > 0) {
         int i;
 
-        if (nb_numa_nodes > smp_cpus) {
-            nb_numa_nodes = smp_cpus;
+        if (nb_numa_nodes > MAX_NODES) {
+            nb_numa_nodes = MAX_NODES;
         }
 
         /* If no memory size if given for any node, assume the default