From: Neeraj Upadhyay <Neeraj.Upadhyay@amd.com>
To: <linux-kernel@vger.kernel.org>
Cc: <bp@alien8.de>, <tglx@linutronix.de>, <mingo@redhat.com>,
<dave.hansen@linux.intel.com>, <Thomas.Lendacky@amd.com>,
<nikunj@amd.com>, <Santosh.Shukla@amd.com>,
<Vasant.Hegde@amd.com>, <Suravee.Suthikulpanit@amd.com>,
<David.Kaplan@amd.com>, <x86@kernel.org>, <hpa@zytor.com>,
<peterz@infradead.org>, <seanjc@google.com>,
<pbonzini@redhat.com>, <kvm@vger.kernel.org>,
<kirill.shutemov@linux.intel.com>, <huibo.wang@amd.com>,
<naveen.rao@amd.com>, <kai.huang@intel.com>
Subject: [RFC PATCH v8 03/35] x86/apic: KVM: Deduplicate APIC vector => register+bit math
Date: Wed, 9 Jul 2025 09:02:10 +0530 [thread overview]
Message-ID: <20250709033242.267892-4-Neeraj.Upadhyay@amd.com> (raw)
In-Reply-To: <20250709033242.267892-1-Neeraj.Upadhyay@amd.com>
From: Sean Christopherson <seanjc@google.com>
Consolidate KVM's {REG,VEC}_POS() macros and lapic_vector_set_in_irr()'s
open coded equivalent logic in anticipation of the kernel gaining more
usage of vector => reg+bit lookups.
Use lapic_vector_set_in_irr()'s math as using divides for both the bit
number and register offset makes it easier to connect the dots, and for at
least one user, fixup_irqs(), "/ 32 * 0x10" generates ever so slightly
better code with gcc-14 (shaves a whole 3 bytes from the code stream):
((v) >> 5) << 4:
c1 ef 05 shr $0x5,%edi
c1 e7 04 shl $0x4,%edi
81 c7 00 02 00 00 add $0x200,%edi
(v) / 32 * 0x10:
c1 ef 05 shr $0x5,%edi
83 c7 20 add $0x20,%edi
c1 e7 04 shl $0x4,%edi
Keep KVM's tersely named macros as "wrappers" to avoid unnecessary churn
in KVM, and because the shorter names yield more readable code overall in
KVM.
The new macros type cast the vector parameter to "unsigned int". This is
required from better code generation for cases where an "int" is passed
to these macros in KVM code.
int v;
((v) >> 5) << 4:
c1 f8 05 sar $0x5,%eax
c1 e0 04 shl $0x4,%eax
((v) / 32 * 0x10):
85 ff test %edi,%edi
8d 47 1f lea 0x1f(%rdi),%eax
0f 49 c7 cmovns %edi,%eax
c1 f8 05 sar $0x5,%eax
c1 e0 04 shl $0x4,%eax
((unsigned int)(v) / 32 * 0x10):
c1 f8 05 sar $0x5,%eax
c1 e0 04 shl $0x4,%eax
(v) & (32 - 1):
89 f8 mov %edi,%eax
83 e0 1f and $0x1f,%eax
(v) % 32
89 fa mov %edi,%edx
c1 fa 1f sar $0x1f,%edx
c1 ea 1b shr $0x1b,%edx
8d 04 17 lea (%rdi,%rdx,1),%eax
83 e0 1f and $0x1f,%eax
29 d0 sub %edx,%eax
(unsigned int)(v) % 32:
89 f8 mov %edi,%eax
83 e0 1f and $0x1f,%eax
Overall kvm.ko text size is impacted if "unsigned int" is not used.
Bin Orig New (w/o unsigned int) New (w/ unsigned int)
lapic.o 28580 28772 28580
kvm.o 670810 671002 670810
kvm.ko 708079 708271 708079
No functional change intended.
[Neeraj: Type cast vec macro param to "unsigned int", provide data
in commit log on "unsigned int" requirement]
Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Neeraj Upadhyay <Neeraj.Upadhyay@amd.com>
---
Changes since v7:
- No change.
arch/x86/include/asm/apic.h | 7 +++++--
arch/x86/kvm/lapic.h | 4 ++--
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index 23d86c9750b9..c84d4e86fe4e 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -488,11 +488,14 @@ static inline void apic_setup_apic_calls(void) { }
extern void apic_ack_irq(struct irq_data *data);
+#define APIC_VECTOR_TO_BIT_NUMBER(v) ((unsigned int)(v) % 32)
+#define APIC_VECTOR_TO_REG_OFFSET(v) ((unsigned int)(v) / 32 * 0x10)
+
static inline bool lapic_vector_set_in_irr(unsigned int vector)
{
- u32 irr = apic_read(APIC_IRR + (vector / 32 * 0x10));
+ u32 irr = apic_read(APIC_IRR + APIC_VECTOR_TO_REG_OFFSET(vector));
- return !!(irr & (1U << (vector % 32)));
+ return !!(irr & (1U << APIC_VECTOR_TO_BIT_NUMBER(vector)));
}
static inline bool is_vector_pending(unsigned int vector)
diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h
index 1638a3da383a..56369d331bfc 100644
--- a/arch/x86/kvm/lapic.h
+++ b/arch/x86/kvm/lapic.h
@@ -145,8 +145,8 @@ void kvm_lapic_exit(void);
u64 kvm_lapic_readable_reg_mask(struct kvm_lapic *apic);
-#define VEC_POS(v) ((v) & (32 - 1))
-#define REG_POS(v) (((v) >> 5) << 4)
+#define VEC_POS(v) APIC_VECTOR_TO_BIT_NUMBER(v)
+#define REG_POS(v) APIC_VECTOR_TO_REG_OFFSET(v)
static inline void kvm_lapic_clear_vector(int vec, void *bitmap)
{
--
2.34.1
next prev parent reply other threads:[~2025-07-09 3:33 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-09 3:32 [RFC PATCH v8 00/35] AMD: Add Secure AVIC Guest Support Neeraj Upadhyay
2025-07-09 3:32 ` [RFC PATCH v8 01/35] KVM: x86: Open code setting/clearing of bits in the ISR Neeraj Upadhyay
2025-07-09 14:03 ` Sean Christopherson
2025-07-09 3:32 ` [RFC PATCH v8 02/35] KVM: x86: Remove redundant parentheses around 'bitmap' Neeraj Upadhyay
2025-07-09 3:32 ` Neeraj Upadhyay [this message]
2025-07-09 3:32 ` [RFC PATCH v8 04/35] KVM: x86: Rename VEC_POS/REG_POS macro usages Neeraj Upadhyay
2025-07-09 14:05 ` Sean Christopherson
2025-07-09 14:09 ` Sean Christopherson
2025-07-10 3:37 ` Neeraj Upadhyay
2025-07-09 3:32 ` [RFC PATCH v8 05/35] KVM: x86: Change lapic regs base address to void pointer Neeraj Upadhyay
2025-07-09 14:05 ` Sean Christopherson
2025-07-09 3:32 ` [RFC PATCH v8 06/35] KVM: x86: Rename find_highest_vector() Neeraj Upadhyay
2025-07-09 14:05 ` Sean Christopherson
2025-07-09 3:32 ` [RFC PATCH v8 07/35] KVM: x86: Rename lapic get/set_reg() helpers Neeraj Upadhyay
2025-07-09 14:06 ` Sean Christopherson
2025-07-09 3:32 ` [RFC PATCH v8 08/35] KVM: x86: Rename lapic get/set_reg64() helpers Neeraj Upadhyay
2025-07-09 14:06 ` Sean Christopherson
2025-07-09 3:32 ` [RFC PATCH v8 09/35] KVM: x86: Rename lapic set/clear vector helpers Neeraj Upadhyay
2025-07-09 14:06 ` Sean Christopherson
2025-07-09 3:32 ` [RFC PATCH v8 10/35] x86/apic: KVM: Move apic_find_highest_vector() to a common header Neeraj Upadhyay
2025-07-09 3:32 ` [RFC PATCH v8 11/35] x86/apic: KVM: Move lapic get/set helpers to common code Neeraj Upadhyay
2025-07-09 14:06 ` Sean Christopherson
2025-07-09 3:32 ` [RFC PATCH v8 12/35] x86/apic: KVM: Move lapic set/clear_vector() " Neeraj Upadhyay
2025-07-09 14:07 ` Sean Christopherson
2025-07-09 3:32 ` [RFC PATCH v8 13/35] x86/apic: KVM: Move apic_test)vector() " Neeraj Upadhyay
2025-07-09 14:07 ` Sean Christopherson
2025-07-09 3:32 ` [RFC PATCH v8 14/35] x86/apic: Rename 'reg_off' to 'reg' Neeraj Upadhyay
2025-07-09 3:32 ` [RFC PATCH v8 15/35] x86/apic: Unionize apic regs for 32bit/64bit access w/o type casting Neeraj Upadhyay
2025-07-09 14:32 ` Sean Christopherson
2025-07-10 3:43 ` Neeraj Upadhyay
2025-07-12 15:21 ` Borislav Petkov
2025-07-12 17:08 ` Neeraj Upadhyay
2025-07-12 18:46 ` Borislav Petkov
2025-07-13 2:11 ` Neeraj Upadhyay
2025-07-14 13:32 ` Sean Christopherson
2025-07-09 3:32 ` [RFC PATCH v8 16/35] x86/apic: Simplify bitwise operations on APIC bitmap Neeraj Upadhyay
2025-07-09 14:35 ` Sean Christopherson
2025-07-14 10:52 ` Borislav Petkov
2025-07-14 11:06 ` Neeraj Upadhyay
2025-07-09 3:32 ` [RFC PATCH v8 17/35] x86/apic: Move apic_update_irq_cfg() calls to apic_update_vector() Neeraj Upadhyay
2025-07-15 10:28 ` [tip: x86/cleanups] x86/apic: Move apic_update_irq_cfg() call " tip-bot2 for Neeraj Upadhyay
2025-07-09 3:32 ` [RFC PATCH v8 18/35] x86/apic: Add new driver for Secure AVIC Neeraj Upadhyay
2025-07-09 3:32 ` [RFC PATCH v8 19/35] x86/apic: Initialize Secure AVIC APIC backing page Neeraj Upadhyay
2025-07-15 4:49 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 20/35] x86/apic: Populate .read()/.write() callbacks of Secure AVIC driver Neeraj Upadhyay
2025-07-15 8:15 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 21/35] x86/apic: Initialize APIC ID for Secure AVIC Neeraj Upadhyay
2025-07-15 8:16 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 22/35] x86/apic: Add update_vector() callback for apic drivers Neeraj Upadhyay
2025-07-09 3:32 ` [RFC PATCH v8 23/35] x86/apic: Add update_vector() callback for Secure AVIC Neeraj Upadhyay
2025-07-15 10:15 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 24/35] x86/apic: Add support to send IPI " Neeraj Upadhyay
2025-07-18 1:45 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 25/35] x86/apic: Support LAPIC timer " Neeraj Upadhyay
2025-07-18 2:14 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 26/35] x86/sev: Initialize VGIF for secondary VCPUs " Neeraj Upadhyay
2025-07-18 2:16 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 27/35] x86/apic: Add support to send NMI IPI " Neeraj Upadhyay
2025-07-18 2:57 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 28/35] x86/apic: Allow NMI to be injected from hypervisor " Neeraj Upadhyay
2025-07-18 2:58 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 29/35] x86/sev: Enable NMI support " Neeraj Upadhyay
2025-07-18 3:00 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 30/35] x86/apic: Read and write LVT* APIC registers from HV for SAVIC guests Neeraj Upadhyay
2025-07-18 3:08 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 31/35] x86/apic: Handle EOI writes for Secure AVIC guests Neeraj Upadhyay
2025-07-20 4:56 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 32/35] x86/apic: Add kexec support for Secure AVIC Neeraj Upadhyay
2025-07-09 3:32 ` [RFC PATCH v8 33/35] x86/apic: Enable Secure AVIC in Control MSR Neeraj Upadhyay
2025-07-20 5:47 ` Tianyu Lan
2025-07-09 3:32 ` [RFC PATCH v8 34/35] x86/sev: Prevent SECURE_AVIC_CONTROL MSR interception for Secure AVIC guests Neeraj Upadhyay
2025-07-09 3:32 ` [RFC PATCH v8 35/35] x86/sev: Indicate SEV-SNP guest supports Secure AVIC Neeraj Upadhyay
2025-07-20 5:49 ` Tianyu Lan
2025-07-09 14:41 ` [RFC PATCH v8 00/35] AMD: Add Secure AVIC Guest Support Sean Christopherson
2025-07-09 21:41 ` Borislav Petkov
2025-07-10 23:08 ` Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250709033242.267892-4-Neeraj.Upadhyay@amd.com \
--to=neeraj.upadhyay@amd.com \
--cc=David.Kaplan@amd.com \
--cc=Santosh.Shukla@amd.com \
--cc=Suravee.Suthikulpanit@amd.com \
--cc=Thomas.Lendacky@amd.com \
--cc=Vasant.Hegde@amd.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=huibo.wang@amd.com \
--cc=kai.huang@intel.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=naveen.rao@amd.com \
--cc=nikunj@amd.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=seanjc@google.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®