Skip to content
  • Laurent Vivier's avatar
    3bfe5716
    numa: equally distribute memory on nodes · 3bfe5716
    Laurent Vivier authored
    When there are more nodes than available memory to put the minimum
    allowed memory by node, all the memory is put on the last node.
    
    This is because we put (ram_size / nb_numa_nodes) &
    ~((1 << mc->numa_mem_align_shift) - 1); on each node, and in this
    case the value is 0. This is particularly true with pseries,
    as the memory must be aligned to 256MB.
    
    To avoid this problem, this patch uses an error diffusion algorithm [1]
    to distribute equally the memory on nodes.
    
    We introduce numa_auto_assign_ram() function in MachineClass
    to keep compatibility between machine type versions.
    The legacy function is used with pseries-2.9, pc-q35-2.9 and
    pc-i440fx-2.9 (and previous), the new one with all others.
    
    Example:
    
    qemu-system-ppc64 -S -nographic  -nodefaults -monitor stdio -m 1G -smp 8 \
                      -numa node -numa node -numa node \
                      -numa node -numa node -numa node
    
    Before:
    
    (qemu) info numa
    6 nodes
    node 0 cpus: 0 6
    node 0 size: 0 MB
    node 1 cpus: 1 7
    node 1 size: 0 MB
    node 2 cpus: 2
    node 2 size: 0 MB
    node 3 cpus: 3
    node 3 size: 0 MB
    node 4 cpus: 4
    node 4 size: 0 MB
    node 5 cpus: 5
    node 5 size: 1024 MB
    
    After:
    (qemu) info numa
    6 nodes
    node 0 cpus: 0 6
    node 0 size: 0 MB
    node 1 cpus: 1 7
    node 1 size: 256 MB
    node 2 cpus: 2
    node 2 size: 0 MB
    node 3 cpus: 3
    node 3 size: 256 MB
    node 4 cpus: 4
    node 4 size: 256 MB
    node 5 cpus: 5
    node 5 size: 256 MB
    
    [1] https://en.wikipedia.org/wiki/Error_diffusion
    
    
    
    Signed-off-by: default avatarLaurent Vivier <lvivier@redhat.com>
    Message-Id: <20170502162955.1610-2-lvivier@redhat.com>
    Reviewed-by: default avatarEduardo Habkost <ehabkost@redhat.com>
    [ehabkost: s/ram_size/size/ at numa_default_auto_assign_ram()]
    Signed-off-by: default avatarEduardo Habkost <ehabkost@redhat.com>
    3bfe5716
    numa: equally distribute memory on nodes
    Laurent Vivier authored
    When there are more nodes than available memory to put the minimum
    allowed memory by node, all the memory is put on the last node.
    
    This is because we put (ram_size / nb_numa_nodes) &
    ~((1 << mc->numa_mem_align_shift) - 1); on each node, and in this
    case the value is 0. This is particularly true with pseries,
    as the memory must be aligned to 256MB.
    
    To avoid this problem, this patch uses an error diffusion algorithm [1]
    to distribute equally the memory on nodes.
    
    We introduce numa_auto_assign_ram() function in MachineClass
    to keep compatibility between machine type versions.
    The legacy function is used with pseries-2.9, pc-q35-2.9 and
    pc-i440fx-2.9 (and previous), the new one with all others.
    
    Example:
    
    qemu-system-ppc64 -S -nographic  -nodefaults -monitor stdio -m 1G -smp 8 \
                      -numa node -numa node -numa node \
                      -numa node -numa node -numa node
    
    Before:
    
    (qemu) info numa
    6 nodes
    node 0 cpus: 0 6
    node 0 size: 0 MB
    node 1 cpus: 1 7
    node 1 size: 0 MB
    node 2 cpus: 2
    node 2 size: 0 MB
    node 3 cpus: 3
    node 3 size: 0 MB
    node 4 cpus: 4
    node 4 size: 0 MB
    node 5 cpus: 5
    node 5 size: 1024 MB
    
    After:
    (qemu) info numa
    6 nodes
    node 0 cpus: 0 6
    node 0 size: 0 MB
    node 1 cpus: 1 7
    node 1 size: 256 MB
    node 2 cpus: 2
    node 2 size: 0 MB
    node 3 cpus: 3
    node 3 size: 256 MB
    node 4 cpus: 4
    node 4 size: 256 MB
    node 5 cpus: 5
    node 5 size: 256 MB
    
    [1] https://en.wikipedia.org/wiki/Error_diffusion
    
    
    
    Signed-off-by: default avatarLaurent Vivier <lvivier@redhat.com>
    Message-Id: <20170502162955.1610-2-lvivier@redhat.com>
    Reviewed-by: default avatarEduardo Habkost <ehabkost@redhat.com>
    [ehabkost: s/ram_size/size/ at numa_default_auto_assign_ram()]
    Signed-off-by: default avatarEduardo Habkost <ehabkost@redhat.com>
Loading