blob: 6650175faba383e6c0fb4e22d854935ca0e6f779 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
#!/bin/bash
#
# CLI back-end script to manipulate NIC interrupt CPU affinity.
#
# Provides sub-commands to:
# - Check the validity of an interface name and affinity mask value
# - Set the affinity mask to the IRQ being used by an interface
# - Reset the affinity mask of the IRQ being used by an interface to the
# system default value of all-ones.
# - 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
print_usage()
{
echo "Usage:"
echo -e "\t$0 check <ifname> <mask>"
echo -e "\t$0 set <ifname> <mask>"
echo -e "\t$0 reset <ifname>"
echo -e "\t$0 print <ifname>"
}
get_irqnum()
{
irqnum=`find /proc/irq -name $1 -print | awk -F / '{ print $4 }'`
if [ -z "$irqnum" ]; then
echo "Invalid interface name: $1"
return 1
fi
return 0
}
get_mask()
{
mask=$1
# mask must be a short hex value
if [ ${#mask} -gt $MAX_MASK ]; then
echo "mask too long: ${#2} characters."
return 1
fi
# strip out all the hex digits
exmask=`echo $mask | sed -e s/[0-9a-f]//g`
# if anything is left, its not hex
if [ ! -z "$exmask" ]; then
echo "Invalid characters in hex mask: $exmask"
return 1
fi
return 0
}
case "$1" in
check)
if [ $# -ne 3 ]; then
print_usage
exit 1
fi
if ! get_irqnum $2 ; then
exit 1
fi
if ! get_mask $3 ; then
exit 1
fi
exit 0
;;
set)
if [ $# -ne 3 ]; then
print_usage
exit 1
fi
if ! get_irqnum $2 ; then
exit 1
fi
if ! get_mask $3 ; then
exit 1
fi
echo $mask > /proc/irq/$irqnum/smp_affinity
if [ $? -ne 0 ]; then
echo "Couldn't assign smp_affinity. Exit status: $?"
exit 1
fi
;;
reset)
if [ $# -ne 2 ]; then
print_usage
exit 1
fi
if ! get_irqnum $2 ; then
exit 1
fi
echo $DEFAULT_MASK > /proc/irq/$irqnum/smp_affinity
if [ $? -ne 0 ]; then
echo "Couldn't assign smp_affinity. Exit status: $?"
exit 1
fi
;;
print)
if [ $# -ne 2 ]; then
print_usage
exit 1
fi
if ! get_irqnum $2 ; then
exit 1
fi
mask=`cat /proc/irq/$irqnum/smp_affinity`
if [ -z $mask ]; then
echo "Couldn't get smp_affinity for interface $2, irq $irqnum"
exit 1
fi
echo "Interface $2 is using IRQ: $irqnum"
echo "SMP affinity mask for IRQ $irqnum is: $mask"
;;
*)
print_usage
exit 1
;;
esac
|