linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/6] x86/irq: trap and interrupt cleanups
@ 2021-05-11  0:55 H. Peter Anvin
  2021-05-11  0:55 ` [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h> H. Peter Anvin
                   ` (5 more replies)
  0 siblings, 6 replies; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11  0:55 UTC (permalink / raw)
  To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List, H. Peter Anvin (Intel)

From: "H. Peter Anvin (Intel)" <hpa@zytor.com>

A collection of trap/interrupt-related patches, almost all
cleanups. The only patches that should have any possible effect at all
are:

4/6 - x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]

	This patch reverses kvm_set_cpu_l1tf_flush_l1d() and
	__irq_enter_raw() in DEFINE_IDTENTRY_SYSVEC_SIMPLE() in order
	to be able to unify the code with DEFINE_IDTENTRY_SYSVEC().

	The reason for unification is mainly to avoid the possibility
	of inadvertent divergence rather than the rather modest amount
	of code.

5/6 - x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt

	This condition is believed to be impossible after many
	improvements to the IRQ vector allocation code since this
	function was written. Per discussion with tglx, add a
	WARN_ONCE() if this happens as a first step towards excising
	this hack.

--- 
    x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h>
    x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS
    x86/idt: remove address argument to idt_invalidate()
    x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
    x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt
    x86/irq: remove unused vectors from <asm/irq_vectors.h>

 arch/x86/include/asm/desc.h              |  2 +-
 arch/x86/include/asm/idtentry.h          | 39 +++++++++++++++++---------------
 arch/x86/include/asm/irq_vectors.h       |  7 ++++--
 arch/x86/include/asm/trapnr.h            |  1 +
 arch/x86/kernel/apic/vector.c            |  5 ++++
 arch/x86/kernel/idt.c                    |  5 ++--
 arch/x86/kernel/machine_kexec_32.c       |  4 ++--
 arch/x86/kernel/reboot.c                 |  2 +-
 tools/arch/x86/include/asm/irq_vectors.h |  7 ++++--
 9 files changed, 43 insertions(+), 29 deletions(-)

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h>
  2021-05-11  0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
