$cmd.= " options=\"mem_block_size=$memblocksize\" " if $override_memblocksize eq 'y';
print INIT $cmd, "\n";
+%numa = get_numa_data();
+
+if (defined($numa{numnodes})) {
+ $numnodes=$numa{numnodes};
+} else {
+ $numnodes=1;
+}
+
+if (defined($numa{numcores})) {
+ $numcores=$numa{numcores};
+ $numcorespalacios = get_palacios_core_feature($pdir,"V3_CONFIG_MAX_CPUS");
+ if (defined($numcorespalacios) && $numcores>$numcorespalacios) {
+ print "WARNING: Your Palacios configuration is configured to support\n";
+ print " a maximum of $numcorespalacios cores, but this machine has $numcores cores.\n";
+ print " Your Palacios will work on this machine, but will not be able to use\n";
+ print " the additional cores.\n";
+ if ($numnodes>1) {
+ print " This is also a NUMA machine, so this will also affect the initial\n";
+ print " allocation of memory in the NUMA nodes produced by this script.\n";
+ print " We highly recommend you reconfigure Palacios with at least $numcores cores and rebuild it.\n";
+ }
+ }
+}
+
+
+
+$chunk = $memblocksize / (1024 * 1024) ;
+$numchunks = $mem / $chunk;
+$chunkspernode = $numchunks / $numnodes;
+
+print "The initial memory allocation will be:\n\n";
+print " Total memory: $mem MB\n";
+print " Memory block size: $chunk MB\n";
+print " Number of blocks: $numchunks\n";
+print " Number of nodes: $numnodes\n";
+print " Blocks/node: $chunkspernode\n";
+print " 32 bit limit? $shadow\n";
+print " Hot-removed? $hotremove\n";
+
+if ($numnodes*$chunkspernode*$chunk != $mem) {
+ print "\nWARNING: The memory is not evenly divided among nodes or blocks.\n";
+ print " This means that LESS memory is allocated than requested.\n\n";
+}
+
$cmd = "v3_mem -a";
$cmd.= " -k " if $hotremove eq 'n';
$cmd.= " -l " if $shadow eq 'y';
-$chunk = $memblocksize / (1024 * 1024) ;
-$numchunks = $mem / $chunk;
-for ($i=0;$i<$numchunks;$i++) {
- print INIT "$cmd $chunk\n";
+for ($i=0;$i<$numnodes;$i++) {
+ for ($j=0;$j<$chunkspernode;$j++) {
+ if ($numnodes>1) {
+ print INIT "$cmd -n $i $chunk\n";
+ } else {
+ print INIT "$cmd $chunk\n";
+ }
+ }
}
close(INIT);
`chmod 755 v3_init`;
my $feature=shift;
my $x;
- $x=`grep $feature $dir/.config`;
+ $x=`grep $feature= $dir/.config`;
if ($x=~/^\s*\#/) {
return undef;
} else {
- if ($x=~/\s*$feature\s*=\s*(\S*)\s*$/) {
+ if ($x=~/\s*$feature=\s*(\S*)\s*$/) {
return $1;
} else {
return undef;
return $exp==int($exp);
}
+
+sub get_numa_data() {
+ my $line;
+ my $maxnode=0;
+ my $maxcpu=0;
+ my %numa;
+
+ open (N, "numactl --hardware |");
+ while ($line=<N>) {
+ if ($line=~/^node\s+(\d+)\s+cpus:\s+(.*)$/) {
+ my $node=$1;
+ my @cpus = split(/\s+/,$2);
+ my $cpu;
+ if ($node>$maxnode) { $maxnode=$node; }
+ foreach $cpu (@cpus) {
+ if ($cpu>$maxcpu) { $maxcpu=$cpu; }
+ }
+ $numa{"node$node"}{cores}=\@cpus;
+ }
+ }
+ $numa{numnodes}=$maxnode+1;
+ $numa{numcores}=$maxcpu+1;
+ return %numa;
+}