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