@ 2021-05-11  0:55 ` H. Peter Anvin
  2021-05-14 22:53   ` Andy Lutomirski
  2021-05-11  0:55 ` [PATCH 2/6] x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS H. Peter Anvin
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11  0:55 UTC (permalink / raw)
  To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List, H. Peter Anvin (Intel)

From: "H. Peter Anvin (Intel)" <hpa@zytor.com>

The x86 architecture supports up to 32 trap vectors. Add that constant
to <asm/trapnr.h>.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
 arch/x86/include/asm/trapnr.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/x86/include/asm/trapnr.h b/arch/x86/include/asm/trapnr.h
index f5d2325aa0b7..f0baf92da20b 100644
--- a/arch/x86/include/asm/trapnr.h
+++ b/arch/x86/include/asm/trapnr.h
@@ -27,6 +27,7 @@
 #define X86_TRAP_VE		20	/* Virtualization Exception */
 #define X86_TRAP_CP		21	/* Control Protection Exception */
 #define X86_TRAP_VC		29	/* VMM Communication Exception */
+#define X86_NR_HW_TRAPS		32	/* Max hardware trap number */
 #define X86_TRAP_IRET		32	/* IRET Exception */
 
 #endif
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 2/6] x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS
  2021-05-11  0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
  2021-05-11  0:55 ` [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h> H. Peter Anvin
@ 2021-05-11  0:55 ` H. Peter Anvin
  2021-05-14 22:53   ` Andy Lutomirski
  2021-05-11  0:55 ` [PATCH 3/6] x86/idt: remove address argument to idt_invalidate() H. Peter Anvin
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11  0:55 UTC (permalink / raw)
  To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List, H. Peter Anvin (Intel)

From: "H. Peter Anvin (Intel)" <hpa@zytor.com>

Add defines for the number of external vectors and number of system
vectors instead of requiring the use of (FIRST_SYSTEM_VECTOR -
FIRST_EXTERNAL_VECTOR) and (NR_VECTORS - FIRST_SYSTEM_VECTOR)
respectively.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
 arch/x86/include/asm/idtentry.h          | 4 ++--
 arch/x86/include/asm/irq_vectors.h       | 3 +++
 tools/arch/x86/include/asm/irq_vectors.h | 3 +++
 3 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
index 73d45b0dfff2..c03a18cac78e 100644
--- a/arch/x86/include/asm/idtentry.h
+++ b/arch/x86/include/asm/idtentry.h
@@ -504,7 +504,7 @@ __visible noinstr void func(struct pt_regs *regs,			\
 	.align 8
 SYM_CODE_START(irq_entries_start)
     vector=FIRST_EXTERNAL_VECTOR
-    .rept (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
+    .rept NR_EXTERNAL_VECTORS
 	UNWIND_HINT_IRET_REGS
 0 :
 	.byte	0x6a, vector
@@ -520,7 +520,7 @@ SYM_CODE_END(irq_entries_start)
 	.align 8
 SYM_CODE_START(spurious_entries_start)
     vector=FIRST_SYSTEM_VECTOR
-    .rept (NR_VECTORS - FIRST_SYSTEM_VECTOR)
+    .rept NR_SYSTEM_VECTORS
 	UNWIND_HINT_IRET_REGS
 0 :
 	.byte	0x6a, vector
diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h
index 889f8b1b5b7f..d2ef35927770 100644
--- a/arch/x86/include/asm/irq_vectors.h
+++ b/arch/x86/include/asm/irq_vectors.h
@@ -114,6 +114,9 @@
 #define FIRST_SYSTEM_VECTOR		NR_VECTORS
 #endif
 
+#define NR_EXTERNAL_VECTORS		(FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
+#define NR_SYSTEM_VECTORS		(NR_VECTORS - FIRST_SYSTEM_VECTOR)
+
 /*
  * Size the maximum number of interrupts.
  *
diff --git a/tools/arch/x86/include/asm/irq_vectors.h b/tools/arch/x86/include/asm/irq_vectors.h
index 889f8b1b5b7f..d2ef35927770 100644
--- a/tools/arch/x86/include/asm/irq_vectors.h
+++ b/tools/arch/x86/include/asm/irq_vectors.h
@@ -114,6 +114,9 @@
 #define FIRST_SYSTEM_VECTOR		NR_VECTORS
 #endif
 
+#define NR_EXTERNAL_VECTORS		(FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
+#define NR_SYSTEM_VECTORS		(NR_VECTORS - FIRST_SYSTEM_VECTOR)
+
 /*
  * Size the maximum number of interrupts.
  *
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 3/6] x86/idt: remove address argument to idt_invalidate()
  2021-05-11  0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
  2021-05-11  0:55 ` [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h> H. Peter Anvin
  2021-05-11  0:55 ` [PATCH 2/6] x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS H. Peter Anvin
@ 2021-05-11  0:55 ` H. Peter Anvin
  2021-05-11  4:37   ` kernel test robot
  2021-05-11 14:14   ` Thomas Gleixner
  2021-05-11  0:55 ` [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE] H. Peter Anvin
                   ` (2 subsequent siblings)
  5 siblings, 2 replies; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11  0:55 UTC (permalink / raw)
  To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List, H. Peter Anvin (Intel)

From: "H. Peter Anvin (Intel)" <hpa@zytor.com>

There is no reason to specify any specific address to
idt_invalidate(). It looks mostly like an artifact of unifying code
done differently by accident.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
 arch/x86/include/asm/desc.h        | 2 +-
 arch/x86/kernel/idt.c              | 5 ++---
 arch/x86/kernel/machine_kexec_32.c | 4 ++--
 arch/x86/kernel/reboot.c           | 2 +-
 4 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h
index 476082a83d1c..b8429ae50b71 100644
--- a/arch/x86/include/asm/desc.h
+++ b/arch/x86/include/asm/desc.h
@@ -427,6 +427,6 @@ static inline void idt_setup_early_pf(void) { }
 static inline void idt_setup_ist_traps(void) { }
 #endif
 
-extern void idt_invalidate(void *addr);
+extern void idt_invalidate(void);
 
 #endif /* _ASM_X86_DESC_H */
diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c
index d552f177eca0..17f824462f5e 100644
--- a/arch/x86/kernel/idt.c
+++ b/arch/x86/kernel/idt.c
@@ -331,11 +331,10 @@ void __init idt_setup_early_handler(void)
 
 /**
  * idt_invalidate - Invalidate interrupt descriptor table
- * @addr:	The virtual address of the 'invalid' IDT
  */
-void idt_invalidate(void *addr)
+void idt_invalidate(void)
 {
-	struct desc_ptr idt = { .address = (unsigned long) addr, .size = 0 };
+	struct desc_ptr idt = { .address = 0, .size = 0 };
 
 	load_idt(&idt);
 }
diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c
index 64b00b0d7fe8..6ba90f47d8c3 100644
--- a/arch/x86/kernel/machine_kexec_32.c
+++ b/arch/x86/kernel/machine_kexec_32.c
@@ -232,8 +232,8 @@ void machine_kexec(struct kimage *image)
 	 * The gdt & idt are now invalid.
 	 * If you want to load them you must set up your own idt & gdt.
 	 */
-	idt_invalidate(phys_to_virt(0));
-	set_gdt(phys_to_virt(0), 0);
+	idt_invalidate();
+	set_gdt(0, 0);
 
 	/* now call it */
 	image->start = relocate_kernel_ptr((unsigned long)image->head,
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
index b29657b76e3f..ebfb91108232 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -669,7 +669,7 @@ static void native_machine_emergency_restart(void)
 			break;
 
 		case BOOT_TRIPLE:
-			idt_invalidate(NULL);
+			idt_invalidate();
 			__asm__ __volatile__("int3");
 
 			/* We're probably dead after this, but... */
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
  2021-05-11  0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
                   ` (2 preceding siblings ...)
  2021-05-11  0:55 ` [PATCH 3/6] x86/idt: remove address argument to idt_invalidate() H. Peter Anvin
@ 2021-05-11  0:55 ` H. Peter Anvin
  2021-05-11 14:22   ` Thomas Gleixner
  2021-05-11  0:55 ` [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt H. Peter Anvin
  2021-05-11  0:55 ` [PATCH 6/6] x86/irq: remove unused vectors from <asm/irq_vectors.h> H. Peter Anvin
  5 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11  0:55 UTC (permalink / raw)
  To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List, H. Peter Anvin (Intel)

From: "H. Peter Anvin (Intel)" <hpa@zytor.com>

Move the common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE] into a common
macro.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
 arch/x86/include/asm/idtentry.h | 35 ++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 16 deletions(-)

diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
index c03a18cac78e..de3727db021a 100644
--- a/arch/x86/include/asm/idtentry.h
+++ b/arch/x86/include/asm/idtentry.h
@@ -219,6 +219,23 @@ static noinline void __##func(struct pt_regs *regs, u32 vector)
 #define DECLARE_IDTENTRY_SYSVEC(vector, func)				\
 	DECLARE_IDTENTRY(vector, func)
 
+/**
+ * IDTENTRY_INVOKE_SYSVEC - Common code for system vector IDT entry points
+ * @what:	What should be called
+ *
+ * Common code for DEFINE_IDTENTRY_SYSVEC and _SYSVEC_SIMPLE
+ */
+#define IDTENTRY_INVOKE_SYSVEC(what)					\
+do {									\
+	irqentry_state_t state = irqentry_enter(regs);			\
+									\
+	instrumentation_begin();					\
+	kvm_set_cpu_l1tf_flush_l1d();					\
+	what;								\
+	instrumentation_end();						\
+	irqentry_exit(regs, state);					\
+} while (0)								\
+
 /**
  * DEFINE_IDTENTRY_SYSVEC - Emit code for system vector IDT entry points
  * @func:	Function name of the entry point
@@ -233,13 +250,7 @@ static void __##func(struct pt_regs *regs);				\
 									\
 __visible noinstr void func(struct pt_regs *regs)			\
 {									\
-	irqentry_state_t state = irqentry_enter(regs);			\
-									\
-	instrumentation_begin();					\
-	kvm_set_cpu_l1tf_flush_l1d();					\
-	run_sysvec_on_irqstack_cond(__##func, regs);			\
-	instrumentation_end();						\
-	irqentry_exit(regs, state);					\
+	IDTENTRY_INVOKE_SYSVEC(run_sysvec_on_irqstack_cond(__##func, regs)); \
 }									\
 									\
 static noinline void __##func(struct pt_regs *regs)
@@ -260,15 +271,7 @@ static __always_inline void __##func(struct pt_regs *regs);		\
 									\
 __visible noinstr void func(struct pt_regs *regs)			\
 {									\
-	irqentry_state_t state = irqentry_enter(regs);			\
-									\
-	instrumentation_begin();					\
-	__irq_enter_raw();						\
-	kvm_set_cpu_l1tf_flush_l1d();					\
-	__##func (regs);						\
-	__irq_exit_raw();						\
-	instrumentation_end();						\
-	irqentry_exit(regs, state);					\
+	IDTENTRY_INVOKE_SYSVEC(__irq_enter_raw(); __##func(regs); __irq_exit_raw()); \
 }									\
 									\
 static __always_inline void __##func(struct pt_regs *regs)
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt
  2021-05-11  0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
                   ` (3 preceding siblings ...)
  2021-05-11  0:55 ` [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE] H. Peter Anvin
@ 2021-05-11  0:55 ` H. Peter Anvin
  2021-05-11 14:23   ` Thomas Gleixner
  2021-05-11  0:55 ` [PATCH 6/6] x86/irq: remove unused vectors from <asm/irq_vectors.h> H. Peter Anvin
  5 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11  0:55 UTC (permalink / raw)
  To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List, H. Peter Anvin (Intel)

From: "H. Peter Anvin (Intel)" <hpa@zytor.com>

The current IRQ vector allocation code should be "clean" and never
issue a IRQ_MOVE_CLEANUP_VECTOR IPI for an interrupt that could still
be pending. This should make it possible to move it to the "normal"
system IRQ vector range. This should probably be a three-step process:

1. Introduce this WARN_ONCE() on this event ever occurring.
2. Move the IRQ_MOVE_CLEANUP_VECTOR to the sysvec range.
3. Remove the self-IPI hack.

This implements step 1.

Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
 arch/x86/kernel/apic/vector.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
index 6dbdc7c22bb7..7ba2982a3585 100644
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -939,9 +939,14 @@ DEFINE_IDTENTRY_SYSVEC(sysvec_irq_move_cleanup)
 		 * to this CPU. IRQ_MOVE_CLEANUP_VECTOR is the lowest
 		 * priority external vector, so on return from this
 		 * interrupt the device interrupt will happen first.
+		 *
+		 * *** This should never happen with the current IRQ
+		 * cleanup code, so WARN_ONCE() for now, and
+		 * eventually get rid of this hack.
 		 */
 		irr = apic_read(APIC_IRR + (vector / 32 * 0x10));
 		if (irr & (1U << (vector % 32))) {
+			WARN_ONCE(1, "irq_move_cleanup called on still pending interrupt\n");
 			apic->send_IPI_self(IRQ_MOVE_CLEANUP_VECTOR);
 			continue;
 		}
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 6/6] x86/irq: remove unused vectors from <asm/irq_vectors.h>
  2021-05-11  0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
                   ` (4 preceding siblings ...)
  2021-05-11  0:55 ` [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt H. Peter Anvin
@ 2021-05-11  0:55 ` H. Peter Anvin
  2021-05-11 17:04   ` Steve Wahl
  5 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11  0:55 UTC (permalink / raw)
  To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List, H. Peter Anvin (Intel)

From: "H. Peter Anvin (Intel)" <hpa@zytor.com>

UV_BAU_MESSAGE is defined but not used anywhere in the
kernel. Presumably this is a stale vector number that can be
reclaimed.

MCE_VECTOR is not an actual vector: #MC is an exception, not an
interrupt vector, and as such is correctly described as
X86_TRAP_MC. MCE_VECTOR is not used anywhere is the kernel.

Note that NMI_VECTOR *is* used; specifically it is the vector number
programmed into the APIC LVT when an NMI interrupt is configured. At
the moment it is always numerically identical to X86_TRAP_NMI, that is
not necessarily going to be the case indefinitely.

Cc: Steve Wahl <steve.wahl@hpe.com>
Cc: Mike Travis <mike.travis@hpe.com>
Cc: Dimitri Sivanich <dimitri.sivanich@hpe.com>
Cc: Russ Anderson <russ.anderson@hpe.com>
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
 arch/x86/include/asm/irq_vectors.h       | 4 ++--
 tools/arch/x86/include/asm/irq_vectors.h | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h
index d2ef35927770..43dcb9284208 100644
--- a/arch/x86/include/asm/irq_vectors.h
+++ b/arch/x86/include/asm/irq_vectors.h
@@ -26,8 +26,8 @@
  * This file enumerates the exact layout of them:
  */
 
+/* This is used as an interrupt vector when programming the APIC. */
 #define NMI_VECTOR			0x02
-#define MCE_VECTOR			0x12
 
 /*
  * IDT vectors usable for external interrupt sources start at 0x20.
@@ -84,7 +84,7 @@
  */
 #define IRQ_WORK_VECTOR			0xf6
 
-#define UV_BAU_MESSAGE			0xf5
+/* 0xf5 - unused, was UV_BAU_MESSAGE */
 #define DEFERRED_ERROR_VECTOR		0xf4
 
 /* Vector on which hypervisor callbacks will be delivered */
diff --git a/tools/arch/x86/include/asm/irq_vectors.h b/tools/arch/x86/include/asm/irq_vectors.h
index d2ef35927770..43dcb9284208 100644
--- a/tools/arch/x86/include/asm/irq_vectors.h
+++ b/tools/arch/x86/include/asm/irq_vectors.h
@@ -26,8 +26,8 @@
  * This file enumerates the exact layout of them:
  */
 
+/* This is used as an interrupt vector when programming the APIC. */
 #define NMI_VECTOR			0x02
-#define MCE_VECTOR			0x12
 
 /*
  * IDT vectors usable for external interrupt sources start at 0x20.
@@ -84,7 +84,7 @@
  */
 #define IRQ_WORK_VECTOR			0xf6
 
-#define UV_BAU_MESSAGE			0xf5
+/* 0xf5 - unused, was UV_BAU_MESSAGE */
 #define DEFERRED_ERROR_VECTOR		0xf4
 
 /* Vector on which hypervisor callbacks will be delivered */
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/6] x86/idt: remove address argument to idt_invalidate()
  2021-05-11  0:55 ` [PATCH 3/6] x86/idt: remove address argument to idt_invalidate() H. Peter Anvin
@ 2021-05-11  4:37   ` kernel test robot
  2021-05-11 14:14   ` Thomas Gleixner
  1 sibling, 0 replies; 20+ messages in thread
From: kernel test robot @ 2021-05-11  4:37 UTC (permalink / raw)
  To: H. Peter Anvin, Ingo Molnar, Thomas Gleixner, Borislav Petkov,
	Andy Lutomirski
  Cc: kbuild-all, Steve Wahl, Mike Travis, Dimitri Sivanich,
	Russ Anderson, Linux Kernel Mailing List, H. Peter Anvin (Intel)

[-- Attachment #1: Type: text/plain, Size: 3832 bytes --]

Hi Peter,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on tip/x86/core]
[also build test WARNING on tip/master linus/master v5.13-rc1 next-20210510]
[cannot apply to bp/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/H-Peter-Anvin/x86-irq-trap-and-interrupt-cleanups/20210511-085650
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 2c88d45edbb89029c1190bb3b136d2602f057c98
config: i386-randconfig-s002-20210511 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.3-341-g8af24329-dirty
        # https://github.com/0day-ci/linux/commit/c9c68d8ad1ef0923798c18f7e9a9570fa23aee0e
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review H-Peter-Anvin/x86-irq-trap-and-interrupt-cleanups/20210511-085650
        git checkout c9c68d8ad1ef0923798c18f7e9a9570fa23aee0e
        # save the attached .config to linux build tree
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' W=1 ARCH=i386 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


sparse warnings: (new ones prefixed by >>)
>> arch/x86/kernel/machine_kexec_32.c:236:17: sparse: sparse: Using plain integer as NULL pointer

vim +236 arch/x86/kernel/machine_kexec_32.c

   188	
   189		save_ftrace_enabled = __ftrace_enabled_save();
   190	
   191		/* Interrupts aren't acceptable while we reboot */
   192		local_irq_disable();
   193		hw_breakpoint_disable();
   194	
   195		if (image->preserve_context) {
   196	#ifdef CONFIG_X86_IO_APIC
   197			/*
   198			 * We need to put APICs in legacy mode so that we can
   199			 * get timer interrupts in second kernel. kexec/kdump
   200			 * paths already have calls to restore_boot_irq_mode()
   201			 * in one form or other. kexec jump path also need one.
   202			 */
   203			clear_IO_APIC();
   204			restore_boot_irq_mode();
   205	#endif
   206		}
   207	
   208		control_page = page_address(image->control_code_page);
   209		memcpy(control_page, relocate_kernel, KEXEC_CONTROL_CODE_MAX_SIZE);
   210	
   211		relocate_kernel_ptr = control_page;
   212		page_list[PA_CONTROL_PAGE] = __pa(control_page);
   213		page_list[VA_CONTROL_PAGE] = (unsigned long)control_page;
   214		page_list[PA_PGD] = __pa(image->arch.pgd);
   215	
   216		if (image->type == KEXEC_TYPE_DEFAULT)
   217			page_list[PA_SWAP_PAGE] = (page_to_pfn(image->swap_page)
   218							<< PAGE_SHIFT);
   219	
   220		/*
   221		 * The segment registers are funny things, they have both a
   222		 * visible and an invisible part.  Whenever the visible part is
   223		 * set to a specific selector, the invisible part is loaded
   224		 * with from a table in memory.  At no other time is the
   225		 * descriptor table in memory accessed.
   226		 *
   227		 * I take advantage of this here by force loading the
   228		 * segments, before I zap the gdt with an invalid value.
   229		 */
   230		load_segments();
   231		/*
   232		 * The gdt & idt are now invalid.
   233		 * If you want to load them you must set up your own idt & gdt.
   234		 */
   235		idt_invalidate();
 > 236		set_gdt(0, 0);
   237	
   238		/* now call it */
   239		image->start = relocate_kernel_ptr((unsigned long)image->head,
   240						   (unsigned long)page_list,
   241						   image->start,
   242						   boot_cpu_has(X86_FEATURE_PAE),
   243						   image->preserve_context);
   244	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 35108 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/6] x86/idt: remove address argument to idt_invalidate()
  2021-05-11  0:55 ` [PATCH 3/6] x86/idt: remove address argument to idt_invalidate() H. Peter Anvin
  2021-05-11  4:37   ` kernel test robot
@ 2021-05-11 14:14   ` Thomas Gleixner
  2021-05-11 14:43     ` H. Peter Anvin
  1 sibling, 1 reply; 20+ messages in thread
From: Thomas Gleixner @ 2021-05-11 14:14 UTC (permalink / raw)
  To: H. Peter Anvin, Ingo Molnar, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List, H. Peter Anvin (Intel)

On Mon, May 10 2021 at 17:55, H. Peter Anvin wrote:
> diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c
> index 64b00b0d7fe8..6ba90f47d8c3 100644
> --- a/arch/x86/kernel/machine_kexec_32.c
> +++ b/arch/x86/kernel/machine_kexec_32.c
> @@ -232,8 +232,8 @@ void machine_kexec(struct kimage *image)
>  	 * The gdt & idt are now invalid.
>  	 * If you want to load them you must set up your own idt & gdt.
>  	 */
> -	idt_invalidate(phys_to_virt(0));
> -	set_gdt(phys_to_virt(0), 0);
> +	idt_invalidate();
> +	set_gdt(0, 0);

  (NULL, 0)

first argument it a pointer...
  

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
  2021-05-11  0:55 ` [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE] H. Peter Anvin
@ 2021-05-11 14:22   ` Thomas Gleixner
  2021-05-11 17:44     ` H. Peter Anvin
  0 siblings, 1 reply; 20+ messages in thread
From: Thomas Gleixner @ 2021-05-11 14:22 UTC (permalink / raw)
  To: H. Peter Anvin, Ingo Molnar, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List, H. Peter Anvin (Intel)

On Mon, May 10 2021 at 17:55, H. Peter Anvin wrote:
> +/**
> + * IDTENTRY_INVOKE_SYSVEC - Common code for system vector IDT entry points
> + * @what:	What should be called
> + *
> + * Common code for DEFINE_IDTENTRY_SYSVEC and _SYSVEC_SIMPLE
> + */
> +#define IDTENTRY_INVOKE_SYSVEC(what)					\
> +do {									\
> +	irqentry_state_t state = irqentry_enter(regs);			\
> +									\
> +	instrumentation_begin();					\
> +	kvm_set_cpu_l1tf_flush_l1d();					\
> +	what;								\
> +	instrumentation_end();						\
> +	irqentry_exit(regs, state);					\
> +} while (0)								\
> +
>  /**
>   * DEFINE_IDTENTRY_SYSVEC - Emit code for system vector IDT entry points
>   * @func:	Function name of the entry point
> @@ -233,13 +250,7 @@ static void __##func(struct pt_regs *regs);				\
>  									\
>  __visible noinstr void func(struct pt_regs *regs)			\
>  {									\
> -	irqentry_state_t state = irqentry_enter(regs);			\
> -									\
> -	instrumentation_begin();					\
> -	kvm_set_cpu_l1tf_flush_l1d();					\
> -	run_sysvec_on_irqstack_cond(__##func, regs);			\
> -	instrumentation_end();						\
> -	irqentry_exit(regs, state);					\
> +	IDTENTRY_INVOKE_SYSVEC(run_sysvec_on_irqstack_cond(__##func, regs)); \
>  }									\
>  									\
>  static noinline void __##func(struct pt_regs *regs)
> @@ -260,15 +271,7 @@ static __always_inline void __##func(struct pt_regs *regs);		\
>  									\
>  __visible noinstr void func(struct pt_regs *regs)			\
>  {									\
> -	irqentry_state_t state = irqentry_enter(regs);			\
> -									\
> -	instrumentation_begin();					\
> -	__irq_enter_raw();						\
> -	kvm_set_cpu_l1tf_flush_l1d();					\
> -	__##func (regs);						\
> -	__irq_exit_raw();						\
> -	instrumentation_end();						\
> -	irqentry_exit(regs, state);					\
> +	IDTENTRY_INVOKE_SYSVEC(__irq_enter_raw(); __##func(regs); __irq_exit_raw()); \

That's not really making the code more readable. Something like the
below perhaps?

#define IDTENTRY_INVOKE_SYSVEC(func, regs, raw)				\
do {									\
	irqentry_state_t state = irqentry_enter(regs);			\
									\
	instrumentation_begin();					\
	kvm_set_cpu_l1tf_flush_l1d();					\
        if (raw) {							\
		__irq_enter_raw();					\
		func(regs);						\
		__irq_exit_raw();			                \
	} else {	                                                \
		run_sysvec_on_irqstack_cond(func, regs);	        \
        }                                                               \
	instrumentation_end();						\
        irqentry_exit(regs, state);					\
} while (0)								\

Thanks,

        tglx

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt
  2021-05-11  0:55 ` [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt H. Peter Anvin
@ 2021-05-11 14:23   ` Thomas Gleixner
  2021-05-11 15:55     ` H. Peter Anvin
  0 siblings, 1 reply; 20+ messages in thread
From: Thomas Gleixner @ 2021-05-11 14:23 UTC (permalink / raw)
  To: H. Peter Anvin, Ingo Molnar, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List, H. Peter Anvin (Intel)

On Mon, May 10 2021 at 17:55, H. Peter Anvin wrote:
> From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
>
> The current IRQ vector allocation code should be "clean" and never
> issue a IRQ_MOVE_CLEANUP_VECTOR IPI for an interrupt that could still
> be pending. This should make it possible to move it to the "normal"
> system IRQ vector range. This should probably be a three-step process:
>
> 1. Introduce this WARN_ONCE() on this event ever occurring.
> 2. Move the IRQ_MOVE_CLEANUP_VECTOR to the sysvec range.
> 3. Remove the self-IPI hack.

Actually 2+3 must be combined because _if_ this ever happens then the
self-IPI loops forever.

Thanks,

        tglx

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/6] x86/idt: remove address argument to idt_invalidate()
  2021-05-11 14:14   ` Thomas Gleixner
@ 2021-05-11 14:43     ` H. Peter Anvin
  0 siblings, 0 replies; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 14:43 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List

Yup, me bad.

On May 11, 2021 7:14:47 AM PDT, Thomas Gleixner <tglx@linutronix.de> wrote:
>On Mon, May 10 2021 at 17:55, H. Peter Anvin wrote:
>> diff --git a/arch/x86/kernel/machine_kexec_32.c
>b/arch/x86/kernel/machine_kexec_32.c
>> index 64b00b0d7fe8..6ba90f47d8c3 100644
>> --- a/arch/x86/kernel/machine_kexec_32.c
>> +++ b/arch/x86/kernel/machine_kexec_32.c
>> @@ -232,8 +232,8 @@ void machine_kexec(struct kimage *image)
>>  	 * The gdt & idt are now invalid.
>>  	 * If you want to load them you must set up your own idt & gdt.
>>  	 */
>> -	idt_invalidate(phys_to_virt(0));
>> -	set_gdt(phys_to_virt(0), 0);
>> +	idt_invalidate();
>> +	set_gdt(0, 0);
>
>  (NULL, 0)
>
>first argument it a pointer...
>  

-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt
  2021-05-11 14:23   ` Thomas Gleixner
@ 2021-05-11 15:55     ` H. Peter Anvin
  0 siblings, 0 replies; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 15:55 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List

You are, of course, correct – or 2 and 3 can be reversed, I believe.

On May 11, 2021 7:23:53 AM PDT, Thomas Gleixner <tglx@linutronix.de> wrote:
>On Mon, May 10 2021 at 17:55, H. Peter Anvin wrote:
>> From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
>>
>> The current IRQ vector allocation code should be "clean" and never
>> issue a IRQ_MOVE_CLEANUP_VECTOR IPI for an interrupt that could still
>> be pending. This should make it possible to move it to the "normal"
>> system IRQ vector range. This should probably be a three-step
>process:
>>
>> 1. Introduce this WARN_ONCE() on this event ever occurring.
>> 2. Move the IRQ_MOVE_CLEANUP_VECTOR to the sysvec range.
>> 3. Remove the self-IPI hack.
>
>Actually 2+3 must be combined because _if_ this ever happens then the
>self-IPI loops forever.
>
>Thanks,
>
>        tglx

-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 6/6] x86/irq: remove unused vectors from <asm/irq_vectors.h>
  2021-05-11  0:55 ` [PATCH 6/6] x86/irq: remove unused vectors from <asm/irq_vectors.h> H. Peter Anvin
@ 2021-05-11 17:04   ` Steve Wahl
  0 siblings, 0 replies; 20+ messages in thread
