Commit c7cb7548 authored by leoliu-oc's avatar leoliu-oc Committed by LeoLiu-oc
Browse files

x86/hpet: Read HPET directly if panic in progress

zhaoxin inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IA6NHA


CVE: NA

-------------------

When the clocksource of the system is HPET,a CPU executing read_hpet
might be interrupted by #GP/#PF to executing the panic,this may lead to
read_hpet dead loops:

CPU x				    CPU x
----                                ----
read_hpet()
  arch_spin_trylock(&hpet.lock)
  [CPU x got the hpet.lock]         #GP/#PF happened
                                    panic()
                                      kmsg_dump()
                                        pstore_dump()
                                          pstore_record_init()
                                            ktime_get_real_fast_ns()
                                              read_hpet()
                                              [dead loops]

To avoid this dead loops, read HPET directly if panic in progress.

Signed-off-by: default avatarleoliu-oc <leoliu-oc@zhaoxin.com>
parent fac11126
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -804,6 +804,12 @@ static u64 read_hpet(struct clocksource *cs)
	if (in_nmi())
		return (u64)hpet_readl(HPET_COUNTER);

	/*
	 * Read HPET directly if panic in progress.
	 */
	if (unlikely(atomic_read(&panic_cpu) != PANIC_CPU_INVALID))
		return (u64)hpet_readl(HPET_COUNTER);

	/*
	 * Read the current state of the lock and HPET value atomically.
	 */