summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Gilligan <gilligan@vyatta.com>2008-02-26 16:51:45 -0800
committerBob Gilligan <gilligan@vyatta.com>2008-02-26 16:51:45 -0800
commit79eb089b0d3463823f0a1fba1376842e3eb8aa47 (patch)
tree1024425cd6647dfd23bc02d4ed5fb7263c27c2f7
parenta77ffd90c19a203b5d0ebcc413c9f8f5b3b86a04 (diff)
downloadvyatta-cfg-79eb089b0d3463823f0a1fba1376842e3eb8aa47.tar.gz
vyatta-cfg-79eb089b0d3463823f0a1fba1376842e3eb8aa47.zip
Bugfix: 2653
Only allow setting SMP affinity on multiprocessor machines.
-rw-r--r--scripts/vyatta-irqaffin47
-rw-r--r--templates/interfaces/ethernet/node.tag/smp_affinity/node.def2
2 files changed, 35 insertions, 14 deletions
diff --git a/scripts/vyatta-irqaffin b/scripts/vyatta-irqaffin
index 1f63ebe..8be98b2 100644
--- a/scripts/vyatta-irqaffin
+++ b/scripts/vyatta-irqaffin
@@ -34,12 +34,15 @@
# - Print the affinity mask of the IRQ being used by an interface
#
-# The default "all-ones" IRQ affinity mask. Used in the "reset" sub-command.
-DEFAULT_MASK=ffff
-
# Max number of hex characters in an IRQ affinity mask. Support up to 16 CPUs.
MAX_MASK=4
+# Set up some global values...
+numcpus=`grep -c -e "^processor" /proc/cpuinfo`
+declare -i maxmask=(2**numcpus)
+let maxmask=maxmask-1
+maxmaskhex=`printf "%x" ${maxmask}`
+
print_usage()
{
echo "Usage:"
@@ -78,23 +81,17 @@ get_mask()
return 1
fi
+ declare -i intmask=0x${mask}
+
# Make sure that mask holds at least one bit, and holds no more bits
# than we have CPUs.
- if [ ${mask} -eq 0 ]; then
+ if [ ${intmask} -eq 0 ]; then
echo "Mask can not be 0."
return 1
fi
- numcpus=`grep -c -e "^processor" /proc/cpuinfo`
-
- declare -i maxmask=(2**numcpus)
- let maxmask=maxmask-1
-
- declare -i intmask=0x${mask}
-
if [ $intmask -gt $maxmask ]; then
- maxmaskhex=`printf "%x" ${maxmask}`
echo "Mask is too large. Maximum hexidecimal bitmask is: ${maxmaskhex}"
return 1
fi
@@ -102,6 +99,21 @@ get_mask()
return 0
}
+
+#
+# Don't waste our time with uniprocessor machines
+#
+check_uniproc()
+{
+ if [ $maxmask -eq 1 ]; then
+ echo "This machine has only 1 CPU."
+ echo "Can only set SMP affinity on multi-processor machines"
+ return 1;
+ fi
+ return 0
+}
+
+
case "$1" in
check)
if [ $# -ne 3 ]; then
@@ -109,6 +121,10 @@ case "$1" in
exit 1
fi
+ if ! check_uniproc ; then
+ exit 1
+ fi
+
if ! get_irqnum $2 ; then
exit 1
fi
@@ -124,6 +140,11 @@ case "$1" in
print_usage
exit 1
fi
+
+ if ! check_uniproc ; then
+ exit 1
+ fi
+
if ! get_irqnum $2 ; then
exit 1
fi
@@ -149,7 +170,7 @@ case "$1" in
exit 1
fi
- echo $DEFAULT_MASK > /proc/irq/$irqnum/smp_affinity
+ echo $maxmaskhex > /proc/irq/$irqnum/smp_affinity
if [ $? -ne 0 ]; then
echo "Couldn't assign smp_affinity. Exit status: $?"
exit 1
diff --git a/templates/interfaces/ethernet/node.tag/smp_affinity/node.def b/templates/interfaces/ethernet/node.tag/smp_affinity/node.def
index edc78de..850d1c1 100644
--- a/templates/interfaces/ethernet/node.tag/smp_affinity/node.def
+++ b/templates/interfaces/ethernet/node.tag/smp_affinity/node.def
@@ -19,4 +19,4 @@ syntax:expression: exec "/opt/vyatta/sbin/vyatta-irqaffin check $VAR(../@) $VAR(
create:expression: "sudo /opt/vyatta/sbin/vyatta-irqaffin set $VAR(../@) $VAR(@)"; "Error setting CPU affinity mask $VAR(@) on interface $VAR(../@)"
-delete:expression: "sudo /opt/vyatta/sbin/vyatta-irqaffin reset (../@)"; "Error deleting CPU affinity mask on interface $VAR(../@)"
+delete:expression: "sudo /opt/vyatta/sbin/vyatta-irqaffin reset $VAR(../@)"; "Error deleting CPU affinity mask on interface $VAR(../@)"