From: Steve Wahl @ 2021-05-11 17:04 UTC (permalink / raw)
  To: H. Peter Anvin
  Cc: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski,
	Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List

Acked-by: Steve Wahl <steve.wahl@hpe.com>

Yes, we believe UV_BAU_MESSAGE is one we missed in some earlier code
cleanup, and agree with its removal.

On Mon, May 10, 2021 at 05:55:31PM -0700, H. Peter Anvin wrote:
> From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
> 
> UV_BAU_MESSAGE is defined but not used anywhere in the
> kernel. Presumably this is a stale vector number that can be
> reclaimed.
> 
> MCE_VECTOR is not an actual vector: #MC is an exception, not an
> interrupt vector, and as such is correctly described as
> X86_TRAP_MC. MCE_VECTOR is not used anywhere is the kernel.
> 
> Note that NMI_VECTOR *is* used; specifically it is the vector number
> programmed into the APIC LVT when an NMI interrupt is configured. At
> the moment it is always numerically identical to X86_TRAP_NMI, that is
> not necessarily going to be the case indefinitely.
> 
> Cc: Steve Wahl <steve.wahl@hpe.com>
> Cc: Mike Travis <mike.travis@hpe.com>
> Cc: Dimitri Sivanich <dimitri.sivanich@hpe.com>
> Cc: Russ Anderson <russ.anderson@hpe.com>
> Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
> ---
>  arch/x86/include/asm/irq_vectors.h       | 4 ++--
>  tools/arch/x86/include/asm/irq_vectors.h | 4 ++--
>  2 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h
> index d2ef35927770..43dcb9284208 100644
> --- a/arch/x86/include/asm/irq_vectors.h
> +++ b/arch/x86/include/asm/irq_vectors.h
> @@ -26,8 +26,8 @@
>   * This file enumerates the exact layout of them:
>   */
>  
> +/* This is used as an interrupt vector when programming the APIC. */
>  #define NMI_VECTOR			0x02
> -#define MCE_VECTOR			0x12
>  
>  /*
>   * IDT vectors usable for external interrupt sources start at 0x20.
> @@ -84,7 +84,7 @@
>   */
>  #define IRQ_WORK_VECTOR			0xf6
>  
> -#define UV_BAU_MESSAGE			0xf5
> +/* 0xf5 - unused, was UV_BAU_MESSAGE */
>  #define DEFERRED_ERROR_VECTOR		0xf4
>  
>  /* Vector on which hypervisor callbacks will be delivered */
> diff --git a/tools/arch/x86/include/asm/irq_vectors.h b/tools/arch/x86/include/asm/irq_vectors.h
> index d2ef35927770..43dcb9284208 100644
> --- a/tools/arch/x86/include/asm/irq_vectors.h
> +++ b/tools/arch/x86/include/asm/irq_vectors.h
> @@ -26,8 +26,8 @@
>   * This file enumerates the exact layout of them:
>   */
>  
> +/* This is used as an interrupt vector when programming the APIC. */
>  #define NMI_VECTOR			0x02
> -#define MCE_VECTOR			0x12
>  
>  /*
>   * IDT vectors usable for external interrupt sources start at 0x20.
> @@ -84,7 +84,7 @@
>   */
>  #define IRQ_WORK_VECTOR			0xf6
>  
> -#define UV_BAU_MESSAGE			0xf5
> +/* 0xf5 - unused, was UV_BAU_MESSAGE */
>  #define DEFERRED_ERROR_VECTOR		0xf4
>  
>  /* Vector on which hypervisor callbacks will be delivered */
> -- 
> 2.31.1
> 

