Back to home page

LXR

 
 

    


0001 ChangeLog:
0002         Started by Ingo Molnar <mingo@redhat.com>
0003         Update by Max Krasnyansky <maxk@qualcomm.com>
0004 
0005 SMP IRQ affinity
0006 
0007 /proc/irq/IRQ#/smp_affinity and /proc/irq/IRQ#/smp_affinity_list specify
0008 which target CPUs are permitted for a given IRQ source.  It's a bitmask
0009 (smp_affinity) or cpu list (smp_affinity_list) of allowed CPUs.  It's not
0010 allowed to turn off all CPUs, and if an IRQ controller does not support
0011 IRQ affinity then the value will not change from the default of all cpus.
0012 
0013 /proc/irq/default_smp_affinity specifies default affinity mask that applies
0014 to all non-active IRQs. Once IRQ is allocated/activated its affinity bitmask
0015 will be set to the default mask. It can then be changed as described above.
0016 Default mask is 0xffffffff.
0017 
0018 Here is an example of restricting IRQ44 (eth1) to CPU0-3 then restricting
0019 it to CPU4-7 (this is an 8-CPU SMP box):
0020 
0021 [root@moon 44]# cd /proc/irq/44
0022 [root@moon 44]# cat smp_affinity
0023 ffffffff
0024 
0025 [root@moon 44]# echo 0f > smp_affinity
0026 [root@moon 44]# cat smp_affinity
0027 0000000f
0028 [root@moon 44]# ping -f h
0029 PING hell (195.4.7.3): 56 data bytes
0030 ...
0031 --- hell ping statistics ---
0032 6029 packets transmitted, 6027 packets received, 0% packet loss
0033 round-trip min/avg/max = 0.1/0.1/0.4 ms
0034 [root@moon 44]# cat /proc/interrupts | grep 'CPU\|44:'
0035            CPU0       CPU1       CPU2       CPU3      CPU4       CPU5        CPU6       CPU7
0036  44:       1068       1785       1785       1783         0          0           0         0    IO-APIC-level  eth1
0037 
0038 As can be seen from the line above IRQ44 was delivered only to the first four
0039 processors (0-3).
0040 Now lets restrict that IRQ to CPU(4-7).
0041 
0042 [root@moon 44]# echo f0 > smp_affinity
0043 [root@moon 44]# cat smp_affinity
0044 000000f0
0045 [root@moon 44]# ping -f h
0046 PING hell (195.4.7.3): 56 data bytes
0047 ..
0048 --- hell ping statistics ---
0049 2779 packets transmitted, 2777 packets received, 0% packet loss
0050 round-trip min/avg/max = 0.1/0.5/585.4 ms
0051 [root@moon 44]# cat /proc/interrupts |  'CPU\|44:'
0052            CPU0       CPU1       CPU2       CPU3      CPU4       CPU5        CPU6       CPU7
0053  44:       1068       1785       1785       1783      1784       1069        1070       1069   IO-APIC-level  eth1
0054 
0055 This time around IRQ44 was delivered only to the last four processors.
0056 i.e counters for the CPU0-3 did not change.
0057 
0058 Here is an example of limiting that same irq (44) to cpus 1024 to 1031:
0059 
0060 [root@moon 44]# echo 1024-1031 > smp_affinity_list
0061 [root@moon 44]# cat smp_affinity_list
0062 1024-1031
0063 
0064 Note that to do this with a bitmask would require 32 bitmasks of zero
0065 to follow the pertinent one.