From nobody Wed May  7 16:29:19 2025
Received: from us-smtp-delivery-124.mimecast.com
 (us-smtp-delivery-124.mimecast.com [170.10.133.124])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id E2ACE221F0D
	for <linux-kernel@vger.kernel.org>; Tue,  1 Apr 2025 16:12:08 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=170.10.133.124
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1743523930; cv=none;
 b=SFj2MdleJKGRvKSSLEWPy3nrQAAf4eU4n0kME4GEE/HXmtFFVUOM9SJiVFTlko3TLV/rE9+gFsM4pygu0NQh6LBA7DiHg2/W4jrcTdmp9qJ1cVi8UZpQCvLQviNFhkc+pwH4JGKu2YXRszaORbhhvdEAF41IuWzx2STQE8y0DCw=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1743523930; c=relaxed/simple;
	bh=u5ldWiz2cXiotD/cOofMPUD+9S2OYpN2imw/B/Aw+M0=;
	h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:
	 MIME-Version;
 b=Hg47+x7Bss1NjhvnhaxR8bF79DC+EbgJThm15fvokJg7APZaavn94tr0B/hgY68LYQC3xmYGmaaJMYNEmH/tvJc7RdYJDVc+QK4cmyWButr108HrAUoHKKUlmu4WwOx1wqOAJ907rHM9YF12EKYeE1ZSPlK2pat8Ol3lk4cWLb8=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dmarc=pass (p=quarantine dis=none) header.from=redhat.com;
 spf=pass smtp.mailfrom=redhat.com;
 dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com
 header.b=YsppG4+P; arc=none smtp.client-ip=170.10.133.124
Authentication-Results: smtp.subspace.kernel.org;
 dmarc=pass (p=quarantine dis=none) header.from=redhat.com