-- 
Steve Wahl, Hewlett Packard Enterprise

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
  2021-05-11 14:22   ` Thomas Gleixner
@ 2021-05-11 17:44     ` H. Peter Anvin
  2021-05-12  8:38       ` Ingo Molnar
  0 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 17:44 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Andy Lutomirski
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List

On 5/11/21 7:22 AM, Thomas Gleixner wrote:
> 
> That's not really making the code more readable. Something like the
> below perhaps?
> 
> #define IDTENTRY_INVOKE_SYSVEC(func, regs, raw)				\
> do {									\
> 	irqentry_state_t state = irqentry_enter(regs);			\
> 									\
> 	instrumentation_begin();					\
> 	kvm_set_cpu_l1tf_flush_l1d();					\
>          if (raw) {							\
> 		__irq_enter_raw();					\
> 		func(regs);						\
> 		__irq_exit_raw();			                \
> 	} else {	                                                \
> 		run_sysvec_on_irqstack_cond(func, regs);	        \
>          }                                                               \
> 	instrumentation_end();						\
>          irqentry_exit(regs, state);					\
> } while (0)								\
> 

Digging more into it, it looks like a *lot* of the macros in 
<asm/irq_stack.h> and <asm/idtentry.h> can be replaced with inlines 
without any change in functionality or generated code.

	-hpa


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
  2021-05-11 17:44     ` H. Peter Anvin
