diff --git a/arch/x86_64/tools/mcreboot-smp-x86.sh.in b/arch/x86_64/tools/mcreboot-smp-x86.sh.in index e955af4b..e07b0140 100644 --- a/arch/x86_64/tools/mcreboot-smp-x86.sh.in +++ b/arch/x86_64/tools/mcreboot-smp-x86.sh.in @@ -97,6 +97,18 @@ error_exit() { local status=$1 case $status in + irqbalance_mck_started) + if [ "${irqbalance_used}" == "yes" ]; then + if [ "`systemctl status irqbalance_mck.service 2> /dev/null |grep -E 'Active: active'`" != "" ]; then + if ! systemctl stop irqbalance_mck.service 2>/dev/null; then + echo "warning: failed to stop irqbalance_mck" >&2 + fi + if ! systemctl disable irqbalance_mck.service >/dev/null 2>/dev/null; then + echo "warning: failed to disable irqbalance_mck" >&2 + fi + fi + fi + ;& mcos_sys_mounted) if [ "$enable_mcoverlay" == "yes" ]; then umount /tmp/mcos/mcos0_sys @@ -163,21 +175,19 @@ error_exit() { ihk_loaded) rmmod ihk 2>/dev/null || echo "warning: failed to remove ihk" >&2 ;& - irqbalance_stopped) + smp_affinity_modified) umask $umask_old - if [ "`systemctl status irqbalance_mck.service 2> /dev/null |grep -E 'Active: active'`" != "" ]; then - if ! systemctl stop irqbalance_mck.service 2>/dev/null; then - echo "warning: failed to stop irqbalance_mck" >&2 - fi - if ! systemctl disable irqbalance_mck.service >/dev/null 2>/dev/null; then - echo "warning: failed to disable irqbalance_mck" >&2 - fi - if ! perl -e '$tmpdir="/tmp/mcreboot"; @files = grep { -f } glob "$tmpdir/proc/irq/*/smp_affinity"; foreach $file (@files) { $dest = substr($file, length($tmpdir)); if (1) {print "cp $file $dest\n";} system("cp $file $dest 2>/dev/null"); }'; then - echo "warning: failed to restore /proc/irq/*/smp_affinity" >&2 - fi - if ! systemctl start irqbalance.service; then - echo "warning: failed to start irqbalance" >&2; - fi + if [ "${irqbalance_used}" == "yes" ]; then + if ! perl -e '$tmpdir="/tmp/mcreboot"; @files = grep { -f } glob "$tmpdir/proc/irq/*/smp_affinity"; foreach $file (@files) { $dest = substr($file, length($tmpdir)); if (0) {print "cp $file $dest\n";} system("cp $file $dest 2>/dev/null"); }'; then + echo "warning: failed to restore /proc/irq/*/smp_affinity" >&2 + fi + fi + ;& + irqbalance_stopped) + if [ "${irqbalance_used}" == "yes" ]; then + if ! systemctl start irqbalance.service; then + echo "warning: failed to start irqbalance" >&2; + fi fi ;& initial) @@ -249,7 +259,7 @@ if [ "${irqbalance_used}" == "yes" ]; then if ! perl -e 'use File::Copy qw(copy); $tmpdir="/tmp/mcreboot"; @files = grep { -f } glob "/proc/irq/*/smp_affinity"; foreach $file (@files) { $rel = substr($file, 1); $dir = substr($rel, 0, length($rel) - length("/smp_affinity")); if (system("mkdir -p $tmpdir/$dir")) { exit 1; } if (0) { print "cp $file $tmpdir/$rel\n"; } if (!copy($file,"$tmpdir/$rel")) { exit 1; } }'; then echo "error: saving /proc/irq/*/smp_affinity" >&2 - error_exit "mcos_sys_mounted" + error_exit "irqbalance_stopped" fi; # Prevent /proc/irq/*/smp_affinity from getting zero after offlining @@ -263,9 +273,8 @@ if [ "${irqbalance_used}" == "yes" ]; then if ! ncpus=$ncpus smp_affinity_mask=$smp_affinity_mask perl -e '@dirs = grep { -d } glob "/proc/irq/*"; foreach $dir (@dirs) { $hit = 0; $affinity_str = `cat $dir/smp_affinity`; chomp $affinity_str; @int32strs = split /,/, $affinity_str; @int32strs_mask=split /,/, $ENV{'smp_affinity_mask'}; for($i=0;$i <= $#int32strs_mask; $i++) { $int32strs_inv[$i] = sprintf("%08x",hex($int32strs_mask[$i])^0xffffffff); if($i == 0) { $len = int((($ENV{'ncpus'}%32)+3)/4); if($len != 0) { $int32strs_inv[$i] = substr($int32strs_inv[$i], -$len, $len); } } } $inv = join(",", @int32strs_inv); $nint32s = int(($ENV{'ncpus'}+31)/32); for($j = $nint32s - 1; $j >= 0; $j--) { if(hex($int32strs[$nint32s - 1 - $j]) & hex($int32strs_mask[$nint32s - 1 - $j])) { $hit = 1; }} if($hit == 1) { $cmd = "echo $inv > $dir/smp_affinity 2>/dev/null"; system $cmd;}}'; then echo "error: modifying /proc/irq/*/smp_affinity" >&2 - error_exit "mcos_sys_mounted" + error_exit "irqbalance_stopped" fi - fi # Set umask so that proc/sys files/directories created by @@ -277,7 +286,7 @@ umask 0`printf "%o" ${umask_dec}` if ! grep -E 'ihk\s' /proc/modules &>/dev/null; then if ! taskset -c 0 insmod ${KMODDIR}/ihk.ko 2>/dev/null; then echo "error: loading ihk" >&2 - error_exit "irqbalance_stopped" + error_exit "smp_affinity_modified" fi fi