]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
22da7b3d BG |
2 | #ifndef _ASM_X86_HARDIRQ_H |
3 | #define _ASM_X86_HARDIRQ_H | |
4 | ||
5 | #include <linux/threads.h> | |
22da7b3d BG |
6 | |
7 | typedef struct { | |
65ca1d1d | 8 | u16 __softirq_pending; |
64947f95 NS |
9 | #if IS_ENABLED(CONFIG_KVM_INTEL) |
10 | u8 kvm_cpu_l1tf_flush_l1d; | |
11 | #endif | |
22da7b3d | 12 | unsigned int __nmi_count; /* arch dependent */ |
2de3a5f7 BG |
13 | #ifdef CONFIG_X86_LOCAL_APIC |
14 | unsigned int apic_timer_irqs; /* arch dependent */ | |
15 | unsigned int irq_spurious_count; | |
b49d7d87 | 16 | unsigned int icr_read_retry_count; |
d78f2664 YZ |
17 | #endif |
18 | #ifdef CONFIG_HAVE_KVM | |
19 | unsigned int kvm_posted_intr_ipis; | |
f6b3c72c | 20 | unsigned int kvm_posted_intr_wakeup_ipis; |
210f84b0 | 21 | unsigned int kvm_posted_intr_nested_ipis; |
2de3a5f7 | 22 | #endif |
4a4de9c7 | 23 | unsigned int x86_platform_ipis; /* arch dependent */ |
bfe2a3c3 | 24 | unsigned int apic_perf_irqs; |
e360adbe | 25 | unsigned int apic_irq_work_irqs; |
2de3a5f7 | 26 | #ifdef CONFIG_SMP |
22da7b3d BG |
27 | unsigned int irq_resched_count; |
28 | unsigned int irq_call_count; | |
2de3a5f7 | 29 | #endif |
ce4a4e56 | 30 | unsigned int irq_tlb_count; |
0444c9bd | 31 | #ifdef CONFIG_X86_THERMAL_VECTOR |
22da7b3d | 32 | unsigned int irq_thermal_count; |
0444c9bd JB |
33 | #endif |
34 | #ifdef CONFIG_X86_MCE_THRESHOLD | |
22da7b3d | 35 | unsigned int irq_threshold_count; |
2de3a5f7 | 36 | #endif |
24fd78a8 AG |
37 | #ifdef CONFIG_X86_MCE_AMD |
38 | unsigned int irq_deferred_error_count; | |
39 | #endif | |
7ff42473 | 40 | #if IS_ENABLED(CONFIG_HYPERV) || defined(CONFIG_XEN) |
929320e4 TG |
41 | unsigned int irq_hv_callback_count; |
42 | #endif | |
22da7b3d BG |
43 | } ____cacheline_aligned irq_cpustat_t; |
44 | ||
9b8de747 | 45 | DECLARE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat); |
22da7b3d | 46 | |
22da7b3d BG |
47 | #define __ARCH_IRQ_STAT |
48 | ||
c6ae41e7 | 49 | #define inc_irq_stat(member) this_cpu_inc(irq_stat.member) |
22da7b3d | 50 | |
c6ae41e7 | 51 | #define local_softirq_pending() this_cpu_read(irq_stat.__softirq_pending) |
22da7b3d BG |
52 | |
53 | #define __ARCH_SET_SOFTIRQ_PENDING | |
54 | ||
c6ae41e7 AS |
55 | #define set_softirq_pending(x) \ |
56 | this_cpu_write(irq_stat.__softirq_pending, (x)) | |
57 | #define or_softirq_pending(x) this_cpu_or(irq_stat.__softirq_pending, (x)) | |
22da7b3d BG |
58 | |
59 | extern void ack_bad_irq(unsigned int irq); | |
a2eddfa9 JB |
60 | |
61 | extern u64 arch_irq_stat_cpu(unsigned int cpu); | |
62 | #define arch_irq_stat_cpu arch_irq_stat_cpu | |
63 | ||
64 | extern u64 arch_irq_stat(void); | |
65 | #define arch_irq_stat arch_irq_stat | |
22da7b3d | 66 | |
64947f95 NS |
67 | |
68 | #if IS_ENABLED(CONFIG_KVM_INTEL) | |
69 | static inline void kvm_set_cpu_l1tf_flush_l1d(void) | |
70 | { | |
71 | __this_cpu_write(irq_stat.kvm_cpu_l1tf_flush_l1d, 1); | |
72 | } | |
73 | ||
74 | static inline void kvm_clear_cpu_l1tf_flush_l1d(void) | |
75 | { | |
76 | __this_cpu_write(irq_stat.kvm_cpu_l1tf_flush_l1d, 0); | |
77 | } | |
78 | ||
79 | static inline bool kvm_get_cpu_l1tf_flush_l1d(void) | |
80 | { | |
81 | return __this_cpu_read(irq_stat.kvm_cpu_l1tf_flush_l1d); | |
82 | } | |
83 | #else /* !IS_ENABLED(CONFIG_KVM_INTEL) */ | |
84 | static inline void kvm_set_cpu_l1tf_flush_l1d(void) { } | |
85 | #endif /* IS_ENABLED(CONFIG_KVM_INTEL) */ | |
86 | ||
22da7b3d | 87 | #endif /* _ASM_X86_HARDIRQ_H */ |