From: Sean Christopherson <seanjc@google.com>
To: Maxim Levitsky <mlevitsk@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Alejandro Jimenez <alejandro.j.jimenez@oracle.com>,
Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>,
Li RongQing <lirongqing@baidu.com>
Subject: Re: [PATCH v4 19/32] KVM: x86: Explicitly track all possibilities for APIC map's logical modes
Date: Fri, 16 Dec 2022 18:39:16 +0000 [thread overview]
Message-ID: <Y5y7VK9yk5qbfKVN@google.com> (raw)
In-Reply-To: <96c369fb2042e8722256d36c9b2ccf4a930752d1.camel@redhat.com>
On Thu, Dec 08, 2022, Maxim Levitsky wrote:
> On Sat, 2022-10-01 at 00:59 +0000, Sean Christopherson wrote:
> > -#define KVM_APIC_MODE_XAPIC_CLUSTER 4
> > -#define KVM_APIC_MODE_XAPIC_FLAT 8
> > -#define KVM_APIC_MODE_X2APIC 16
> > +enum kvm_apic_logical_mode {
>
> It would be nice to have short comment about each of the modes, like
>
> /* All local APICs are disabled */
> > + KVM_APIC_MODE_SW_DISABLED,
> /* All enabled local APICs are in XAPIC mode using cluster logical addresssing */
> > + KVM_APIC_MODE_XAPIC_CLUSTER,
> /* All enabled local APICs are in XAPIC mode using flat logical addresssing */
> > + KVM_APIC_MODE_XAPIC_FLAT,
> /* All enabled local APICs are in X2APIC mode */
> > + KVM_APIC_MODE_X2APIC,
> /*
> Due to differencies in mode between enabled local APICs and/or other corner cases,
> the optimized logical map disabled
> */
I'll add that.
> > + KVM_APIC_MODE_MAP_DISABLED,
> > +};
> >
> > struct kvm_apic_map {
> > struct rcu_head rcu;
> > - u8 mode;
> > + enum kvm_apic_logical_mode logical_mode;
> > u32 max_apic_id;
> > union {
> > struct kvm_lapic *xapic_flat_map[8];
> > diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> > index cef8b202490b..9989893fef69 100644
> > --- a/arch/x86/kvm/lapic.c
> > +++ b/arch/x86/kvm/lapic.c
> > @@ -168,7 +168,12 @@ static bool kvm_use_posted_timer_interrupt(struct kvm_vcpu *vcpu)
> >
> > static inline bool kvm_apic_map_get_logical_dest(struct kvm_apic_map *map,
> > u32 dest_id, struct kvm_lapic ***cluster, u16 *mask) {
> > - switch (map->mode) {
> > + switch (map->logical_mode) {
> > + case KVM_APIC_MODE_SW_DISABLED:
> > + /* Arbitrarily use the flat map so that @cluster isn't NULL. */
> > + *cluster = map->xapic_flat_map;
> > + *mask = 0;
> > + return true;
> > case KVM_APIC_MODE_X2APIC: {
> > u32 offset = (dest_id >> 16) * 16;
> > u32 max_apic_id = map->max_apic_id;
> > @@ -193,8 +198,10 @@ static inline bool kvm_apic_map_get_logical_dest(struct kvm_apic_map *map,
> > *cluster = map->xapic_cluster_map[(dest_id >> 4) & 0xf];
> > *mask = dest_id & 0xf;
> > return true;
> > + case KVM_APIC_MODE_MAP_DISABLED:
> > + return false;
> > default:
> > - /* Not optimized. */
> > + WARN_ON_ONCE(1);
> > return false;
> > }
> > }
> > @@ -256,10 +263,12 @@ void kvm_recalculate_apic_map(struct kvm *kvm)
> > goto out;
> >
> > new->max_apic_id = max_id;
> > + new->logical_mode = KVM_APIC_MODE_SW_DISABLED;
> >
> > kvm_for_each_vcpu(i, vcpu, kvm) {
> > struct kvm_lapic *apic = vcpu->arch.apic;
> > struct kvm_lapic **cluster;
> > + enum kvm_apic_logical_mode logical_mode;
> > u16 mask;
> > u32 ldr;
> > u8 xapic_id;
> > @@ -282,7 +291,8 @@ void kvm_recalculate_apic_map(struct kvm *kvm)
> > if (!apic_x2apic_mode(apic) && !new->phys_map[xapic_id])
> > new->phys_map[xapic_id] = apic;
> >
> > - if (!kvm_apic_sw_enabled(apic))
> > + if (new->logical_mode == KVM_APIC_MODE_MAP_DISABLED ||
> > + !kvm_apic_sw_enabled(apic))
> > continue;
> Very minor nitpick: it feels to me that code that updates the logical mode of the
> map, might be better to be in a function, or in 'if', like
An if-statement would be rough due to the indentation. A function works well
though, especially if both the physical and logical chunks are put into helpers.
E.g. the patch at the bottom (with other fixup for this patch) yields:
new->max_apic_id = max_id;
new->logical_mode = KVM_APIC_MODE_SW_DISABLED;
kvm_for_each_vcpu(i, vcpu, kvm) {
if (!kvm_apic_present(vcpu))
continue;
if (kvm_recalculate_phys_map(new, vcpu, &xapic_id_mismatch)) {
kvfree(new);
new = NULL;
goto out;
}
kvm_recalculate_logical_map(new, vcpu);
}
I'll tack that patch on at the end of the series if it looks ok.
> if (new->logical_mode != KVM_APIC_MODE_MAP_DISABLED) {
>
> /* Disabled local APICs don't affect the logical map */
> if (!kvm_apic_sw_enabled(apic))
> continue;
> ....
> }
> >
> > ldr = kvm_lapic_get_reg(apic, APIC_LDR);
> > @@ -290,17 +300,26 @@ void kvm_recalculate_apic_map(struct kvm *kvm)
> > continue;
> >
> > if (apic_x2apic_mode(apic)) {
> > - new->mode |= KVM_APIC_MODE_X2APIC;
> > + logical_mode = KVM_APIC_MODE_X2APIC;
> > } else {
> > ldr = GET_APIC_LOGICAL_ID(ldr);
> > if (kvm_lapic_get_reg(apic, APIC_DFR) == APIC_DFR_FLAT)
> > - new->mode |= KVM_APIC_MODE_XAPIC_FLAT;
> > + logical_mode = KVM_APIC_MODE_XAPIC_FLAT;
> > else
> > - new->mode |= KVM_APIC_MODE_XAPIC_CLUSTER;
> > + logical_mode = KVM_APIC_MODE_XAPIC_CLUSTER;
> > }
> > + if (new->logical_mode != KVM_APIC_MODE_SW_DISABLED &&
> > + new->logical_mode != logical_mode) {
> > + new->logical_mode = KVM_APIC_MODE_MAP_DISABLED;
> > + continue;
> > + }
> > + new->logical_mode = logical_mode;
>
> How about:
>
> if (new->logical_mode == KVM_APIC_MODE_SW_DISABLED)
> new->logical_mode = logical_mode;
>
> if (new->logical_mode != logical_mode) {
> new->logical_mode = KVM_APIC_MODE_MAP_DISABLED;
> continue;
> }
This instead? So that it's a bit more obvious that the SW_DISABLED case is
exclusive with the mismatched mode path.
if (new->logical_mode == KVM_APIC_MODE_SW_DISABLED) {
new->logical_mode = logical_mode;
} else if (new->logical_mode != logical_mode) {
new->logical_mode = KVM_APIC_MODE_MAP_DISABLED;
continue;
}
---
arch/x86/kvm/lapic.c | 245 +++++++++++++++++++++++--------------------
1 file changed, 133 insertions(+), 112 deletions(-)
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 5224d73cd84a..d017f49c5048 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -218,6 +218,134 @@ static void kvm_apic_map_free(struct rcu_head *rcu)
kvfree(map);
}
+static int kvm_recalculate_phys_map(struct kvm_apic_map *new,
+ struct kvm_vcpu *vcpu,
+ bool *xapic_id_mismatch)
+{
+ struct kvm_lapic *apic = vcpu->arch.apic;
+ u32 x2apic_id = kvm_x2apic_id(apic);
+ u32 xapic_id = kvm_xapic_id(apic);
+ u32 physical_id;
+
+ /*
+ * Deliberately truncate the vCPU ID when detecting a mismatched APIC
+ * ID to avoid false positives if the vCPU ID, i.e. x2APIC ID, is a
+ * 32-bit value. Any unwanted aliasing due to truncation results will
+ * be detected below.
+ */
+ if (!apic_x2apic_mode(apic) && xapic_id != (u8)vcpu->vcpu_id)
+ *xapic_id_mismatch = true;
+
+ /*
+ * Apply KVM's hotplug hack if userspace has enable 32-bit APIC IDs.
+ * Allow sending events to vCPUs by their x2APIC ID even if the target
+ * vCPU is in legacy xAPIC mode, and silently ignore aliased xAPIC IDs
+ * (the x2APIC ID is truncated to 8 bits, causing IDs > 0xff to wrap
+ * and collide).
+ *
+ * Honor the architectural (and KVM's non-optimized) behavior if
+ * userspace has not enabled 32-bit x2APIC IDs. Each APIC is supposed
+ * to process messages independently. If multiple vCPUs have the same
+ * effective APIC ID, e.g. due to the x2APIC wrap or because the guest
+ * manually modified its xAPIC IDs, events targeting that ID are
+ * supposed to be recognized by all vCPUs with said ID.
+ */
+ if (vcpu->kvm->arch.x2apic_format) {
+ /* See also kvm_apic_match_physical_addr(). */
+ if ((apic_x2apic_mode(apic) || x2apic_id > 0xff) &&
+ x2apic_id <= new->max_apic_id)
+ new->phys_map[x2apic_id] = apic;
+
+ if (!apic_x2apic_mode(apic) && !new->phys_map[xapic_id])
+ new->phys_map[xapic_id] = apic;
+ } else {
+ /*
+ * Disable the optimized map if the physical APIC ID is already
+ * mapped, i.e. is aliased to multiple vCPUs. The optimized
+ * map requires a strict 1:1 mapping between IDs and vCPUs.
+ */
+ if (apic_x2apic_mode(apic))
+ physical_id = x2apic_id;
+ else
+ physical_id = xapic_id;
+
+ if (new->phys_map[physical_id])
+ return -EINVAL;
+
+ new->phys_map[physical_id] = apic;
+ }
+
+ return 0;
+}
+
+static void kvm_recalculate_logical_map(struct kvm_apic_map *new,
+ struct kvm_vcpu *vcpu)
+{
+ struct kvm_lapic *apic = vcpu->arch.apic;
+ enum kvm_apic_logical_mode logical_mode;
+ struct kvm_lapic **cluster;
+ u16 mask;
+ u32 ldr;
+
+ if (new->logical_mode == KVM_APIC_MODE_MAP_DISABLED)
+ return;
+
+ if (kvm_apic_sw_enabled(apic))
+ return;
+
+ ldr = kvm_lapic_get_reg(apic, APIC_LDR);
+ if (!ldr)
+ return;
+
+ if (apic_x2apic_mode(apic)) {
+ logical_mode = KVM_APIC_MODE_X2APIC;
+ } else {
+ ldr = GET_APIC_LOGICAL_ID(ldr);
+ if (kvm_lapic_get_reg(apic, APIC_DFR) == APIC_DFR_FLAT)
+ logical_mode = KVM_APIC_MODE_XAPIC_FLAT;
+ else
+ logical_mode = KVM_APIC_MODE_XAPIC_CLUSTER;
+ }
+
+ /*
+ * To optimize logical mode delivery, all software-enabled APICs must
+ * be configured for the same mode.
+ */
+ if (new->logical_mode == KVM_APIC_MODE_SW_DISABLED) {
+ new->logical_mode = logical_mode;
+ } else if (new->logical_mode != logical_mode) {
+ new->logical_mode = KVM_APIC_MODE_MAP_DISABLED;
+ return;
+ }
+
+ /*
+ * In x2APIC mode, the LDR is read-only and derived directly from the
+ * x2APIC ID, thus is guaranteed to be addressable. KVM reuses
+ * kvm_apic_map.phys_map to optimize logical mode x2APIC interrupts by
+ * reversing the LDR calculation to get cluster of APICs, i.e. no
+ * additional work is required.
+ */
+ if (apic_x2apic_mode(apic)) {
+ WARN_ON_ONCE(ldr != kvm_apic_calc_x2apic_ldr(kvm_x2apic_id(apic)));
+ return;
+ }
+
+ if (WARN_ON_ONCE(!kvm_apic_map_get_logical_dest(new, ldr,
+ &cluster, &mask))) {
+ new->logical_mode = KVM_APIC_MODE_MAP_DISABLED;
+ return;
+ }
+
+ if (!mask)
+ return;
+
+ ldr = ffs(mask) - 1;
+ if (!is_power_of_2(mask) || cluster[ldr])
+ new->logical_mode = KVM_APIC_MODE_MAP_DISABLED;
+ else
+ cluster[ldr] = apic;
+}
+
/*
* CLEAN -> DIRTY and UPDATE_IN_PROGRESS -> DIRTY changes happen without a lock.
*
@@ -272,123 +400,16 @@ void kvm_recalculate_apic_map(struct kvm *kvm)
new->logical_mode = KVM_APIC_MODE_SW_DISABLED;
kvm_for_each_vcpu(i, vcpu, kvm) {
- struct kvm_lapic *apic = vcpu->arch.apic;
- struct kvm_lapic **cluster;
- enum kvm_apic_logical_mode logical_mode;
- u32 x2apic_id, physical_id;
- u16 mask;
- u32 ldr;
- u8 xapic_id;
-
if (!kvm_apic_present(vcpu))
continue;
- xapic_id = kvm_xapic_id(apic);
- x2apic_id = kvm_x2apic_id(apic);
-
- /*
- * Deliberately truncate the vCPU ID when detecting a mismatched
- * APIC ID to avoid false positives if the vCPU ID, i.e. x2APIC
- * ID, is a 32-bit value. Any unwanted aliasing due to
- * truncation results will be detected below.
- */
- if (!apic_x2apic_mode(apic) && xapic_id != (u8)vcpu->vcpu_id)
- xapic_id_mismatch = true;
-
- /*
- * Apply KVM's hotplug hack if userspace has enable 32-bit APIC
- * IDs. Allow sending events to vCPUs by their x2APIC ID even
- * if the target vCPU is in legacy xAPIC mode, and silently
- * ignore aliased xAPIC IDs (the x2APIC ID is truncated to 8
- * bits, causing IDs > 0xff to wrap and collide).
- *
- * Honor the architectural (and KVM's non-optimized) behavior
- * if userspace has not enabled 32-bit x2APIC IDs. Each APIC
- * is supposed to process messages independently. If multiple
- * vCPUs have the same effective APIC ID, e.g. due to the
- * x2APIC wrap or because the guest manually modified its xAPIC
- * IDs, events targeting that ID are supposed to be recognized
- * by all vCPUs with said ID.
- */
- if (kvm->arch.x2apic_format) {
- /* See also kvm_apic_match_physical_addr(). */
- if ((apic_x2apic_mode(apic) || x2apic_id > 0xff) &&
- x2apic_id <= new->max_apic_id)
- new->phys_map[x2apic_id] = apic;
-
- if (!apic_x2apic_mode(apic) && !new->phys_map[xapic_id])
- new->phys_map[xapic_id] = apic;
- } else {
- /*
- * Disable the optimized map if the physical APIC ID is
- * already mapped, i.e. is aliased to multiple vCPUs.
- * The optimized map requires a strict 1:1 mapping
- * between IDs and vCPUs.
- */
- if (apic_x2apic_mode(apic))
- physical_id = x2apic_id;
- else
- physical_id = xapic_id;
-
- if (new->phys_map[physical_id]) {
- kvfree(new);
- new = NULL;
- goto out;
- }
- new->phys_map[physical_id] = apic;
+ if (kvm_recalculate_phys_map(new, vcpu, &xapic_id_mismatch)) {
+ kvfree(new);
+ new = NULL;
+ goto out;
}
- if (new->logical_mode == KVM_APIC_MODE_MAP_DISABLED ||
- !kvm_apic_sw_enabled(apic))
- continue;
-
- ldr = kvm_lapic_get_reg(apic, APIC_LDR);
- if (!ldr)
- continue;
-
- if (apic_x2apic_mode(apic)) {
- logical_mode = KVM_APIC_MODE_X2APIC;
- } else {
- ldr = GET_APIC_LOGICAL_ID(ldr);
- if (kvm_lapic_get_reg(apic, APIC_DFR) == APIC_DFR_FLAT)
- logical_mode = KVM_APIC_MODE_XAPIC_FLAT;
- else
- logical_mode = KVM_APIC_MODE_XAPIC_CLUSTER;
- }
- if (new->logical_mode != KVM_APIC_MODE_SW_DISABLED &&
- new->logical_mode != logical_mode) {
- new->logical_mode = KVM_APIC_MODE_MAP_DISABLED;
- continue;
- }
- new->logical_mode = logical_mode;
-
- /*
- * In x2APIC mode, the LDR is read-only and derived directly
- * from the x2APIC ID, thus is guaranteed to be addressable.
- * KVM reuses kvm_apic_map.phys_map to optimize logical mode
- * x2APIC interrupts by reversing the LDR calculation to get
- * cluster of APICs, i.e. no additional work is required.
- */
- if (apic_x2apic_mode(apic)) {
- WARN_ON_ONCE(ldr != kvm_apic_calc_x2apic_ldr(x2apic_id));
- continue;
- }
-
- if (WARN_ON_ONCE(!kvm_apic_map_get_logical_dest(new, ldr,
- &cluster, &mask))) {
- new->logical_mode = KVM_APIC_MODE_MAP_DISABLED;
- continue;
- }
-
- if (!mask)
- continue;
-
- ldr = ffs(mask) - 1;
- if (!is_power_of_2(mask) || cluster[ldr]) {
- new->logical_mode = KVM_APIC_MODE_MAP_DISABLED;
- continue;
- }
- cluster[ldr] = apic;
+ kvm_recalculate_logical_map(new, vcpu);
}
out:
/*
base-commit: 46d887a39567c4d1517518e4bdfcc10f34b5d6ce
--
next prev parent reply other threads:[~2022-12-16 18:40 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-01 0:58 [PATCH v4 00/32] KVM: x86: AVIC and local APIC fixes+cleanups Sean Christopherson
2022-10-01 0:58 ` [PATCH v4 01/32] KVM: x86: Blindly get current x2APIC reg value on "nodecode write" traps Sean Christopherson
2022-12-08 21:47 ` Maxim Levitsky
2022-10-01 0:58 ` [PATCH v4 02/32] KVM: x86: Purge "highest ISR" cache when updating APICv state Sean Christopherson
2022-12-08 21:47 ` Maxim Levitsky
2022-10-01 0:58 ` [PATCH v4 03/32] KVM: SVM: Flush the "current" TLB when activating AVIC Sean Christopherson
[not found] ` <b9f336f17eec6bfbb8429700e0f135d19813c576.camel@redhat.com>
2022-12-08 21:52 ` Maxim Levitsky
2022-12-09 0:40 ` Sean Christopherson
2022-12-08 22:02 ` Maxim Levitsky
2022-10-01 0:58 ` [PATCH v4 04/32] KVM: SVM: Process ICR on AVIC IPI delivery failure due to invalid target Sean Christopherson
2022-10-01 0:58 ` [PATCH v4 05/32] KVM: x86: Don't inhibit APICv/AVIC on xAPIC ID "change" if APIC is disabled Sean Christopherson
2022-12-08 21:53 ` Maxim Levitsky
2022-10-01 0:58 ` [PATCH v4 06/32] KVM: x86: Track xAPIC ID only on userspace SET, _after_ vAPIC is updated Sean Christopherson
2022-12-08 21:53 ` Maxim Levitsky
2022-10-01 0:58 ` [PATCH v4 07/32] KVM: x86: Don't inhibit APICv/AVIC if xAPIC ID mismatch is due to 32-bit ID Sean Christopherson
2022-12-08 21:53 ` Maxim Levitsky
2022-10-01 0:58 ` [PATCH v4 08/32] KVM: SVM: Don't put/load AVIC when setting virtual APIC mode Sean Christopherson
2022-12-08 21:53 ` Maxim Levitsky
2022-10-01 0:58 ` [PATCH v4 09/32] KVM: x86: Handle APICv updates for APIC "mode" changes via request Sean Christopherson
2022-12-08 21:54 ` Maxim Levitsky
2022-10-01 0:58 ` [PATCH v4 10/32] KVM: x86: Move APIC access page helper to common x86 code Sean Christopherson
2022-12-08 21:55 ` Maxim Levitsky
2022-10-01 0:58 ` [PATCH v4 11/32] KVM: x86: Inhibit APIC memslot if x2APIC and AVIC are enabled Sean Christopherson
2022-12-08 21:56 ` Maxim Levitsky
2022-12-16 19:03 ` Sean Christopherson
2022-12-16 19:40 ` Sean Christopherson
2022-12-27 11:25 ` Paolo Bonzini
2023-01-03 16:30 ` Sean Christopherson
2022-10-01 0:58 ` [PATCH v4 12/32] KVM: SVM: Replace "avic_mode" enum with "x2avic_enabled" boolean Sean Christopherson
2022-10-01 0:58 ` [PATCH v4 13/32] KVM: SVM: Compute dest based on sender's x2APIC status for AVIC kick Sean Christopherson
2022-10-01 0:58 ` [PATCH v4 14/32] KVM: SVM: Fix x2APIC Logical ID calculation for avic_kick_target_vcpus_fast Sean Christopherson
2022-10-01 0:58 ` [PATCH v4 15/32] Revert "KVM: SVM: Use target APIC ID to complete x2AVIC IRQs when possible" Sean Christopherson
2022-12-08 21:56 ` Maxim Levitsky
2022-10-01 0:58 ` [PATCH v4 16/32] KVM: SVM: Document that vCPU ID == APIC ID in AVIC kick fastpatch Sean Christopherson
2022-10-01 0:59 ` [PATCH v4 17/32] KVM: SVM: Add helper to perform final AVIC "kick" of single vCPU Sean Christopherson
2022-10-01 0:59 ` [PATCH v4 18/32] KVM: x86: Explicitly skip optimized logical map setup if vCPU's LDR==0 Sean Christopherson
2022-12-08 21:56 ` Maxim Levitsky
2022-10-01 0:59 ` [PATCH v4 19/32] KVM: x86: Explicitly track all possibilities for APIC map's logical modes Sean Christopherson
2022-12-08 21:57 ` Maxim Levitsky
2022-12-16 18:39 ` Sean Christopherson [this message]
2022-12-16 23:34 ` Sean Christopherson
2022-12-27 11:30 ` Paolo Bonzini
2022-10-01 0:59 ` [PATCH v4 20/32] KVM: x86: Skip redundant x2APIC logical mode optimized cluster setup Sean Christopherson
2022-12-08 21:57 ` Maxim Levitsky
2022-10-01 0:59 ` [PATCH v4 21/32] KVM: x86: Disable APIC logical map if logical ID covers multiple MDAs Sean Christopherson
2022-10-01 0:59 ` [PATCH v4 22/32] KVM: x86: Disable APIC logical map if vCPUs are aliased in logical mode Sean Christopherson
2022-10-01 0:59 ` [PATCH v4 23/32] KVM: x86: Honor architectural behavior for aliased 8-bit APIC IDs Sean Christopherson
2022-12-08 21:58 ` Maxim Levitsky
2022-10-01 0:59 ` [PATCH v4 24/32] KVM: x86: Inhibit APICv/AVIC if the optimized physical map is disabled Sean Christopherson
2022-12-08 21:58 ` Maxim Levitsky
2022-12-09 0:56 ` Sean Christopherson
2022-10-01 0:59 ` [PATCH v4 25/32] KVM: SVM: Inhibit AVIC if vCPUs are aliased in logical mode Sean Christopherson
2022-12-08 21:58 ` Maxim Levitsky
2022-10-01 0:59 ` [PATCH v4 26/32] KVM: SVM: Always update local APIC on writes to logical dest register Sean Christopherson
2022-12-08 21:58 ` Maxim Levitsky
2022-10-01 0:59 ` [PATCH v4 27/32] KVM: SVM: Update svm->ldr_reg cache even if LDR is "bad" Sean Christopherson
2022-12-08 21:59 ` Maxim Levitsky
2022-12-09 0:49 ` Sean Christopherson
2022-10-01 0:59 ` [PATCH v4 28/32] KVM: SVM: Require logical ID to be power-of-2 for AVIC entry Sean Christopherson
2022-12-08 22:00 ` Maxim Levitsky
2022-12-29 8:27 ` mlevitsk
2023-01-04 10:08 ` Maxim Levitsky
2023-01-04 18:02 ` Sean Christopherson
2023-01-04 18:34 ` Maxim Levitsky
2022-10-01 0:59 ` [PATCH v4 29/32] KVM: SVM: Handle multiple logical targets in AVIC kick fastpath Sean Christopherson
2022-12-08 22:00 ` Maxim Levitsky
2022-10-01 0:59 ` [PATCH v4 30/32] KVM: SVM: Ignore writes to Remote Read Data on AVIC write traps Sean Christopherson
2022-10-01 0:59 ` [PATCH v4 31/32] Revert "KVM: SVM: Do not throw warning when calling avic_vcpu_load on a running vcpu" Sean Christopherson
2022-12-08 22:01 ` Maxim Levitsky
2022-10-01 0:59 ` [PATCH v4 32/32] KVM: x86: Track required APICv inhibits with variable, not callback Sean Christopherson
2022-12-08 22:03 ` Maxim Levitsky
2022-12-27 11:22 ` [PATCH v4 00/32] KVM: x86: AVIC and local APIC fixes+cleanups Paolo Bonzini
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=Y5y7VK9yk5qbfKVN@google.com \
--to=seanjc@google.com \
--cc=alejandro.j.jimenez@oracle.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lirongqing@baidu.com \
--cc=mlevitsk@redhat.com \
--cc=pbonzini@redhat.com \
--cc=suravee.suthikulpanit@amd.com \
/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