my $vifmodel= $vif ? "model=$vif," : '';
my $xoptcfg= $xopts->{ExtraConfig};
$xoptcfg='' unless defined $xoptcfg;
+
+ my $vnumacfg= '';
+ my $vnuma_nodes= guest_var($gho, 'vnodes', $xopts->{DefVnodes} || 1);
+ if ($vnuma_nodes > 1 && $vcpus >= $vnuma_nodes) {
+ my @vnuma_mem;
+ my @vnuma_pnode;
+ my @vnuma_vcpus;
+ my @vnuma;
+
+ my $m= int($ram_mb / $vnuma_nodes);
+ @vnuma_mem = map { $_ < $vnuma_nodes ? $m :
+ ($ram_mb - ($vnuma_nodes-1) * $m) } (1 .. $vnuma_nodes);
+
+ my $v= int($vcpus / $vnuma_nodes);
+ @vnuma_vcpus= map { $_ == 0 ? "0-" . ($v-1) :
+ $_ == $vnuma_nodes-1 ? ($_ * $v) . "-" . ($vcpus-1) :
+ ($_ * $v) . "-" . (($_+1) * $v - 1) } (0 .. $vnuma_nodes-1);
+
+ # Let's put all vnodes on pnode 0, as we don't even know (for now)
+ # whether or not the host has more NUMA nodes than that!
+ @vnuma_pnode = (0) x $vnuma_nodes;
+
+ @vnuma = map { $_ == -1 ? '[' : $_ == $vnuma_nodes ? ']' :
+ "[\"pnode=$vnuma_pnode[$_]\",\"size=$vnuma_mem[$_]\",\"vcpus=$vnuma_vcpus[$_]\" ]," }
+ (-1 .. $vnuma_nodes);
+ $vnumacfg= "vnuma = @vnuma";
+ }
+
my $xencfg= <<END;
name = '$gho->{Name}'
memory = ${ram_mb}
on_crash = '$oncrash'
#
vcpus = $vcpus
+$vnumacfg
#
$cfgrest
#