Authentication-Results: smtp.subspace.kernel.org;
 spf=pass smtp.mailfrom=redhat.com
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com
 header.b="YsppG4+P"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;
	s=mimecast20190719; t=1743523927;
	h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
	 to:to:cc:cc:mime-version:mime-version:
	 content-transfer-encoding:content-transfer-encoding:
	 in-reply-to:in-reply-to:references:references;
	bh=Vrf7NR/iVZ/2wCl5JeoFe4lGIXCBAxX7ph94CsZNoVw=;
	b=YsppG4+P/VGc3p3wmw2XXtNkRb36F5fIPM+Tj4WJ0y7/4GK6LoKebDehpSgNkRphVQ2k7o
	0MfcGsTtpVaOl7ubzyMKGcHAJzgoBdQNqY7bD+UHZY5A7Ef4OK8vyQUUN4hAFmCse9H/6W
	0u7umTG/1VgwDclCuT+OSPA/MJYnJug=
Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com
 [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS
 (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id
 us-mta-690-qjKZY9zcPeqhtUsZpNe8VA-1; Tue, 01 Apr 2025 12:12:06 -0400
X-MC-Unique: qjKZY9zcPeqhtUsZpNe8VA-1
X-Mimecast-MFC-AGG-ID: qjKZY9zcPeqhtUsZpNe8VA_1743523925
Received: by mail-wm1-f72.google.com with SMTP id
 5b1f17b1804b1-43e9b0fd00cso13352825e9.0
        for <linux-kernel@vger.kernel.org>;
 Tue, 01 Apr 2025 09:12:06 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20230601; t=1743523925; x=1744128725;
        h=content-transfer-encoding:mime-version:references:in-reply-to
         :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc
         :subject:date:message-id:reply-to;
        bh=Vrf7NR/iVZ/2wCl5JeoFe4lGIXCBAxX7ph94CsZNoVw=;
        b=AHU/24sBIyjaX/op6uwRe8eKRdT2XW4+9of+ed4jUvP9u2s5MLD2dRPtmjycjVtUBw
         KtS62o25IjP6vM9kJoFi/5A+fnVrXq/oShjl6Wm6yM1nyYJPPVtoqvzkLzp+HmqrnraJ
         vk0aPyUI5msyR12MuArV+QwusG/ShCxTLgDXmxu5XD2K6kjRLFHt9nUbyfQf8UztngVt
         HMbbQJVwuS4XQoryA7BKhgWI2ZpZI5zvbSfDv3TT+fhpfjvLklfQcaoA3aWJEsvQxV7d
         n8SxPif+6vq36doATK6NM8b9F5fC4b6In9jdEWHeMsjxRM5nHBpgm1J+xsCIceffnJrt
         XP3w==
X-Gm-Message-State: AOJu0Ywnt5mnvtcft3JR2YrZfDH1nx7qy1QOLSSNQvo1XXqXs+t7A+xU
	V5Un8c4Dk5zQwiq6y9s5q2NWLSpM0+M6tTrfFdsU06AgLKlkvjabmiIhQ2vShnHqeIGWTOwAN3I
	nuzTxCxtf2wM07w9aAzWx9jAztPk0yIKu6knmXKDJ9bkbDE2XEb/EwvyLSh47umanM8EJEeyf6Z
	Vpod+FaXaTDwDhXy3ROqC+4pSWjcvel1KNEo6fWUUi0BKFyw==
X-Gm-Gg: ASbGnct5fOXa8vBOD5Pg063HgwNoISIjdA6c3M7WkVR/uzvCfZMECkLT9NTKVnoIE5p
	/9ptrcl0egH3OvKffodUnqIcGcG5glBA0vYi/oe63M9GS+0kNB0TNsVgVH+5ZhiH0uwJ8x/dDKX
	Fdb2RYjkRmNqvEUxl++uRbULyaF6X5gVF4Z6HhSKIzazl35oU4jJuG14pB/dXX3Dx0WlnuCH5Nj
	iZc3V+paAs+jyiDBCynGtZuc2RLSYRfVXPNhp8aAP70s3A3BDFyrL+vQRRPEeNoOr+C+OFZ3ZBq
	wUM0O1TAdVLIXAeTqV4glQ==
X-Received: by 2002:a7b:c410:0:b0:43d:174:2668 with SMTP id
 5b1f17b1804b1-43eb0432f65mr5326895e9.0.1743523924972;
        Tue, 01 Apr 2025 09:12:04 -0700 (PDT)
X-Google-Smtp-Source: 
 AGHT+IEk/I3vo1cRXa7Mz4utMMm6kLtNUQbKtvEfiervEB5Xb0Kb0XowzumjTcrRZh98kiO/aEFnGA==
X-Received: by 2002:a7b:c410:0:b0:43d:174:2668 with SMTP id
 5b1f17b1804b1-43eb0432f65mr5326525e9.0.1743523924573;
        Tue, 01 Apr 2025 09:12:04 -0700 (PDT)
Received: from [192.168.10.48] ([176.206.111.201])
        by smtp.gmail.com with ESMTPSA id
 5b1f17b1804b1-43d82dede21sm203158185e9.4.2025.04.01.09.12.02
        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
        Tue, 01 Apr 2025 09:12:02 -0700 (PDT)
From: Paolo Bonzini <pbonzini@redhat.com>
To: linux-kernel@vger.kernel.org,
	kvm@vger.kernel.org
Cc: roy.hopkins@suse.com,
	seanjc@google.com,
	thomas.lendacky@amd.com,
	ashish.kalra@amd.com,
	michael.roth@amd.com,
	jroedel@suse.de,
	nsaenz@amazon.com,
	anelkz@amazon.de,
	James.Bottomley@HansenPartnership.com
Subject: [PATCH 20/29] KVM: x86: add planes support for interrupt delivery
Date: Tue,  1 Apr 2025 18:10:57 +0200
Message-ID: <20250401161106.790710-21-pbonzini@redhat.com>
X-Mailer: git-send-email 2.49.0
In-Reply-To: <20250401161106.790710-1-pbonzini@redhat.com>
References: <20250401161106.790710-1-pbonzini@redhat.com>
Precedence: bulk
X-Mailing-List: linux-kernel@vger.kernel.org
List-Id: <linux-kernel.vger.kernel.org>
List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org>
List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

Plumb the destination plane into struct kvm_lapic_irq and propagate it
everywhere.  The in-kernel IOAPIC only targets plane 0.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 arch/x86/include/asm/kvm_host.h |  1 +
 arch/x86/kvm/hyperv.c           |  1 +
 arch/x86/kvm/ioapic.c           |  4 ++--
 arch/x86/kvm/irq_comm.c         | 14 +++++++++++---
 arch/x86/kvm/lapic.c            |  8 ++++----
 arch/x86/kvm/x86.c              |  8 +++++---
 arch/x86/kvm/xen.c              |  1 +
 7 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos=
t.h
index f832352cf4d3..283d8a4b5b14 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -1661,6 +1661,7 @@ struct kvm_lapic_irq {
 	u16 delivery_mode;
 	u16 dest_mode;
 	bool level;
+	u8 plane;
 	u16 trig_mode;
 	u32 shorthand;
 	u32 dest_id;
diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
index a522b467be48..cd1ff31038d2 100644
--- a/arch/x86/kvm/hyperv.c
+++ b/arch/x86/kvm/hyperv.c
@@ -491,6 +491,7 @@ static int synic_set_irq(struct kvm_vcpu_hv_synic *syni=
c, u32 sint)
 	irq.delivery_mode =3D APIC_DM_FIXED;
 	irq.vector =3D vector;
 	irq.level =3D 1;
+	irq.plane =3D vcpu->plane;
=20
 	ret =3D kvm_irq_delivery_to_apic(vcpu->kvm, vcpu->arch.apic, &irq, NULL);
 	trace_kvm_hv_synic_set_irq(vcpu->vcpu_id, sint, irq.vector, ret);
diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c
index 995eb5054360..c538867afceb 100644
--- a/arch/x86/kvm/ioapic.c
+++ b/arch/x86/kvm/ioapic.c
@@ -402,7 +402,7 @@ static void ioapic_write_indirect(struct kvm_ioapic *io=
apic, u32 val)
 				ioapic_service(ioapic, index, false);
 		}
 		if (e->fields.delivery_mode =3D=3D APIC_DM_FIXED) {
-			struct kvm_lapic_irq irq;
+			struct kvm_lapic_irq irq =3D { 0 };
=20
 			irq.vector =3D e->fields.vector;
 			irq.delivery_mode =3D e->fields.delivery_mode << 8;
@@ -442,7 +442,7 @@ static void ioapic_write_indirect(struct kvm_ioapic *io=
apic, u32 val)
 static int ioapic_service(struct kvm_ioapic *ioapic, int irq, bool line_st=
atus)
 {
 	union kvm_ioapic_redirect_entry *entry =3D &ioapic->redirtbl[irq];
-	struct kvm_lapic_irq irqe;
+	struct kvm_lapic_irq irqe =3D { 0 };
 	int ret;
=20
 	if (entry->fields.mask ||
diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c
index 8136695f7b96..94f9db50384e 100644
--- a/arch/x86/kvm/irq_comm.c
+++ b/arch/x86/kvm/irq_comm.c
@@ -48,6 +48,7 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_=
lapic *src,
 		struct kvm_lapic_irq *irq, struct dest_map *dest_map)
 {
 	int r =3D -1;
+	struct kvm_plane *plane =3D kvm->planes[irq->plane];
 	struct kvm_vcpu *vcpu, *lowest =3D NULL;
 	unsigned long i, dest_vcpu_bitmap[BITS_TO_LONGS(KVM_MAX_VCPUS)];
 	unsigned int dest_vcpus =3D 0;
@@ -63,7 +64,7 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_=
lapic *src,
=20
 	memset(dest_vcpu_bitmap, 0, sizeof(dest_vcpu_bitmap));
=20
-	kvm_for_each_vcpu(i, vcpu, kvm) {
+	kvm_for_each_plane_vcpu(i, vcpu, plane) {
 		if (!kvm_apic_present(vcpu))
 			continue;
=20
@@ -92,7 +93,7 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_=
lapic *src,
 		int idx =3D kvm_vector_to_index(irq->vector, dest_vcpus,
 					dest_vcpu_bitmap, KVM_MAX_VCPUS);
=20
-		lowest =3D kvm_get_vcpu(kvm, idx);
+		lowest =3D kvm_get_plane_vcpu(plane, idx);
 	}
=20
 	if (lowest)
@@ -119,13 +120,20 @@ void kvm_set_msi_irq(struct kvm *kvm, struct kvm_kern=
el_irq_routing_entry *e,
 	irq->msi_redir_hint =3D msg.arch_addr_lo.redirect_hint;
 	irq->level =3D 1;
 	irq->shorthand =3D APIC_DEST_NOSHORT;
+	irq->plane =3D e->msi.plane;
 }
 EXPORT_SYMBOL_GPL(kvm_set_msi_irq);
=20
 static inline bool kvm_msi_route_invalid(struct kvm *kvm,
 		struct kvm_kernel_irq_routing_entry *e)
 {
-	return kvm->arch.x2apic_format && (e->msi.address_hi & 0xff);
+	if (kvm->arch.x2apic_format && (e->msi.address_hi & 0xff))
+		return true;
+
+	if (!kvm->planes[e->msi.plane])
+		return true;
+
+	return false;
 }
=20
 int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 6ed5f5b4f878..16a0e2387f2c 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -1223,14 +1223,13 @@ static inline bool kvm_apic_map_get_dest_lapic(stru=
ct kvm_plane *plane,
 	}
=20
 	*bitmap =3D (lowest >=3D 0) ? 1 << lowest : 0;
-
 	return true;
 }
=20
 bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *src,
 		struct kvm_lapic_irq *irq, int *r, struct dest_map *dest_map)
 {
-	struct kvm_plane *plane =3D kvm->planes[0];
+	struct kvm_plane *plane =3D kvm->planes[irq->plane];
 	struct kvm_apic_map *map;
 	unsigned long bitmap;
 	struct kvm_lapic **dst =3D NULL;
@@ -1286,7 +1285,7 @@ bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, s=
truct kvm_lapic *src,
 bool kvm_intr_is_single_vcpu_fast(struct kvm *kvm, struct kvm_lapic_irq *i=
rq,
 			struct kvm_vcpu **dest_vcpu)
 {
-	struct kvm_plane *plane =3D kvm->planes[0];
+	struct kvm_plane *plane =3D kvm->planes[irq->plane];
 	struct kvm_apic_map *map;
 	unsigned long bitmap;
 	struct kvm_lapic **dst =3D NULL;
@@ -1422,7 +1421,7 @@ static int __apic_accept_irq(struct kvm_lapic *apic, =
int delivery_mode,
 void kvm_bitmap_or_dest_vcpus(struct kvm *kvm, struct kvm_lapic_irq *irq,
 			      unsigned long *vcpu_bitmap)
 {
-	struct kvm_plane *plane =3D kvm->planes[0];
+	struct kvm_plane *plane =3D kvm->planes[irq->plane];
 	struct kvm_lapic **dest_vcpu =3D NULL;
 	struct kvm_lapic *src =3D NULL;
 	struct kvm_apic_map *map;
@@ -1544,6 +1543,7 @@ void kvm_apic_send_ipi(struct kvm_lapic *apic, u32 ic=
r_low, u32 icr_high)
 	irq.trig_mode =3D icr_low & APIC_INT_LEVELTRIG;
 	irq.shorthand =3D icr_low & APIC_SHORT_MASK;
 	irq.msi_redir_hint =3D false;
+	irq.plane =3D apic->vcpu->plane;
 	if (apic_x2apic_mode(apic))
 		irq.dest_id =3D icr_high;
 	else
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 19e3bb33bf7d..ce8e623052a7 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -9949,7 +9949,7 @@ static int kvm_pv_clock_pairing(struct kvm_vcpu *vcpu=
, gpa_t paddr,
  *
  * @apicid - apicid of vcpu to be kicked.
  */
-static void kvm_pv_kick_cpu_op(struct kvm *kvm, int apicid)
+static void kvm_pv_kick_cpu_op(struct kvm *kvm, unsigned plane_id, int api=
cid)
 {
 	/*
 	 * All other fields are unused for APIC_DM_REMRD, but may be consumed by
@@ -9960,6 +9960,7 @@ static void kvm_pv_kick_cpu_op(struct kvm *kvm, int a=
picid)
 		.dest_mode =3D APIC_DEST_PHYSICAL,
 		.shorthand =3D APIC_DEST_NOSHORT,
 		.dest_id =3D apicid,
+		.plane =3D plane_id,
 	};
=20
 	kvm_irq_delivery_to_apic(kvm, NULL, &lapic_irq, NULL);
@@ -10092,7 +10093,7 @@ int ____kvm_emulate_hypercall(struct kvm_vcpu *vcpu=
, int cpl,
 		if (!guest_pv_has(vcpu, KVM_FEATURE_PV_UNHALT))
 			break;
=20
-		kvm_pv_kick_cpu_op(vcpu->kvm, a1);
+		kvm_pv_kick_cpu_op(vcpu->kvm, vcpu->plane, a1);
 		kvm_sched_yield(vcpu, a1);
 		ret =3D 0;
 		break;
@@ -13559,7 +13560,8 @@ void kvm_arch_async_page_present(struct kvm_vcpu *v=
cpu,
 {
 	struct kvm_lapic_irq irq =3D {
 		.delivery_mode =3D APIC_DM_FIXED,
-		.vector =3D vcpu->arch.apf.vec
+		.vector =3D vcpu->arch.apf.vec,
+		.plane =3D vcpu->plane,
 	};
=20
 	if (work->wakeup_all)
diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c
index 7449be30d701..ac9c69f2190b 100644
--- a/arch/x86/kvm/xen.c
+++ b/arch/x86/kvm/xen.c
@@ -625,6 +625,7 @@ void kvm_xen_inject_vcpu_vector(struct kvm_vcpu *v)
 	irq.shorthand =3D APIC_DEST_NOSHORT;
 	irq.delivery_mode =3D APIC_DM_FIXED;
 	irq.level =3D 1;
+	irq.plane =3D v->plane;
=20
 	kvm_irq_delivery_to_apic(v->kvm, NULL, &irq, NULL);
 }
--=20
2.49.0