mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
870568b390
Jürgen Mell reported an FPU state corruption bug under CONFIG_PREEMPT, and bisected it to commit v2.6.19-1363-gacc2076, "i386: add sleazy FPU optimization". Add tsk_used_math() checks to prevent calling math_state_restore() which can sleep in the case of !tsk_used_math(). This prevents making a blocking call in __switch_to(). Apparently "fpu_counter > 5" check is not enough, as in some signal handling and fork/exec scenarios, fpu_counter > 5 and !tsk_used_math() is possible. It's a side effect though. This is the failing scenario: process 'A' in save_i387_ia32() just after clear_used_math() Got an interrupt and pre-empted out. At the next context switch to process 'A' again, kernel tries to restore the math state proactively and sees a fpu_counter > 0 and !tsk_used_math() This results in init_fpu() during the __switch_to()'s math_state_restore() And resulting in fpu corruption which will be saved/restored (save_i387_fxsave and restore_i387_fxsave) during the remaining part of the signal handling after the context switch. Bisected-by: Jürgen Mell <j.mell@t-online.de> Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Tested-by: Jürgen Mell <j.mell@t-online.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: stable@kernel.org |
||
---|---|---|
.. | ||
acpi | ||
cpu | ||
.gitignore | ||
alternative.c | ||
aperture_64.c | ||
apic_32.c | ||
apic_64.c | ||
apm_32.c | ||
asm-offsets_32.c | ||
asm-offsets_64.c | ||
asm-offsets.c | ||
audit_64.c | ||
bootflag.c | ||
bugs_64.c | ||
cpuid.c | ||
crash_dump_32.c | ||
crash_dump_64.c | ||
crash.c | ||
doublefault_32.c | ||
ds.c | ||
e820_32.c | ||
e820_64.c | ||
early_printk.c | ||
early-quirks.c | ||
efi_32.c | ||
efi_64.c | ||
efi_stub_32.S | ||
efi_stub_64.S | ||
efi.c | ||
entry_32.S | ||
entry_64.S | ||
genapic_64.c | ||
genapic_flat_64.c | ||
genx2apic_uv_x.c | ||
geode_32.c | ||
head32.c | ||
head64.c | ||
head_32.S | ||
head_64.S | ||
hpet.c | ||
i386_ksyms_32.c | ||
i387.c | ||
i8237.c | ||
i8253.c | ||
i8259_32.c | ||
i8259_64.c | ||
init_task.c | ||
io_apic_32.c | ||
io_apic_64.c | ||
io_delay.c | ||
ioport.c | ||
ipi.c | ||
irq_32.c | ||
irq_64.c | ||
k8.c | ||
kdebugfs.c | ||
kgdb.c | ||
kprobes.c | ||
kvm.c | ||
kvmclock.c | ||
ldt.c | ||
machine_kexec_32.c | ||
machine_kexec_64.c | ||
Makefile | ||
mca_32.c | ||
mfgpt_32.c | ||
microcode.c | ||
mmconf-fam10h_64.c | ||
module_32.c | ||
module_64.c | ||
mpparse.c | ||
msr.c | ||
nmi_32.c | ||
nmi_64.c | ||
numaq_32.c | ||
olpc.c | ||
paravirt_patch_32.c | ||
paravirt_patch_64.c | ||
paravirt.c | ||
pci-calgary_64.c | ||
pci-dma.c | ||
pci-gart_64.c | ||
pci-nommu.c | ||
pci-swiotlb_64.c | ||
pcspeaker.c | ||
pmtimer_64.c | ||
process_32.c | ||
process_64.c | ||
process.c | ||
ptrace.c | ||
quirks.c | ||
reboot_fixups_32.c | ||
reboot.c | ||
relocate_kernel_32.S | ||
relocate_kernel_64.S | ||
rtc.c | ||
scx200_32.c | ||
setup64.c | ||
setup_32.c | ||
setup_64.c | ||
setup.c | ||
sigframe.h | ||
signal_32.c | ||
signal_64.c | ||
smp.c | ||
smpboot.c | ||
smpcommon_32.c | ||
smpcommon.c | ||
srat_32.c | ||
stacktrace.c | ||
step.c | ||
summit_32.c | ||
sys_i386_32.c | ||
sys_x86_64.c | ||
syscall_64.c | ||
syscall_table_32.S | ||
tce_64.c | ||
test_nx.c | ||
test_rodata.c | ||
time_32.c | ||
time_64.c | ||
tlb_32.c | ||
tlb_64.c | ||
tls.c | ||
tls.h | ||
topology.c | ||
trampoline_32.S | ||
trampoline_64.S | ||
trampoline.c | ||
traps_32.c | ||
traps_64.c | ||
tsc_32.c | ||
tsc_64.c | ||
tsc_sync.c | ||
verify_cpu_64.S | ||
vm86_32.c | ||
vmi_32.c | ||
vmiclock_32.c | ||
vmlinux_32.lds.S | ||
vmlinux_64.lds.S | ||
vmlinux.lds.S | ||
vsmp_64.c | ||
vsyscall_64.c | ||
x8664_ksyms_64.c |