18374d89e5
John Blackwood reported: > on an older Dell PowerEdge 6650 system with 8 cpus (4 are hyper-threaded), > and 32 bit (x86) kernel, once you change the irq smp_affinity of an irq > to be less than all cpus in the system, you can never change really the > irq smp_affinity back to be all cpus in the system (0xff) again, > even though no error status is returned on the "/bin/echo ff > > /proc/irq/[n]/smp_affinity" operation. > > This is due to that fact that BAD_APICID has the same value as > all cpus (0xff) on 32bit kernels, and thus the value returned from > set_desc_affinity() via the cpu_mask_to_apicid_and() function is treated > as a failure in set_ioapic_affinity_irq_desc(), and no affinity changes > are made. set_desc_affinity() is already checking if the incoming cpu mask intersects with the cpu online mask or not. So there is no need for the apic op cpu_mask_to_apicid_and() to check again and return BAD_APICID. Remove the BAD_APICID return value from cpu_mask_to_apicid_and() and also fix set_desc_affinity() to return -1 instead of using BAD_APICID to represent error conditions (as cpu_mask_to_apicid_and() can return logical or physical apicid values and BAD_APICID is really to represent bad physical apic id). Reported-by: John Blackwood <john.blackwood@ccur.com> Root-caused-by: John Blackwood <john.blackwood@ccur.com> Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> LKML-Reference: <1261103386.2535.409.camel@sbs-t61> Signed-off-by: H. Peter Anvin <hpa@zytor.com> |
||
---|---|---|
.. | ||
acpi | ||
apic | ||
cpu | ||
.gitignore | ||
Makefile | ||
alternative.c | ||
amd_iommu.c | ||
amd_iommu_init.c | ||
aperture_64.c | ||
apm_32.c | ||
asm-offsets.c | ||
asm-offsets_32.c | ||
asm-offsets_64.c | ||
audit_64.c | ||
bios_uv.c | ||
bootflag.c | ||
check.c | ||
cpuid.c | ||
crash.c | ||
crash_dump_32.c | ||
crash_dump_64.c | ||
doublefault_32.c | ||
ds.c | ||
ds_selftest.c | ||
ds_selftest.h | ||
dumpstack.c | ||
dumpstack.h | ||
dumpstack_32.c | ||
dumpstack_64.c | ||
e820.c | ||
early-quirks.c | ||
early_printk.c | ||
efi.c | ||
efi_32.c | ||
efi_64.c | ||
efi_stub_32.S | ||
efi_stub_64.S | ||
entry_32.S | ||
entry_64.S | ||
ftrace.c | ||
geode_32.c | ||
head.c | ||
head32.c | ||
head64.c | ||
head_32.S | ||
head_64.S | ||
hpet.c | ||
hw_breakpoint.c | ||
i386_ksyms_32.c | ||
i387.c | ||
i8237.c | ||
i8253.c | ||
i8259.c | ||
init_task.c | ||
io_delay.c | ||
ioport.c | ||
irq.c | ||
irq_32.c | ||
irq_64.c | ||
irqinit.c | ||
k8.c | ||
kdebugfs.c | ||
kgdb.c | ||
kprobes.c | ||
kvm.c | ||
kvmclock.c | ||
ldt.c | ||
machine_kexec_32.c | ||
machine_kexec_64.c | ||
mca_32.c | ||
mfgpt_32.c | ||
microcode_amd.c | ||
microcode_core.c | ||
microcode_intel.c | ||
mmconf-fam10h_64.c | ||
module.c | ||
mpparse.c | ||
mrst.c | ||
msr.c | ||
olpc.c | ||
paravirt-spinlocks.c | ||
paravirt.c | ||
paravirt_patch_32.c | ||
paravirt_patch_64.c | ||
pci-calgary_64.c | ||
pci-dma.c | ||
pci-gart_64.c | ||
pci-nommu.c | ||
pci-swiotlb.c | ||
pcspeaker.c | ||
pmtimer_64.c | ||
probe_roms_32.c | ||
process.c | ||
process_32.c | ||
process_64.c | ||
ptrace.c | ||
pvclock.c | ||
quirks.c | ||
reboot.c | ||
reboot_fixups_32.c | ||
relocate_kernel_32.S | ||
relocate_kernel_64.S | ||
rtc.c | ||
scx200_32.c | ||
setup.c | ||
setup_percpu.c | ||
sfi.c | ||
signal.c | ||
smp.c | ||
smpboot.c | ||
stacktrace.c | ||
step.c | ||
sys_i386_32.c | ||
sys_x86_64.c | ||
syscall_64.c | ||
syscall_table_32.S | ||
tboot.c | ||
tce_64.c | ||
test_nx.c | ||
test_rodata.c | ||
time.c | ||
tlb_uv.c | ||
tls.c | ||
tls.h | ||
topology.c | ||
trampoline.c | ||
trampoline_32.S | ||
trampoline_64.S | ||
traps.c | ||
tsc.c | ||
tsc_sync.c | ||
uv_irq.c | ||
uv_sysfs.c | ||
uv_time.c | ||
verify_cpu_64.S | ||
visws_quirks.c | ||
vm86_32.c | ||
vmi_32.c | ||
vmiclock_32.c | ||
vmlinux.lds.S | ||
vsmp_64.c | ||
vsyscall_64.c | ||
x86_init.c | ||
x8664_ksyms_64.c | ||
xsave.c |