@ 2021-05-12  8:38       ` Ingo Molnar
  2021-05-12 18:00         ` H. Peter Anvin
  0 siblings, 1 reply; 20+ messages in thread
From: Ingo Molnar @ 2021-05-12  8:38 UTC (permalink / raw)
  To: H. Peter Anvin
  Cc: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Andy Lutomirski,
	Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List


* H. Peter Anvin <hpa@zytor.com> wrote:

> On 5/11/21 7:22 AM, Thomas Gleixner wrote:
> > 
> > That's not really making the code more readable. Something like the
> > below perhaps?
> > 
> > #define IDTENTRY_INVOKE_SYSVEC(func, regs, raw)				\
> > do {									\
> > 	irqentry_state_t state = irqentry_enter(regs);			\
> > 									\
> > 	instrumentation_begin();					\
> > 	kvm_set_cpu_l1tf_flush_l1d();					\
> >          if (raw) {							\
> > 		__irq_enter_raw();					\
> > 		func(regs);						\
> > 		__irq_exit_raw();			                \
> > 	} else {	                                                \
> > 		run_sysvec_on_irqstack_cond(func, regs);	        \
> >          }                                                               \
> > 	instrumentation_end();						\
> >          irqentry_exit(regs, state);					\
> > } while (0)								\
> > 
> 
> Digging more into it, it looks like a *lot* of the macros in
> <asm/irq_stack.h> and <asm/idtentry.h> can be replaced with inlines without
> any change in functionality or generated code.

That would be a much preferred outcome ...

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
  2021-05-12  8:38       ` Ingo Molnar
@ 2021-05-12 18:00         ` H. Peter Anvin
  2021-05-12 18:40           ` Ingo Molnar
  0 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-12 18:00 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Andy Lutomirski,
	Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 1391 bytes --]



On 5/12/21 1:38 AM, Ingo Molnar wrote:
> 
> * H. Peter Anvin <hpa@zytor.com> wrote:
> 
>> On 5/11/21 7:22 AM, Thomas Gleixner wrote:
>>>
>>> That's not really making the code more readable. Something like the
>>> below perhaps?
>>>
>>> #define IDTENTRY_INVOKE_SYSVEC(func, regs, raw)				\
>>> do {									\
>>> 	irqentry_state_t state = irqentry_enter(regs);			\
>>> 									\
>>> 	instrumentation_begin();					\
>>> 	kvm_set_cpu_l1tf_flush_l1d();					\
>>>           if (raw) {							\
>>> 		__irq_enter_raw();					\
>>> 		func(regs);						\
>>> 		__irq_exit_raw();			                \
>>> 	} else {	                                                \
>>> 		run_sysvec_on_irqstack_cond(func, regs);	        \
>>>           }                                                               \
>>> 	instrumentation_end();						\
>>>           irqentry_exit(regs, state);					\
>>> } while (0)								\
>>>
>>
>> Digging more into it, it looks like a *lot* of the macros in
>> <asm/irq_stack.h> and <asm/idtentry.h> can be replaced with inlines without
>> any change in functionality or generated code.
> 
> That would be a much preferred outcome ...

Well, here is an RFC. This is obviously a much bigger change and I don't 
feel it is mature yet, but it would be good to know if you (plural) feel 
it is in the right direction.

I will clean up the rest of the patchset and resubmit.

	-hpa


[-- Attachment #2: 0001-x86-irq-merge-and-functionalize-common-code-in-DECLA.patch --]
[-- Type: text/x-patch, Size: 17742 bytes --]

From e52200ed187e30f45d32639612e09281a544c062 Mon Sep 17 00:00:00 2001
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
Date: Wed, 5 May 2021 17:43:46 -0700
Subject: [PATCH] x86/irq: merge and functionalize common code in
 DECLARE/DEFINE_IDTENTRY_*

Move as much of the common code in the _IDTENTRY_ and
run_*_on_irq_stack() into inline functions instead of macros. A lot of
them differ only in types and/or the presence or absence of an
additional argument; the differential amount of code is neglible and
after bending the types a little bit, they unify nicely.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
 arch/x86/entry/common.c          |   5 +-
 arch/x86/include/asm/idtentry.h  | 170 +++++++++++++++----------------
 arch/x86/include/asm/irq_stack.h |  73 +++++--------
 arch/x86/kernel/apic/apic.c      |   2 +-
 arch/x86/kernel/irq.c            |   1 +
 arch/x86/kernel/sev-es.c         |   6 +-
 arch/x86/kernel/traps.c          |   2 +-
 7 files changed, 117 insertions(+), 142 deletions(-)

diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c
index 7b2542b13ebd..1e46a1a35b20 100644
--- a/arch/x86/entry/common.c
+++ b/arch/x86/entry/common.c
@@ -253,7 +253,8 @@ static __always_inline bool get_and_clear_inhcall(void) { return false; }
 static __always_inline void restore_inhcall(bool inhcall) { }
 #endif
 
-static void __xen_pv_evtchn_do_upcall(struct pt_regs *regs)
+static void __xen_pv_evtchn_do_upcall(struct pt_regs *regs,
+				      u32 __dummy __always_unused)
 {
 	struct pt_regs *old_regs = set_irq_regs(regs);
 
@@ -269,7 +270,7 @@ __visible noinstr void xen_pv_evtchn_do_upcall(struct pt_regs *regs)
 	irqentry_state_t state = irqentry_enter(regs);
 	bool inhcall;
 
-	run_sysvec_on_irqstack_cond(__xen_pv_evtchn_do_upcall, regs);
+	run_on_irqstack_cond(__xen_pv_evtchn_do_upcall, regs, 0);
 
 	inhcall = get_and_clear_inhcall();
 	if (inhcall && !WARN_ON_ONCE(state.exit_rcu)) {
diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
index c03a18cac78e..85f79a429a39 100644
--- a/arch/x86/include/asm/idtentry.h
+++ b/arch/x86/include/asm/idtentry.h
@@ -11,6 +11,65 @@
 
 #include <asm/irq_stack.h>
 
+/**
+ * idtentry_call - Common code for non-trivial IDT entry points
+ * @func:	What should ultimately be called
+ * @regs:	Pointer to entry struct pt_regs
+ * @arg:	Extra argument to func (vector, error_code)
+ * @flush:	If kvm_set_cpu_l1tf_flush_l1d() should be called
+ * @wrapper:	Wrapper to call func; NULL for just call
+ */
+static __always_inline void
+idtentry_call(irq_func_t func, struct pt_regs *regs, bool flush,
+	      void (*wrapper)(irq_func_t, struct pt_regs *, u32),
+	      u32 arg)
+{
+	irqentry_state_t state = irqentry_enter(regs);
+
+	instrumentation_begin();
+	if (flush)
+		kvm_set_cpu_l1tf_flush_l1d();
+	if (wrapper)
+		wrapper(func, regs, arg);
+	else
+		func(regs, arg);
+	instrumentation_end();
+	irqentry_exit(regs, state);
+}
+
+/**
+ * _DEFINE_IDTENTRY - Common macro for defining idtentries with no argument
+ * @func:	Function name of the entry point
+ * @flush:	If wrapper should call kvm_set_cpu_l1tf_flush_l1d()
+ * @inline_opt: __always_inline or noinline as appropriate for __func
+ * @wrapper:	Wrapper function for calling __func
+ *
+ */
+#define _DEFINE_IDTENTRY(func, flush, inline_opt, wrapper)		\
+static inline_opt void __##func(struct pt_regs *regs, u32);		\
+__visible noinstr void func(struct pt_regs *regs)			\
+{									\
+	idtentry_call(__##func, regs, flush, wrapper, 0);		\
+}									\
+static inline_opt void							\
+__##func(struct pt_regs *regs, u32 __dummy __always_unused)
+
+/**
+ * _DEFINE_IDTENTRY_ERRORCODE - Common macro for defining idtentries with argument
+ * @func:	Function name of the entry point
+ * @flush:	If wrapper should call kvm_set_cpu_l1tf_flush_l1d()
+ * @inline_opt: __always_inline or noinline as appropriate for __func
+ * @wrapper:	Wrapper function for calling __func
+ *
+ */
+#define _DEFINE_IDTENTRY_ERRORCODE(func, flush, inline_opt, wrapper)	\
+static inline_opt void __##func(struct pt_regs *regs, u32 error_code);	\
+__visible noinstr void func(struct pt_regs *regs, u32 error_code)	\
+{									\
+	idtentry_call(__##func, regs, flush, wrapper, error_code);	\
+}									\
+static inline_opt void __##func(struct pt_regs *regs, u32 error_code)
+
 /**
  * DECLARE_IDTENTRY - Declare functions for simple IDT entry points
  *		      No error code pushed by hardware
@@ -45,19 +104,7 @@
  * which has to run before returning to the low level assembly code.
  */
 #define DEFINE_IDTENTRY(func)						\
-static __always_inline void __##func(struct pt_regs *regs);		\
-									\
-__visible noinstr void func(struct pt_regs *regs)			\
-{									\
-	irqentry_state_t state = irqentry_enter(regs);			\
-									\
-	instrumentation_begin();					\
-	__##func (regs);						\
-	instrumentation_end();						\
-	irqentry_exit(regs, state);					\
-}									\
-									\
-static __always_inline void __##func(struct pt_regs *regs)
+	_DEFINE_IDTENTRY(func, false, __always_inline, NULL)
 
 /* Special case for 32bit IRET 'trap' */
 #define DECLARE_IDTENTRY_SW	DECLARE_IDTENTRY
@@ -80,7 +127,7 @@ static __always_inline void __##func(struct pt_regs *regs)
 #define DECLARE_IDTENTRY_ERRORCODE(vector, func)			\
 	asmlinkage void asm_##func(void);				\
 	asmlinkage void xen_asm_##func(void);				\
-	__visible void func(struct pt_regs *regs, unsigned long error_code)
+	__visible void func(struct pt_regs *regs, u32 error_code)
 
 /**
  * DEFINE_IDTENTRY_ERRORCODE - Emit code for simple IDT entry points
@@ -90,22 +137,7 @@ static __always_inline void __##func(struct pt_regs *regs)
  * Same as DEFINE_IDTENTRY, but has an extra error_code argument
  */
 #define DEFINE_IDTENTRY_ERRORCODE(func)					\
-static __always_inline void __##func(struct pt_regs *regs,		\
-				     unsigned long error_code);		\
-									\
-__visible noinstr void func(struct pt_regs *regs,			\
-			    unsigned long error_code)			\
-{									\
-	irqentry_state_t state = irqentry_enter(regs);			\
-									\
-	instrumentation_begin();					\
-	__##func (regs, error_code);					\
-	instrumentation_end();						\
-	irqentry_exit(regs, state);					\
-}									\
-									\
-static __always_inline void __##func(struct pt_regs *regs,		\
-				     unsigned long error_code)
+	_DEFINE_IDTENTRY_ERRORCODE(func, false, __always_inline, NULL)
 
 /**
  * DECLARE_IDTENTRY_RAW - Declare functions for raw IDT entry points
@@ -161,7 +193,7 @@ __visible noinstr void func(struct pt_regs *regs)
  * is required before the enter/exit() helpers are invoked.
  */
 #define DEFINE_IDTENTRY_RAW_ERRORCODE(func)				\
-__visible noinstr void func(struct pt_regs *regs, unsigned long error_code)
+__visible noinstr void func(struct pt_regs *regs, u32 error_code)
 
 /**
  * DECLARE_IDTENTRY_IRQ - Declare functions for device interrupt IDT entry
@@ -187,25 +219,11 @@ __visible noinstr void func(struct pt_regs *regs, unsigned long error_code)
  * has to be done in the function body if necessary.
  */
 #define DEFINE_IDTENTRY_IRQ(func)					\
-static void __##func(struct pt_regs *regs, u32 vector);			\
-									\
-__visible noinstr void func(struct pt_regs *regs,			\
-			    unsigned long error_code)			\
-{									\
-	irqentry_state_t state = irqentry_enter(regs);			\
-	u32 vector = (u32)(u8)error_code;				\
-									\
-	instrumentation_begin();					\
-	kvm_set_cpu_l1tf_flush_l1d();					\
-	run_irq_on_irqstack_cond(__##func, regs, vector);		\
-	instrumentation_end();						\
-	irqentry_exit(regs, state);					\
-}									\
-									\
-static noinline void __##func(struct pt_regs *regs, u32 vector)
+	_DEFINE_IDTENTRY_ERRORCODE(func, true, noinline, run_on_irqstack_cond)
 
 /**
- * DECLARE_IDTENTRY_SYSVEC - Declare functions for system vector entry points
+ * DECLARE_IDTENTRY - Declare functions for simple IDT entry points
+ *		      No error code pushed by hardware
  * @vector:	Vector number (ignored for C)
  * @func:	Function name of the entry point
  *
@@ -214,9 +232,11 @@ static noinline void __##func(struct pt_regs *regs, u32 vector)
  * - The XEN PV trap entry point: xen_##func (maybe unused)
  * - The C handler called from the ASM entry point
  *
- * Maps to DECLARE_IDTENTRY().
+ * Note: This is the C variant of DECLARE_IDTENTRY(). As the name says it
+ * declares the entry points for usage in C code. There is an ASM variant
+ * as well which is used to emit the entry stubs in entry_32/64.S.
  */
-#define DECLARE_IDTENTRY_SYSVEC(vector, func)				\
+#define DECLARE_IDTENTRY_SYSVEC(vector, func)	\
 	DECLARE_IDTENTRY(vector, func)
 
 /**
@@ -229,20 +249,7 @@ static noinline void __##func(struct pt_regs *regs, u32 vector)
  * Runs the function on the interrupt stack if the entry hit kernel mode
  */
 #define DEFINE_IDTENTRY_SYSVEC(func)					\
-static void __##func(struct pt_regs *regs);				\
-									\
-__visible noinstr void func(struct pt_regs *regs)			\
-{									\
-	irqentry_state_t state = irqentry_enter(regs);			\
-									\
-	instrumentation_begin();					\
-	kvm_set_cpu_l1tf_flush_l1d();					\
-	run_sysvec_on_irqstack_cond(__##func, regs);			\
-	instrumentation_end();						\
-	irqentry_exit(regs, state);					\
-}									\
-									\
-static noinline void __##func(struct pt_regs *regs)
+	_DEFINE_IDTENTRY(func, true, noinline, run_on_irqstack_cond)
 
 /**
  * DEFINE_IDTENTRY_SYSVEC_SIMPLE - Emit code for simple system vector IDT
@@ -255,23 +262,16 @@ static noinline void __##func(struct pt_regs *regs)
  * Only use for 'empty' vectors like reschedule IPI and KVM posted
  * interrupt vectors.
  */
+static __always_inline void
+call_sysvec_simple(irq_func_t func, struct pt_regs *regs, u32 arg)
+{
+	__irq_enter_raw();
+	func(regs, arg);
+	__irq_exit_raw();
+}
+
 #define DEFINE_IDTENTRY_SYSVEC_SIMPLE(func)				\
-static __always_inline void __##func(struct pt_regs *regs);		\
-									\
-__visible noinstr void func(struct pt_regs *regs)			\
-{									\
-	irqentry_state_t state = irqentry_enter(regs);			\
-									\
-	instrumentation_begin();					\
-	__irq_enter_raw();						\
-	kvm_set_cpu_l1tf_flush_l1d();					\
-	__##func (regs);						\
-	__irq_exit_raw();						\
-	instrumentation_end();						\
-	irqentry_exit(regs, state);					\
-}									\
-									\
-static __always_inline void __##func(struct pt_regs *regs)
+	_DEFINE_IDTENTRY(func, true, __always_inline, call_sysvec_simple)
 
 /**
  * DECLARE_IDTENTRY_XENCB - Declare functions for XEN HV callback entry point
@@ -312,8 +312,8 @@ static __always_inline void __##func(struct pt_regs *regs)
  */
 #define DECLARE_IDTENTRY_VC(vector, func)				\
 	DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func);			\
-	__visible noinstr void ist_##func(struct pt_regs *regs, unsigned long error_code);	\
-	__visible noinstr void safe_stack_##func(struct pt_regs *regs, unsigned long error_code)
+	__visible noinstr void ist_##func(struct pt_regs *regs, u32 error_code);	\
+	__visible noinstr void safe_stack_##func(struct pt_regs *regs, u32 error_code)
 
 /**
  * DEFINE_IDTENTRY_IST - Emit code for IST entry points
@@ -396,8 +396,7 @@ static __always_inline void __##func(struct pt_regs *regs)
  */
 #define DECLARE_IDTENTRY_DF(vector, func)				\
 	asmlinkage void asm_##func(void);				\
-	__visible void func(struct pt_regs *regs,			\
-			    unsigned long error_code,			\
+	__visible void func(struct pt_regs *regs, u32 error_code,	\
 			    unsigned long address)
 
 /**
@@ -408,8 +407,7 @@ static __always_inline void __##func(struct pt_regs *regs)
  * cr2 in the address argument.
  */
 #define DEFINE_IDTENTRY_DF(func)					\
-__visible noinstr void func(struct pt_regs *regs,			\
-			    unsigned long error_code,			\
+__visible noinstr void func(struct pt_regs *regs, u32 error_code,	\
 			    unsigned long address)
 
 #endif	/* !CONFIG_X86_64 */
diff --git a/arch/x86/include/asm/irq_stack.h b/arch/x86/include/asm/irq_stack.h
index 562854c60808..305ca95b2743 100644
--- a/arch/x86/include/asm/irq_stack.h
+++ b/arch/x86/include/asm/irq_stack.h
@@ -6,6 +6,8 @@
 
 #include <asm/processor.h>
 
+typedef void (*irq_func_t)(struct pt_regs *regs, u32 arg);
+
 #ifdef CONFIG_X86_64
 
 /*
@@ -132,7 +134,7 @@
 }
 
 /*
- * Function call sequence for __call_on_irqstack() for system vectors.
+ * Function call sequence for __call_on_irqstack() for irqs and system vectors.
  *
  * Note that irq_enter_rcu() and irq_exit_rcu() do not use the input
  * mechanism because these functions are global and cannot be optimized out
@@ -145,27 +147,6 @@
  * call to idtentry_exit() anyway, it's likely that it does not cause extra
  * effort for this asm magic.
  */
-#define ASM_CALL_SYSVEC							\
-	"call irq_enter_rcu				\n"		\
-	"movq	%[arg1], %%rdi				\n"		\
-	"call %P[__func]				\n"		\
-	"call irq_exit_rcu				\n"
-
-#define SYSVEC_CONSTRAINTS	, [arg1] "r" (regs)
-
-#define run_sysvec_on_irqstack_cond(func, regs)				\
-{									\
-	assert_function_type(func, void (*)(struct pt_regs *));		\
-	assert_arg_type(regs, struct pt_regs *);			\
-									\
-	call_on_irqstack_cond(func, regs, ASM_CALL_SYSVEC,		\
-			      SYSVEC_CONSTRAINTS, regs);		\
-}
-
-/*
- * As in ASM_CALL_SYSVEC above the clobbers force the compiler to store
- * @regs and @vector in callee saved registers.
- */
 #define ASM_CALL_IRQ							\
 	"call irq_enter_rcu				\n"		\
 	"movq	%[arg1], %%rdi				\n"		\
@@ -173,16 +154,13 @@
 	"call %P[__func]				\n"		\
 	"call irq_exit_rcu				\n"
 
-#define IRQ_CONSTRAINTS	, [arg1] "r" (regs), [arg2] "r" (vector)
+#define IRQ_CONSTRAINTS	, [arg1] "r" (regs), [arg2] "r" (arg)
 
-#define run_irq_on_irqstack_cond(func, regs, vector)			\
-{									\
-	assert_function_type(func, void (*)(struct pt_regs *, u32));	\
-	assert_arg_type(regs, struct pt_regs *);			\
-	assert_arg_type(vector, u32);					\
-									\
-	call_on_irqstack_cond(func, regs, ASM_CALL_IRQ,			\
-			      IRQ_CONSTRAINTS, regs, vector);		\
+static __always_inline void
+run_on_irqstack_cond(irq_func_t func, struct pt_regs *regs, u32 arg)
+{
+	call_on_irqstack_cond(func, regs, ASM_CALL_IRQ,
+			      IRQ_CONSTRAINTS, regs, arg);
 }
 
 #define ASM_CALL_SOFTIRQ						\
@@ -194,28 +172,25 @@
  * interrupts are pending to be processed. The interrupt stack cannot be in
  * use here.
  */
-#define do_softirq_own_stack()						\
-{									\
-	__this_cpu_write(hardirq_stack_inuse, true);			\
-	call_on_irqstack(__do_softirq, ASM_CALL_SOFTIRQ);		\
-	__this_cpu_write(hardirq_stack_inuse, false);			\
+static __always_inline void do_softirq_own_stack(void)
+{
+	__this_cpu_write(hardirq_stack_inuse, true);
+	call_on_irqstack(__do_softirq, ASM_CALL_SOFTIRQ);
+	__this_cpu_write(hardirq_stack_inuse, false);
 }
 
 #else /* CONFIG_X86_64 */
-/* System vector handlers always run on the stack they interrupted. */
-#define run_sysvec_on_irqstack_cond(func, regs)				\
-{									\
-	irq_enter_rcu();						\
-	func(regs);							\
-	irq_exit_rcu();							\
-}
 
-/* Switches to the irq stack within func() */
-#define run_irq_on_irqstack_cond(func, regs, vector)			\
-{									\
-	irq_enter_rcu();						\
-	func(regs, vector);						\
-	irq_exit_rcu();							\
+/*
+ * System vector handlers always run on the stack they interrupted;
+ * irqs switch to the irq stack withing func().
+ */
+static __always_inline void
+run_on_irqstack_cond(irq_func_t func, struct pt_regs *regs, u32 arg)
+{
+	irq_enter_rcu();
+	func(regs, arg);
+	irq_exit_rcu();
 }
 
 #endif /* !CONFIG_X86_64 */
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 4a39fb429f15..64832869e1a1 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -2188,7 +2188,7 @@ static noinline void handle_spurious_interrupt(u8 vector)
  */
 DEFINE_IDTENTRY_IRQ(spurious_interrupt)
 {
-	handle_spurious_interrupt(vector);
+	handle_spurious_interrupt((u8)error_code);
 }
 
 DEFINE_IDTENTRY_SYSVEC(sysvec_spurious_apic_interrupt)
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index e28f6a5d14f1..27994818d9b1 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -239,6 +239,7 @@ static __always_inline void handle_irq(struct irq_desc *desc,
  */
 DEFINE_IDTENTRY_IRQ(common_interrupt)
 {
+	const u8 vector = error_code;
 	struct pt_regs *old_regs = set_irq_regs(regs);
 	struct irq_desc *desc;
 
diff --git a/arch/x86/kernel/sev-es.c b/arch/x86/kernel/sev-es.c
index 73873b007838..bdd75b71d0f3 100644
--- a/arch/x86/kernel/sev-es.c
+++ b/arch/x86/kernel/sev-es.c
@@ -1335,15 +1335,15 @@ DEFINE_IDTENTRY_VC_SAFE_STACK(exc_vmm_communication)
 		vc_finish_insn(&ctxt);
 		break;
 	case ES_UNSUPPORTED:
-		pr_err_ratelimited("Unsupported exit-code 0x%02lx in early #VC exception (IP: 0x%lx)\n",
+		pr_err_ratelimited("Unsupported exit-code 0x%02x in early #VC exception (IP: 0x%lx)\n",
 				   error_code, regs->ip);
 		goto fail;
 	case ES_VMM_ERROR:
-		pr_err_ratelimited("Failure in communication with VMM (exit-code 0x%02lx IP: 0x%lx)\n",
+		pr_err_ratelimited("Failure in communication with VMM (exit-code 0x%02x IP: 0x%lx)\n",
 				   error_code, regs->ip);
 		goto fail;
 	case ES_DECODE_FAILED:
-		pr_err_ratelimited("Failed to decode instruction (exit-code 0x%02lx IP: 0x%lx)\n",
+		pr_err_ratelimited("Failed to decode instruction (exit-code 0x%02x IP: 0x%lx)\n",
 				   error_code, regs->ip);
 		goto fail;
 	case ES_EXCEPTION:
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 853ea7a80806..f5aecbb44bc7 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -461,7 +461,7 @@ DEFINE_IDTENTRY_DF(exc_double_fault)
 	}
 #endif
 
-	pr_emerg("PANIC: double fault, error_code: 0x%lx\n", error_code);
+	pr_emerg("PANIC: double fault, error_code: 0x%x\n", error_code);
 	die("double fault", regs, error_code);
 	panic("Machine halted.");
 	instrumentation_end();
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
  2021-05-12 18:00         ` H. Peter Anvin
@ 2021-05-12 18:40           ` Ingo Molnar
  0 siblings, 0 replies; 20+ messages in thread
From: Ingo Molnar @ 2021-05-12 18:40 UTC (permalink / raw)
  To: H. Peter Anvin
  Cc: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Andy Lutomirski,
	Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List


* H. Peter Anvin <hpa@zytor.com> wrote:

> 
> 
> On 5/12/21 1:38 AM, Ingo Molnar wrote:
> > 
> > * H. Peter Anvin <hpa@zytor.com> wrote:
> > 
> > > On 5/11/21 7:22 AM, Thomas Gleixner wrote:
> > > > 
> > > > That's not really making the code more readable. Something like the
> > > > below perhaps?
> > > > 
> > > > #define IDTENTRY_INVOKE_SYSVEC(func, regs, raw)				\
> > > > do {									\
> > > > 	irqentry_state_t state = irqentry_enter(regs);			\
> > > > 									\
> > > > 	instrumentation_begin();					\
> > > > 	kvm_set_cpu_l1tf_flush_l1d();					\
> > > >           if (raw) {							\
> > > > 		__irq_enter_raw();					\
> > > > 		func(regs);						\
> > > > 		__irq_exit_raw();			                \
> > > > 	} else {	                                                \
> > > > 		run_sysvec_on_irqstack_cond(func, regs);	        \
> > > >           }                                                               \
> > > > 	instrumentation_end();						\
> > > >           irqentry_exit(regs, state);					\
> > > > } while (0)								\
> > > > 
> > > 
> > > Digging more into it, it looks like a *lot* of the macros in
> > > <asm/irq_stack.h> and <asm/idtentry.h> can be replaced with inlines without
> > > any change in functionality or generated code.
> > 
> > That would be a much preferred outcome ...
> 
> Well, here is an RFC. This is obviously a much bigger change and I don't
> feel it is mature yet, but it would be good to know if you (plural) feel it
> is in the right direction.

Looks much cleaner IMO, and there's also some linecount reduction:

>  7 files changed, 117 insertions(+), 142 deletions(-)

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h>
  2021-05-11  0:55 ` [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h> H. Peter Anvin
@ 2021-05-14 22:53   ` Andy Lutomirski
  0 siblings, 0 replies; 20+ messages in thread
From: Andy Lutomirski @ 2021-05-14 22:53 UTC (permalink / raw)
  To: H. Peter Anvin, Ingo Molnar, Thomas Gleixner, Borislav Petkov
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List

On 5/10/21 5:55 PM, H. Peter Anvin wrote:
> From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
> 
> The x86 architecture supports up to 32 trap vectors. Add that constant
> to <asm/trapnr.h>.
> 
> Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
> ---
>  arch/x86/include/asm/trapnr.h | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/arch/x86/include/asm/trapnr.h b/arch/x86/include/asm/trapnr.h
> index f5d2325aa0b7..f0baf92da20b 100644
> --- a/arch/x86/include/asm/trapnr.h
> +++ b/arch/x86/include/asm/trapnr.h
> @@ -27,6 +27,7 @@
>  #define X86_TRAP_VE		20	/* Virtualization Exception */
>  #define X86_TRAP_CP		21	/* Control Protection Exception */
>  #define X86_TRAP_VC		29	/* VMM Communication Exception */
> +#define X86_NR_HW_TRAPS		32	/* Max hardware trap number */
>  #define X86_TRAP_IRET		32	/* IRET Exception */
>  
>  #endif
> 

Acked-by: Andy Lutomirski <luto@kernel.org>

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/6] x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS
  2021-05-11  0:55 ` [PATCH 2/6] x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS H. Peter Anvin
@ 2021-05-14 22:53   ` Andy Lutomirski
  0 siblings, 0 replies; 20+ messages in thread
From: Andy Lutomirski @ 2021-05-14 22:53 UTC (permalink / raw)
  To: H. Peter Anvin, Ingo Molnar, Thomas Gleixner, Borislav Petkov
  Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
	Linux Kernel Mailing List

On 5/10/21 5:55 PM, H. Peter Anvin wrote:
> From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
> 
> Add defines for the number of external vectors and number of system
> vectors instead of requiring the use of (FIRST_SYSTEM_VECTOR -
> FIRST_EXTERNAL_VECTOR) and (NR_VECTORS - FIRST_SYSTEM_VECTOR)
> respectively.


Acked-by: Andy Lutomirski <luto@kernel.org>

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2021-05-14 22:53 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-11  0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
2021-05-11  0:55 ` [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h> H. Peter Anvin
2021-05-14 22:53   ` Andy Lutomirski
2021-05-11  0:55 ` [PATCH 2/6] x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS H. Peter Anvin
2021-05-14 22:53   ` Andy Lutomirski
2021-05-11  0:55 ` [PATCH 3/6] x86/idt: remove address argument to idt_invalidate() H. Peter Anvin
2021-05-11  4:37   ` kernel test robot
2021-05-11 14:14   ` Thomas Gleixner
2021-05-11 14:43     ` H. Peter Anvin
2021-05-11  0:55 ` [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE] H. Peter Anvin
2021-05-11 14:22   ` Thomas Gleixner
2021-05-11 17:44     ` H. Peter Anvin
2021-05-12  8:38       ` Ingo Molnar
2021-05-12 18:00         ` H. Peter Anvin
2021-05-12 18:40           ` Ingo Molnar
2021-05-11  0:55 ` [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt H. Peter Anvin
2021-05-11 14:23   ` Thomas Gleixner
2021-05-11 15:55     ` H. Peter Anvin
2021-05-11  0:55 ` [PATCH 6/6] x86/irq: remove unused vectors from <asm/irq_vectors.h> H. Peter Anvin
2021-05-11 17:04   ` Steve Wahl

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).