From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 91CD5243968 for ; Wed, 11 Jun 2025 21:36:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677764; cv=none; b=kMoV27ANd/H5hxQAmWoot5dwm4lMsksTXRv2kdjudruwLM93PVHffE2Xp2ZLa1ji6KZRQA83/KB7VzOQoxkUclGvOIObSaxHFIFuwG4hV/VWvaLE552Gflcpp39OFc9/CKkZllon8K2juIgP0/J5EFMZmROy1IdkTI545tPo9eA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677764; c=relaxed/simple; bh=ynqbREqv316s5gsW9OCsqzoURbxrqddvN+Jr9T4Pj0k=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=X11Z2drksNGIL/OS2mTctQMSOB9lbbtBPVOHW/tT4xGKf/dH+X3OgzuVtSBEmpLOXbGP/H/Cfl1reMAYBFbrY4dnheZOHThNtBU8pqf14sMLSA5UC4cp9MOLbImK+H5aig6IjUbJkmYDq7ZBGT7c8A6Yhl1pB2/i9Z++ebZXgzM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=MgB/ELKY; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="MgB/ELKY" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-74620e98ec8so193902b3a.1 for ; Wed, 11 Jun 2025 14:36:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677762; x=1750282562; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=PZG/T2PYXDNJDPQNT3ApJnWxeYPAUPNPO+dWK9gIL4Q=; b=MgB/ELKY0kZw4ahobdyd938Vb98l+PVtX9FcjEQDdKtitabDcQRObLFnjyi0+LlpRl urDwmTWdc35AmxC+SzzzZEafL6YL4PkyOQJikPdhuJKFxWhhn8NiMNVREaVNF9JBRRMc hTR0WsFMPu5xFZMmd3yao4G7bp/5G7LgAhblzkj5I63u0uKQ2GfZhwRHsl+IhUHcBG/v MXbjUpqDWbGeg2rq+Fn72VuG3kpdyR735vw/gak52idr3+Ja44+p1rNo9doAdlIKNRoP hyeQFFm7RmsblpWLrj/tSQU93CPC/DkcOGPOLFCZUs60dK8igWOPuVsmv0K4g0AmFGgk cLbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677762; x=1750282562; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=PZG/T2PYXDNJDPQNT3ApJnWxeYPAUPNPO+dWK9gIL4Q=; b=LRkwKmUaIDdZnA004pRVz6FI4+BnMMujlUNpE7f51FpJHOedqDElmS0p+akelZpviq qlrT06c/EB+R2CPD3lOqdstovh/yOTl05iu3RX4WtSCoE7Qugn7pwYs39hv92jvyClw+ dZjPBPgAP/6owmwGbGD+GqSEyR/E2Y50XwUlUr4WqmUHjeh1KYpbKPcHzc0MzzbniaLh QOwQvik09e7Zb5G0A6R+KpeQWRmtKta0mMHuDrm2yDz5jOSp+mpVyjMPz0MfIU/IjKhM i7LoEGLElMAtg/jRwCgRf/Zp5e3SigNtBNeVBlm6F5ci98p7GvfEw9iaP4xMVFZ5gyzg sWxQ== X-Forwarded-Encrypted: i=1; AJvYcCW/keFeglSkt5UoXAW1mHe1jeGjTad7aZ3Rr+45j0X8Ya+A/DQvD2wunPkBRJ5dSHXE8N+sNGAE0uXOR1A=@vger.kernel.org X-Gm-Message-State: AOJu0YxCKKmm6SQlPDmjao3IuvQgarTLUXqAXscK9YgvTfJGz9PysdZP 7sETtliX0E0KCbHagWMUJRXkCEyqoF6DcOryPmjV/Tt9x7JbcwYy7sWXG6jZGXxJRD6PLypstpK wZYZhzA== X-Google-Smtp-Source: AGHT+IGPKQIpTDjSAFv6mOIjPhaD8mB5M58fuRVAGtuBRqCaVZPcbvGXavVh+jOMgZS7XB5O8QfCC5Vv/cQ= X-Received: from pfbna4.prod.google.com ([2002:a05:6a00:3e04:b0:746:2ae9:24a]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:aa7:83cb:0:b0:742:b9d2:dc8f with SMTP id d2e1a72fcca58-7487cdffc94mr839105b3a.1.1749677761823; Wed, 11 Jun 2025 14:36:01 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:40 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-2-seanjc@google.com> Subject: [PATCH v2 01/18] KVM: x86: Trigger I/O APIC route rescan in kvm_arch_irq_routing_update() From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Trigger the I/O APIC route rescan that's performed for a split IRQ chip after userspace updates IRQ routes in kvm_arch_irq_routing_update(), i.e. before dropping kvm->irq_lock. Calling kvm_make_all_cpus_request() under a mutex is perfectly safe, and the smp_wmb()+smp_mb__after_atomic() pair in __kvm_make_request()+kvm_check_request() ensures the new routing is visible to vCPUs prior to the request being visible to vCPUs. In all likelihood, commit b053b2aef25d ("KVM: x86: Add EOI exit bitmap inference") somewhat arbitrarily made the request outside of irq_lock to avoid holding irq_lock any longer than is strictly necessary. And then commit abdb080f7ac8 ("kvm/irqchip: kvm_arch_irq_routing_update renaming split") took the easy route of adding another arch hook instead of risking a functional change. Note, the call to synchronize_srcu_expedited() does NOT provide ordering guarantees with respect to vCPUs scanning the new routing; as above, the request infrastructure provides the necessary ordering. I.e. there's no need to wait for kvm_scan_ioapic_routes() to complete if it's actively running, because regardless of whether it grabs the old or new table, the vCPU will have another KVM_REQ_SCAN_IOAPIC pending, i.e. will rescan again and see the new mappings. Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- arch/x86/kvm/irq_comm.c | 10 +++------- include/linux/kvm_host.h | 4 ---- virt/kvm/irqchip.c | 2 -- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c index d6d792b5d1bd..e2ae62ff9cc2 100644 --- a/arch/x86/kvm/irq_comm.c +++ b/arch/x86/kvm/irq_comm.c @@ -395,13 +395,6 @@ int kvm_setup_default_irq_routing(struct kvm *kvm) ARRAY_SIZE(default_routing), 0); } =20 -void kvm_arch_post_irq_routing_update(struct kvm *kvm) -{ - if (!irqchip_split(kvm)) - return; - kvm_make_scan_ioapic_request(kvm); -} - void kvm_scan_ioapic_irq(struct kvm_vcpu *vcpu, u32 dest_id, u16 dest_mode, u8 vector, unsigned long *ioapic_handled_vectors) { @@ -466,4 +459,7 @@ void kvm_arch_irq_routing_update(struct kvm *kvm) #ifdef CONFIG_KVM_HYPERV kvm_hv_irq_routing_update(kvm); #endif + + if (irqchip_split(kvm)) + kvm_make_scan_ioapic_request(kvm); } diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 3bde4fb5c6aa..9461517b4e62 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1024,14 +1024,10 @@ void vcpu_put(struct kvm_vcpu *vcpu); =20 #ifdef __KVM_HAVE_IOAPIC void kvm_arch_post_irq_ack_notifier_list_update(struct kvm *kvm); -void kvm_arch_post_irq_routing_update(struct kvm *kvm); #else static inline void kvm_arch_post_irq_ack_notifier_list_update(struct kvm *= kvm) { } -static inline void kvm_arch_post_irq_routing_update(struct kvm *kvm) -{ -} #endif =20 #ifdef CONFIG_HAVE_KVM_IRQCHIP diff --git a/virt/kvm/irqchip.c b/virt/kvm/irqchip.c index 162d8ed889f2..6ccabfd32287 100644 --- a/virt/kvm/irqchip.c +++ b/virt/kvm/irqchip.c @@ -222,8 +222,6 @@ int kvm_set_irq_routing(struct kvm *kvm, kvm_arch_irq_routing_update(kvm); mutex_unlock(&kvm->irq_lock); =20 - kvm_arch_post_irq_routing_update(kvm); - synchronize_srcu_expedited(&kvm->irq_srcu); =20 new =3D old; --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 58C2A246BB3 for ; Wed, 11 Jun 2025 21:36:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677765; cv=none; b=cSWwf+LCzgqsvHkdKbWmjGtM+7P3SwfBoFJeWV8Z2B+x9NJiabTPht+7gkJpmNBXsyHV/xJsK3MkMXi2Sb2gC5ivyxLTsLfmysG2gOxMTR598pIPE3lG8G9Z6RkqgWtVR+ULoXNn7YNkQSjRLqWCSLfL1hq5T6NfnZOFLTHNx+0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677765; c=relaxed/simple; bh=iBgu8VQrFAzBzHjOcFJGyC7B0S/jSUUo1LM+MQoNfPo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=gb1Jd+8at2+EWqkRmmc+fPoTRq5fvtdwET5TaYEfafKAqMCZLzo+a/cUbz8+EAW+chtGPchPO6Ok87mjsJaWd4FHoazf6oDTKFAI4xAzlKyB8lBeS52uJFRnDRd16LUE+jM67rTV2qNvIOiG41Q/zJ8UiGkhE46GvHyoiyZ5yms= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=bozHI0NS; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="bozHI0NS" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b2c37558eccso124451a12.1 for ; Wed, 11 Jun 2025 14:36:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677763; x=1750282563; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=2JaUG+lAMcEA3STa8zY9dDuT6d/UMMtmtelCk9MZjcw=; b=bozHI0NSX7/RSLUMOQA5Oh3vkXtbuJXg9lDsHhbXDG5ZRHB3WRN0oZUt28B8GNg4Ka 0/na232365C8YsgQrRcDfM4BTe+4YXpWQEbYg6Q7ArXhcBZ7Vv9CLgQSVUmdr7GfTr3t f8aaEq4UKV9DSqMaS6ETvrcES1J7rMxSVXGrhO1DljvQp7VjosaQuuSRTQrbi4HIcXOR Jk+T5txYtZ9q5MXlpAhDKRWZfGtQgRboRb9KRqEvR4lmjdvb7TUfwrqmeVXwz9UDYhp8 KWNsQKzNBmmaLGfljNag4amrQumj8wLYdOcjSlxV5v9CDbwoStbIG6yjuz2FraKjoLob 5+HQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677763; x=1750282563; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=2JaUG+lAMcEA3STa8zY9dDuT6d/UMMtmtelCk9MZjcw=; b=qejzSdlkMwkWYA69yW4oMGp66o67Y/YLuCQSgjJc5nrJxxzDmZWYTyHPx0FBIMXx2/ lre+gn3ef8JZCiXYdP9Z7pbaPu3UWsacxf5PWGexwiBYs+p/g/E+s/P512sK4UQ3gh+F WY6xmsvQnOMSST6ZlkmcHfcX3DrydHbDe6lnFtjeHUK1AagfVo1ACXAc6ww8oz+N9rRI dy8yqu9556TM7ZTLlWXic581GIgBD+oaC9Bm/U27NzJKPMXyVafzCXzvN7VCT907H7s2 E9OTFtN+xSRX9utIITuxkLJNZQBKN5Q8l8TF3udDUi+qvFsF+Bv3btmNfGG+MBagpiph 4drw== X-Forwarded-Encrypted: i=1; AJvYcCXcAhBtOg7N2KUgiyxecG3mR7TXTqZeQ3cgvyaWS10zFPJgQ/uiRXbaD4XmsjzkicJrUmvx+eE7I4UsO+U=@vger.kernel.org X-Gm-Message-State: AOJu0Yzqg8gaYETIpC8BT7mCvOHUk3mIQ6rULAqL5ygDerwYpAWunKP7 XBRvGrIwj6tp9hg8ohQ1yBiRAb5yi8fZxb2MB3OVwBEmREWoCukDum2cJ4v5Kt8wKUkb8XqKJId fRUEHeQ== X-Google-Smtp-Source: AGHT+IG6B6kgW6H0pxkQD+dVPNuTQyDl6CJ46+89mkFbuv65EfOtjJWPPwjiEK+h36aAz0qlZaANfNlZVDc= X-Received: from pjbdb8.prod.google.com ([2002:a17:90a:d648:b0:30c:4b1f:78ca]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4a4f:b0:311:f99e:7f4e with SMTP id 98e67ed59e1d1-313af1abc88mr7672525a91.16.1749677763697; Wed, 11 Jun 2025 14:36:03 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:41 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-3-seanjc@google.com> Subject: [PATCH v2 02/18] KVM: x86: Drop superfluous kvm_set_pic_irq() => kvm_pic_set_irq() wrapper From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drop the superfluous and confusing kvm_set_pic_irq() =3D> kvm_pic_set_irq() wrapper, and instead wire up ->set() directly to its final destination. Opportunistically move the declaration kvm_pic_set_irq() to irq.h to start gathering more of the in-kernel APIC/IO-APIC logic in irq.{c,h}. No functional change intended. Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 1 - arch/x86/kvm/i8259.c | 5 ++++- arch/x86/kvm/irq.h | 2 ++ arch/x86/kvm/irq_comm.c | 10 +--------- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index 330cdcbed1a6..f25ec3ec5ce4 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -2208,7 +2208,6 @@ static inline int __kvm_irq_line_state(unsigned long = *irq_state, return !!(*irq_state); } =20 -int kvm_pic_set_irq(struct kvm_pic *pic, int irq, int irq_source_id, int l= evel); void kvm_pic_clear_all(struct kvm_pic *pic, int irq_source_id); =20 void kvm_inject_nmi(struct kvm_vcpu *vcpu); diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index a8fb19940975..0150aec4f523 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c @@ -185,8 +185,11 @@ void kvm_pic_update_irq(struct kvm_pic *s) pic_unlock(s); } =20 -int kvm_pic_set_irq(struct kvm_pic *s, int irq, int irq_source_id, int lev= el) +int kvm_pic_set_irq(struct kvm_kernel_irq_routing_entry *e, struct kvm *kv= m, + int irq_source_id, int level, bool line_status) { + struct kvm_pic *s =3D kvm->arch.vpic; + int irq =3D e->irqchip.pin; int ret, irq_level; =20 BUG_ON(irq < 0 || irq >=3D PIC_NUM_PINS); diff --git a/arch/x86/kvm/irq.h b/arch/x86/kvm/irq.h index 76d46b2f41dd..33dd5666b656 100644 --- a/arch/x86/kvm/irq.h +++ b/arch/x86/kvm/irq.h @@ -63,6 +63,8 @@ int kvm_pic_init(struct kvm *kvm); void kvm_pic_destroy(struct kvm *kvm); int kvm_pic_read_irq(struct kvm *kvm); void kvm_pic_update_irq(struct kvm_pic *s); +int kvm_pic_set_irq(struct kvm_kernel_irq_routing_entry *e, struct kvm *kv= m, + int irq_source_id, int level, bool line_status); =20 static inline int irqchip_split(struct kvm *kvm) { diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c index e2ae62ff9cc2..64f352e7bcb0 100644 --- a/arch/x86/kvm/irq_comm.c +++ b/arch/x86/kvm/irq_comm.c @@ -27,14 +27,6 @@ #include "x86.h" #include "xen.h" =20 -static int kvm_set_pic_irq(struct kvm_kernel_irq_routing_entry *e, - struct kvm *kvm, int irq_source_id, int level, - bool line_status) -{ - struct kvm_pic *pic =3D kvm->arch.vpic; - return kvm_pic_set_irq(pic, e->irqchip.pin, irq_source_id, level); -} - static int kvm_set_ioapic_irq(struct kvm_kernel_irq_routing_entry *e, struct kvm *kvm, int irq_source_id, int level, bool line_status) @@ -296,7 +288,7 @@ int kvm_set_routing_entry(struct kvm *kvm, case KVM_IRQCHIP_PIC_MASTER: if (ue->u.irqchip.pin >=3D PIC_NUM_PINS / 2) return -EINVAL; - e->set =3D kvm_set_pic_irq; + e->set =3D kvm_pic_set_irq; break; case KVM_IRQCHIP_IOAPIC: if (ue->u.irqchip.pin >=3D KVM_IOAPIC_NUM_PINS) --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 161ED23ABB2 for ; Wed, 11 Jun 2025 21:36:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677767; cv=none; b=Jx5pSPx7Neqq6piMCc1rzyhr2ccawqOILfKE3H6COWCveW6LJ9Tin4NnNqGRBRjrUmRcB0uba507EgsRqijyaIygcK6cD9jvVwXlNGem5eNPGE+JZJmTQTPmHosRpNi0h3m0mnl/cStXWKgzqDXFEXCPsehjZ5x+GMcF8bO5ypw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677767; c=relaxed/simple; bh=sQoc0mSFqSf4AmjsbAJoaKmVVcniW3l9UwXr/qlENo8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=D/+8bUqSM6NDbVVyV6dlYYYTCvY+cZeGZXth8DaBRT/DwCaQM1vSMTXfrd0fJ8zyM36Y1jiWMo8G2P0pDqy1c84LPOncd/p772/jcquZKNy6KP1FP51Be82Um3YhoqM4ZBJo2Z3q0QEZ/qqLO4ryE3pmR2QBIOpBAsXeUnuCvds= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=umjqxFj8; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="umjqxFj8" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-311a6b43ed7so270561a91.1 for ; Wed, 11 Jun 2025 14:36:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677765; x=1750282565; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=03EsK0XCZQ7bSC/xx33gLkDKNm/oHdhWEdLJr87/zMc=; b=umjqxFj8xH/5UrRhciOwT3OvmX5mXzyHuDuxd3TODhCkPS/1nZnMje8n7eznVwNea/ 3ZKtQsZPr/Dei7QY2uYn42wqI4pEsXEy2xUT38pL+jwFQwwweu8tffnhvUmRB3w+0kHH okXLoD7tLKio1Jf815r2oOyy0fAAxTzFejmyyddLOYsioCql/UPAxwrNrZuix6yWKZVD 2enH37jToKlTDVGv1WDGYjljX4i8CQWHM/5Szq2zlr0e+GP1fcxjosCH2cWOMKvIfdxw VZ8DLHmbWKvWI0uTXbz2S050zF0l2BB3ETgPcdsY57ZfMTpwqsRNI7GVuAlXV0cr0M/Z Ziew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677765; x=1750282565; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=03EsK0XCZQ7bSC/xx33gLkDKNm/oHdhWEdLJr87/zMc=; b=jvysINlf1kiN7LswOfpgbtHC/24KZ3ILJ2O5oNqQp54WJ99xTpM1aKHAMKdCgspYBm QI7mp2+mxT2U7cStdUs3jQ3eyt/lnYPHvfHsXFSvxtzYBuqH0DZpG3avolR3J4Atecv2 ldmtI10UVJGYJOGcuJXOKorPyU3QEywfxRpydMfM24JW3n1CUyBIp/iz+0GlxDlvqupv w/iuEXBm6Prrv4kmj5IQfkT1VCTxXu8/kq3agaOAZq1ZexiDfCZkQsNqQSLMJJHMNtXj wQKX9TAwMYWiANWeAoDmUZvQRiozoe456qzIl/CJLoB1o4ADfKK+vAS54LBdj+6tYvho MhjQ== X-Forwarded-Encrypted: i=1; AJvYcCUsdoxua5tXZLgUUkTndX6HSHKZxOnfes5EpT9cSSYv78hvEtKgvT60di3w4KIKiczpd/fNQqn3ferN9X4=@vger.kernel.org X-Gm-Message-State: AOJu0YwoZbTKn8PncJe/IrWMNUxTnDfdy77fxDzA/FPPbj0xG5yt6KNu IJe8rIhJdgUvGZyeu8VD+kDC6TLRgjrqvrDS4A5gcB+9DRmdEjpHIdWkej2GshAG0Bz3QMLq4Kg 6l8pe6A== X-Google-Smtp-Source: AGHT+IENVmaNV+oSCi8pwtRJAQTeKuH5EAR+8VPfi82j/imfQfOzPW98WiMDU7ChOjR3QLEwXXUc68+xHjA= X-Received: from pjbqi5.prod.google.com ([2002:a17:90b:2745:b0:30a:31eb:ec8e]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:e70d:b0:311:df4b:4b8a with SMTP id 98e67ed59e1d1-313c068ac96mr830545a91.3.1749677765181; Wed, 11 Jun 2025 14:36:05 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:42 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-4-seanjc@google.com> Subject: [PATCH v2 03/18] KVM: x86: Drop superfluous kvm_set_ioapic_irq() => kvm_ioapic_set_irq() wrapper From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drop the superfluous and confusing kvm_set_ioapic_irq() and instead wire up ->set() directly to its final destination. No functional change intended. Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- arch/x86/kvm/ioapic.c | 6 ++++-- arch/x86/kvm/ioapic.h | 5 +++-- arch/x86/kvm/irq_comm.c | 11 +---------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c index 45dae2d5d2f1..8c8a8062eb19 100644 --- a/arch/x86/kvm/ioapic.c +++ b/arch/x86/kvm/ioapic.c @@ -479,9 +479,11 @@ static int ioapic_service(struct kvm_ioapic *ioapic, i= nt irq, bool line_status) return ret; } =20 -int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_= id, - int level, bool line_status) +int kvm_ioapic_set_irq(struct kvm_kernel_irq_routing_entry *e, struct kvm = *kvm, + int irq_source_id, int level, bool line_status) { + struct kvm_ioapic *ioapic =3D kvm->arch.vioapic; + int irq =3D e->irqchip.pin; int ret, irq_level; =20 BUG_ON(irq < 0 || irq >=3D IOAPIC_NUM_PINS); diff --git a/arch/x86/kvm/ioapic.h b/arch/x86/kvm/ioapic.h index aa8cb4ac0479..a86f59bbea44 100644 --- a/arch/x86/kvm/ioapic.h +++ b/arch/x86/kvm/ioapic.h @@ -111,8 +111,9 @@ void kvm_ioapic_update_eoi(struct kvm_vcpu *vcpu, int v= ector, int trigger_mode); int kvm_ioapic_init(struct kvm *kvm); void kvm_ioapic_destroy(struct kvm *kvm); -int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_= id, - int level, bool line_status); +int kvm_ioapic_set_irq(struct kvm_kernel_irq_routing_entry *e, struct kvm = *kvm, + int irq_source_id, int level, bool line_status); + void kvm_ioapic_clear_all(struct kvm_ioapic *ioapic, int irq_source_id); void kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state); void kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state); diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c index 64f352e7bcb0..8dcb6a555902 100644 --- a/arch/x86/kvm/irq_comm.c +++ b/arch/x86/kvm/irq_comm.c @@ -27,15 +27,6 @@ #include "x86.h" #include "xen.h" =20 -static int kvm_set_ioapic_irq(struct kvm_kernel_irq_routing_entry *e, - struct kvm *kvm, int irq_source_id, int level, - bool line_status) -{ - struct kvm_ioapic *ioapic =3D kvm->arch.vioapic; - return kvm_ioapic_set_irq(ioapic, e->irqchip.pin, irq_source_id, level, - line_status); -} - int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src, struct kvm_lapic_irq *irq, struct dest_map *dest_map) { @@ -293,7 +284,7 @@ int kvm_set_routing_entry(struct kvm *kvm, case KVM_IRQCHIP_IOAPIC: if (ue->u.irqchip.pin >=3D KVM_IOAPIC_NUM_PINS) return -EINVAL; - e->set =3D kvm_set_ioapic_irq; + e->set =3D kvm_ioapic_set_irq; break; default: return -EINVAL; --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4EC1A248F4A for ; Wed, 11 Jun 2025 21:36:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677769; cv=none; b=R8feY3mfSxaYZoeYZIGvd0WmQ7Dg85tNDpgXaS7cW/c5Ai11hYebV86lI+niAOboxT8CdO8dFOzSuxdMSkSo+26aFso10HYF0jkN09ATQn4H1cMmcDOj1ALvNmpWn+icELa9/H5VE0/quqx8CLOdU9mStbMJSNNA8JJfd1YUD+I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677769; c=relaxed/simple; bh=2vrLJKj19OX456GsG99Naj+YqCT8eAfkbz2WrX4rr1w=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=IgQZfB8ucPxL0LV3Gvnu1rZT/u2U++SEnN2I5d/iJ4e7lTPWXP54qJ7oihwRQMxkQPryRNqTyTmVXbSJ7S/RdLpL8bEf7BEPUguxy97XaWyKvyP8ILF8C6wWXLKnuBIytg+XKXDQLXlypUT+p6lRf8nf4/74x1Ngm9G4h7yIIFY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=v5c1bG6x; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="v5c1bG6x" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b2f5a5da5efso58210a12.2 for ; Wed, 11 Jun 2025 14:36:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677766; x=1750282566; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=uHI3xCbsYOP2KWw/2eMjfu9hFT7kUbJEy5buHfIZCTM=; b=v5c1bG6xrpbvnB6xSwz7/gZPOT67S/kThMBrz21kCI/m3N8eZVU9nFlwixhqULe721 4/KscdBGBy+H9087podLKaD7oIIh4qnLOES5Nfnqpmhxy6Mylm0EVdODG9BvMbZc+ewr /QHkyAh8L5qMyU5IMRY3+/wL7KjfXioOuhbqAAzOuQ44l0S7yvFXGjcbNhz0hBKsfZYI QCmVPmGynqR0CvncDynbx9p5cM/hDoNnpnPK8vrQr0dy4hsOqp+gRVtq+99b2GXmbQed lHwBBb4nVkbiqe6J9l7zxxJ/9xd0sMnwbmgIajtLIDjJ2AAwvbhSaX0ioQXcPDKj+Zuc 4MJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677766; x=1750282566; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=uHI3xCbsYOP2KWw/2eMjfu9hFT7kUbJEy5buHfIZCTM=; b=tNaEZ9ni6Wcg6rDjW7a5jWeB4OfmWAqffDip3hbPMRYNIvYsi5dS4BuyQnWmOoRWWB ZxECDuyYsIoYu3QVzHr9OZGiPUKJvcWRcjJHog2MLrp7ANzM+Ip3DwS0kTUgQgNgYwQV nL1RHubMVZZQYXY+Dq2qGdnVPRsaPa75FQRdY/W1gGxYMB3TuHxLuy5kMTCAWNI28jQ4 Rqc4y+pCS4gB7p34x7mJWw/WM6TuHwfVu+N+clvBo+b6QYUMr1c3+1Clcn6pA9OGypj2 n648quVsv86f662oM0fO6Lmca/Rr/E3Nsovz5qdj9fDB2Mpzmhds9Ui5KN8cEVh1PvsR WeXg== X-Forwarded-Encrypted: i=1; AJvYcCXh0CWI6/3QZEb1DOkm4CMu0ZI/C7M3WEYcqAlvyCavFafk8UoVUMQ6M87AEvJb2EF7SgjVF+LxUyVM9Q8=@vger.kernel.org X-Gm-Message-State: AOJu0YyXOB52sQnejB/hqu0ty854v2VLwtBbJ/EkUqapNG4FL9E8nTZu fW+xl647TekpkpQ0Ey27fpla70C/v2dm28BbWvJKnSLluil5YVOsg4a6lqY3cn7rYbRGFN+HgFr vlXQKYA== X-Google-Smtp-Source: AGHT+IGhUDDedez1Ad1IXxuj+ld9CEuEoa6u2kh/UYMFajcgbRUQg7tQQlHdw5YhnDOJpsmI7+uKkGAssNU= X-Received: from pgar4.prod.google.com ([2002:a05:6a02:2e84:b0:b2c:4ef2:ca0e]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:7345:b0:21a:de8e:44b4 with SMTP id adf61e73a8af0-21f9b9f8536mr424572637.16.1749677766665; Wed, 11 Jun 2025 14:36:06 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:43 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-5-seanjc@google.com> Subject: [PATCH v2 04/18] KVM: x86: Drop superfluous kvm_hv_set_sint() => kvm_hv_synic_set_irq() wrapper From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drop the superfluous kvm_hv_set_sint() and instead wire up ->set() directly to its final destination, kvm_hv_synic_set_irq(). Keep hv_synic_set_irq() instead of kvm_hv_set_sint() to provide some amount of consistency in the ->set() helpers, e.g. to match kvm_pic_set_irq() and kvm_ioapic_set_irq(). kvm_set_msi() is arguably the oddball, e.g. kvm_set_msi_irq() should be something like kvm_msi_to_lapic_irq() so that kvm_set_msi() can instead be kvm_set_msi_irq(), but that's a future problem to solve. No functional change intended. Cc: Vitaly Kuznetsov Cc: Kai Huang Signed-off-by: Sean Christopherson Acked-by: Kai Huang Reviewed-by: Vitaly Kuznetsov --- arch/x86/kvm/hyperv.c | 10 +++++++--- arch/x86/kvm/hyperv.h | 3 ++- arch/x86/kvm/irq_comm.c | 18 +++--------------- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c index 24f0318c50d7..f316e11383aa 100644 --- a/arch/x86/kvm/hyperv.c +++ b/arch/x86/kvm/hyperv.c @@ -497,15 +497,19 @@ static int synic_set_irq(struct kvm_vcpu_hv_synic *sy= nic, u32 sint) return ret; } =20 -int kvm_hv_synic_set_irq(struct kvm *kvm, u32 vpidx, u32 sint) +int kvm_hv_synic_set_irq(struct kvm_kernel_irq_routing_entry *e, struct kv= m *kvm, + int irq_source_id, int level, bool line_status) { struct kvm_vcpu_hv_synic *synic; =20 - synic =3D synic_get(kvm, vpidx); + if (!level) + return -1; + + synic =3D synic_get(kvm, e->hv_sint.vcpu); if (!synic) return -EINVAL; =20 - return synic_set_irq(synic, sint); + return synic_set_irq(synic, e->hv_sint.sint); } =20 void kvm_hv_synic_send_eoi(struct kvm_vcpu *vcpu, int vector) diff --git a/arch/x86/kvm/hyperv.h b/arch/x86/kvm/hyperv.h index 913bfc96959c..6ce160ffa678 100644 --- a/arch/x86/kvm/hyperv.h +++ b/arch/x86/kvm/hyperv.h @@ -103,7 +103,8 @@ static inline bool kvm_hv_hypercall_enabled(struct kvm_= vcpu *vcpu) int kvm_hv_hypercall(struct kvm_vcpu *vcpu); =20 void kvm_hv_irq_routing_update(struct kvm *kvm); -int kvm_hv_synic_set_irq(struct kvm *kvm, u32 vcpu_id, u32 sint); +int kvm_hv_synic_set_irq(struct kvm_kernel_irq_routing_entry *e, struct kv= m *kvm, + int irq_source_id, int level, bool line_status); void kvm_hv_synic_send_eoi(struct kvm_vcpu *vcpu, int vector); int kvm_hv_activate_synic(struct kvm_vcpu *vcpu, bool dont_zero_synic_page= s); =20 diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c index 8dcb6a555902..28a8555ab58b 100644 --- a/arch/x86/kvm/irq_comm.c +++ b/arch/x86/kvm/irq_comm.c @@ -127,18 +127,6 @@ int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, return kvm_irq_delivery_to_apic(kvm, NULL, &irq, NULL); } =20 -#ifdef CONFIG_KVM_HYPERV -static int kvm_hv_set_sint(struct kvm_kernel_irq_routing_entry *e, - struct kvm *kvm, int irq_source_id, int level, - bool line_status) -{ - if (!level) - return -1; - - return kvm_hv_synic_set_irq(kvm, e->hv_sint.vcpu, e->hv_sint.sint); -} -#endif - int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e, struct kvm *kvm, int irq_source_id, int level, bool line_status) @@ -149,8 +137,8 @@ int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_rou= ting_entry *e, switch (e->type) { #ifdef CONFIG_KVM_HYPERV case KVM_IRQ_ROUTING_HV_SINT: - return kvm_hv_set_sint(e, kvm, irq_source_id, level, - line_status); + return kvm_hv_synic_set_irq(e, kvm, irq_source_id, level, + line_status); #endif =20 case KVM_IRQ_ROUTING_MSI: @@ -302,7 +290,7 @@ int kvm_set_routing_entry(struct kvm *kvm, break; #ifdef CONFIG_KVM_HYPERV case KVM_IRQ_ROUTING_HV_SINT: - e->set =3D kvm_hv_set_sint; + e->set =3D kvm_hv_synic_set_irq; e->hv_sint.vcpu =3D ue->u.hv_sint.vcpu; e->hv_sint.sint =3D ue->u.hv_sint.sint; break; --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7672124DCE0 for ; Wed, 11 Jun 2025 21:36:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677773; cv=none; b=KZyq4p9OoEAAnHit0TI5+9y8DHTu4nj5sX4F1mTGcL2hPwNvHGMB/6SgIJrEAcnKG1HD8vvRdRxVbWGt5sjsOlrSThOyKF9oyx+yevRcr25HsTwmSVBPdL61WyOcON9YhBwLaSaFPe0pmqsk5k5c69cdTjoPMHm/UwkiPpm1v7A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677773; c=relaxed/simple; bh=b9tasPSO07AOfOTR3Fz0dQ6fZs1kO7tnUY1HpReNO4A=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=uz9wxF9S+aQNb5kbCCX9HymUiihdgY9zIGRXjMOFra/kBJa3wRNyEPIC8VXHS7ugXutIv98ybp1l+hZpSnsN22dB7IiQBoD8YIBSvJsveCnh7DQ4dwAHJTQRjUlMJ5TvHL6aEpK79T/YOzvSizutm8PqjC/Y3mfghWResdkNv2U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Zci8sA4z; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Zci8sA4z" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-311b6d25278so304349a91.3 for ; Wed, 11 Jun 2025 14:36:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677770; x=1750282570; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=OmXAtx1XbZt4wvNgQpXVRz2kSw/WhSsQf9sWXKV5YV8=; b=Zci8sA4zhpuPvOueczyPNu/9Ck1dKUAJiUrvJoiFLPGF/KalWRwhyIjomcE96Y2LcO 40qyt4a0Q8scjBa6vyS1JeT0wZdYU2QuvSgjjbOxWXd0i2WJUlYLEUsAP2Tmaf7a1qL9 t/5zp+3oMz2siwhioCY0HKzXVimJGPZqZAtORKCXLK2It3jLATCO79arBU4f9KGW/g2v acw6xRbCmr7rj4Oa3n+d2+B0n7qqsTRGTG639Hzi/LCP1rymv1aPC3kktryqsZwHGQup 7eZeVLUE7gOlByW3kHICsEAlchqMM5pMYdS6rp2eizfpEkiFw5DbYgzRNPjaRqiNQlJO T7pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677770; x=1750282570; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=OmXAtx1XbZt4wvNgQpXVRz2kSw/WhSsQf9sWXKV5YV8=; b=aKftXhqQ20+ZxSs7KKNqZUQM3wcSxEiR6T4B1sbIaZN8Tz3z46SsL71yWlVTLcdJTV TY4PA/JR8FNBoMA6huZ/rxomHHDKcjgMrWBj75MFBwCxsts5OnLZSwMVCD5Kzbfro5Rv 4XRrAKpuFbLbEGnAZxWJDPx2KT9Dx+e4iMQY8rUgulfEOfJd4IhTT3s8BnJkg/2MfZ9o O/ETfHyjp5q3GXAgfZqyk9y1mmBd+3xJXGHk6oHhz3tnv77m2+sdbAL4r1zngS3dWVfP W0lInLxejiqOVXSnTvLbMCR1dEjlwipujcDDdhcQfoAhW76Xu7nubDln7pZ6qddgZCQE 2ikw== X-Forwarded-Encrypted: i=1; AJvYcCWvhg03RL9NKV/wvlo22Kg++2cDauawe9XbvhSaWq4syaA7rSwoHWjzhJ5+2d+bgwNoqudxiGqp+cncQ5E=@vger.kernel.org X-Gm-Message-State: AOJu0Yzs0PE/RB8dMj0XYzLcWlMS8G3DUKaxjpHea/H8f//sSkE4p6tt y003PJuMX5/gMWG3CyGZ81dPNsb5IGkqyRUK8ZWb0ai967I1rTVO923zg0amkqH3EMOBX35vmC7 skM11qA== X-Google-Smtp-Source: AGHT+IF1hE8qnlCTO3hu1EUZiYrbu1PsQiwZ9i46mOO0rnft1x25MlCUDTADVG/YhODZnvKIaoQLJhru1NE= X-Received: from pjbsc6.prod.google.com ([2002:a17:90b:5106:b0:311:f699:df0a]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:55c6:b0:312:f650:c795 with SMTP id 98e67ed59e1d1-313c08b05afmr823856a91.21.1749677769809; Wed, 11 Jun 2025 14:36:09 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:44 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-6-seanjc@google.com> Subject: [PATCH v2 05/18] KVM: x86: Move PIT ioctl helpers to i8254.c From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the PIT ioctl helpers to i8254.c, i.e. to the file that implements PIT emulation. Eliminating PIT code in x86.c will allow adding a Kconfig to control support for in-kernel I/O APIC, PIC, and PIT emulation with minimal #ifdefs. Opportunistically make kvm_pit_set_reinject() and kvm_pit_load_count() local to i8254.c as they were only publicly visible to make them available to the ioctl helpers. No functional change intended. Signed-off-by: Sean Christopherson Acked-by: Kai Huang --- arch/x86/kvm/i8254.c | 79 ++++++++++++++++++++++++++++++++++++++++++-- arch/x86/kvm/i8254.h | 12 ++++--- arch/x86/kvm/x86.c | 74 ----------------------------------------- 3 files changed, 84 insertions(+), 81 deletions(-) diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index 739aa6c0d0c3..59f956f35f4c 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c @@ -288,7 +288,7 @@ static inline void kvm_pit_reset_reinject(struct kvm_pi= t *pit) atomic_set(&pit->pit_state.irq_ack, 1); } =20 -void kvm_pit_set_reinject(struct kvm_pit *pit, bool reinject) +static void kvm_pit_set_reinject(struct kvm_pit *pit, bool reinject) { struct kvm_kpit_state *ps =3D &pit->pit_state; struct kvm *kvm =3D pit->kvm; @@ -400,8 +400,8 @@ static void pit_load_count(struct kvm_pit *pit, int cha= nnel, u32 val) } } =20 -void kvm_pit_load_count(struct kvm_pit *pit, int channel, u32 val, - int hpet_legacy_start) +static void kvm_pit_load_count(struct kvm_pit *pit, int channel, u32 val, + int hpet_legacy_start) { u8 saved_mode; =20 @@ -649,6 +649,79 @@ static void pit_mask_notifer(struct kvm_irq_mask_notif= ier *kimn, bool mask) kvm_pit_reset_reinject(pit); } =20 +int kvm_vm_ioctl_get_pit(struct kvm *kvm, struct kvm_pit_state *ps) +{ + struct kvm_kpit_state *kps =3D &kvm->arch.vpit->pit_state; + + BUILD_BUG_ON(sizeof(*ps) !=3D sizeof(kps->channels)); + + mutex_lock(&kps->lock); + memcpy(ps, &kps->channels, sizeof(*ps)); + mutex_unlock(&kps->lock); + return 0; +} + +int kvm_vm_ioctl_set_pit(struct kvm *kvm, struct kvm_pit_state *ps) +{ + int i; + struct kvm_pit *pit =3D kvm->arch.vpit; + + mutex_lock(&pit->pit_state.lock); + memcpy(&pit->pit_state.channels, ps, sizeof(*ps)); + for (i =3D 0; i < 3; i++) + kvm_pit_load_count(pit, i, ps->channels[i].count, 0); + mutex_unlock(&pit->pit_state.lock); + return 0; +} + +int kvm_vm_ioctl_get_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps) +{ + mutex_lock(&kvm->arch.vpit->pit_state.lock); + memcpy(ps->channels, &kvm->arch.vpit->pit_state.channels, + sizeof(ps->channels)); + ps->flags =3D kvm->arch.vpit->pit_state.flags; + mutex_unlock(&kvm->arch.vpit->pit_state.lock); + memset(&ps->reserved, 0, sizeof(ps->reserved)); + return 0; +} + +int kvm_vm_ioctl_set_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps) +{ + int start =3D 0; + int i; + u32 prev_legacy, cur_legacy; + struct kvm_pit *pit =3D kvm->arch.vpit; + + mutex_lock(&pit->pit_state.lock); + prev_legacy =3D pit->pit_state.flags & KVM_PIT_FLAGS_HPET_LEGACY; + cur_legacy =3D ps->flags & KVM_PIT_FLAGS_HPET_LEGACY; + if (!prev_legacy && cur_legacy) + start =3D 1; + memcpy(&pit->pit_state.channels, &ps->channels, + sizeof(pit->pit_state.channels)); + pit->pit_state.flags =3D ps->flags; + for (i =3D 0; i < 3; i++) + kvm_pit_load_count(pit, i, pit->pit_state.channels[i].count, + start && i =3D=3D 0); + mutex_unlock(&pit->pit_state.lock); + return 0; +} + +int kvm_vm_ioctl_reinject(struct kvm *kvm, struct kvm_reinject_control *co= ntrol) +{ + struct kvm_pit *pit =3D kvm->arch.vpit; + + /* pit->pit_state.lock was overloaded to prevent userspace from getting + * an inconsistent state after running multiple KVM_REINJECT_CONTROL + * ioctls in parallel. Use a separate lock if that ioctl isn't rare. + */ + mutex_lock(&pit->pit_state.lock); + kvm_pit_set_reinject(pit, control->pit_reinject); + mutex_unlock(&pit->pit_state.lock); + + return 0; +} + static const struct kvm_io_device_ops pit_dev_ops =3D { .read =3D pit_ioport_read, .write =3D pit_ioport_write, diff --git a/arch/x86/kvm/i8254.h b/arch/x86/kvm/i8254.h index a768212ba821..338095829ec8 100644 --- a/arch/x86/kvm/i8254.h +++ b/arch/x86/kvm/i8254.h @@ -6,6 +6,8 @@ =20 #include =20 +#include + struct kvm_kpit_channel_state { u32 count; /* can be 65536 */ u16 latched_count; @@ -55,11 +57,13 @@ struct kvm_pit { #define KVM_MAX_PIT_INTR_INTERVAL HZ / 100 #define KVM_PIT_CHANNEL_MASK 0x3 =20 +int kvm_vm_ioctl_get_pit(struct kvm *kvm, struct kvm_pit_state *ps); +int kvm_vm_ioctl_set_pit(struct kvm *kvm, struct kvm_pit_state *ps); +int kvm_vm_ioctl_get_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps); +int kvm_vm_ioctl_set_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps); +int kvm_vm_ioctl_reinject(struct kvm *kvm, struct kvm_reinject_control *co= ntrol); + struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags); void kvm_free_pit(struct kvm *kvm); =20 -void kvm_pit_load_count(struct kvm_pit *pit, int channel, u32 val, - int hpet_legacy_start); -void kvm_pit_set_reinject(struct kvm_pit *pit, bool reinject); - #endif diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index dd34a2ec854c..50e9fa57b859 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -6450,80 +6450,6 @@ static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm,= struct kvm_irqchip *chip) return r; } =20 -static int kvm_vm_ioctl_get_pit(struct kvm *kvm, struct kvm_pit_state *ps) -{ - struct kvm_kpit_state *kps =3D &kvm->arch.vpit->pit_state; - - BUILD_BUG_ON(sizeof(*ps) !=3D sizeof(kps->channels)); - - mutex_lock(&kps->lock); - memcpy(ps, &kps->channels, sizeof(*ps)); - mutex_unlock(&kps->lock); - return 0; -} - -static int kvm_vm_ioctl_set_pit(struct kvm *kvm, struct kvm_pit_state *ps) -{ - int i; - struct kvm_pit *pit =3D kvm->arch.vpit; - - mutex_lock(&pit->pit_state.lock); - memcpy(&pit->pit_state.channels, ps, sizeof(*ps)); - for (i =3D 0; i < 3; i++) - kvm_pit_load_count(pit, i, ps->channels[i].count, 0); - mutex_unlock(&pit->pit_state.lock); - return 0; -} - -static int kvm_vm_ioctl_get_pit2(struct kvm *kvm, struct kvm_pit_state2 *p= s) -{ - mutex_lock(&kvm->arch.vpit->pit_state.lock); - memcpy(ps->channels, &kvm->arch.vpit->pit_state.channels, - sizeof(ps->channels)); - ps->flags =3D kvm->arch.vpit->pit_state.flags; - mutex_unlock(&kvm->arch.vpit->pit_state.lock); - memset(&ps->reserved, 0, sizeof(ps->reserved)); - return 0; -} - -static int kvm_vm_ioctl_set_pit2(struct kvm *kvm, struct kvm_pit_state2 *p= s) -{ - int start =3D 0; - int i; - u32 prev_legacy, cur_legacy; - struct kvm_pit *pit =3D kvm->arch.vpit; - - mutex_lock(&pit->pit_state.lock); - prev_legacy =3D pit->pit_state.flags & KVM_PIT_FLAGS_HPET_LEGACY; - cur_legacy =3D ps->flags & KVM_PIT_FLAGS_HPET_LEGACY; - if (!prev_legacy && cur_legacy) - start =3D 1; - memcpy(&pit->pit_state.channels, &ps->channels, - sizeof(pit->pit_state.channels)); - pit->pit_state.flags =3D ps->flags; - for (i =3D 0; i < 3; i++) - kvm_pit_load_count(pit, i, pit->pit_state.channels[i].count, - start && i =3D=3D 0); - mutex_unlock(&pit->pit_state.lock); - return 0; -} - -static int kvm_vm_ioctl_reinject(struct kvm *kvm, - struct kvm_reinject_control *control) -{ - struct kvm_pit *pit =3D kvm->arch.vpit; - - /* pit->pit_state.lock was overloaded to prevent userspace from getting - * an inconsistent state after running multiple KVM_REINJECT_CONTROL - * ioctls in parallel. Use a separate lock if that ioctl isn't rare. - */ - mutex_lock(&pit->pit_state.lock); - kvm_pit_set_reinject(pit, control->pit_reinject); - mutex_unlock(&pit->pit_state.lock); - - return 0; -} - void kvm_arch_sync_dirty_log(struct kvm *kvm, struct kvm_memory_slot *mems= lot) { =20 --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2676824DCE4 for ; Wed, 11 Jun 2025 21:36:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677773; cv=none; b=tk25PwrqsGKLEq/3vWN6D+r4sRf8bUTUdf/xUCbPyJeNgaxRJ94d2vepw0kq4XEULMppu3c4oPgtxdCT5xohQId1Fpd/1JMUGIIOY9H6PPDZSm3wQfjl4jlIe2Za4hL9G4/bXCKNhwUXb+rTEai/M+hWp2GFFl0794oD7P3IdFQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677773; c=relaxed/simple; bh=rgEWFRNx9AOzae/hY5m5+rHU8BL+ZKgpKWt+nqQu+9M=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=lCkhd+tCVoIjpXWhsvvEtF9hZCsEievu4RnGfOvst/5mewBJUS5MZMSE9gcLqX+fetX8YtO9MyEt0uLYiv/frZzfWYDgVpVagPe9C/sz0qWC4eEEBNaAe9ZLJZX2Ogg5Evb/QnUwAbdbw4MbXMvDhAPbk3v9b011aqYBC5afsx8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=vOaZWIud; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="vOaZWIud" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-747d143117eso224855b3a.3 for ; Wed, 11 Jun 2025 14:36:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677771; x=1750282571; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=btr0cphDsMq+/yUhHVR8RE1UTj6gq99THk7CUF4LA9c=; b=vOaZWIudYIMGyMoh3vqNil8JDEeQfOG28mWLwxRjo/c+Z3TqMRJM91P5lCw3/6PdXK C7sRbvJJk99OqnDGVo3NmNKns9q29uDhJ7RP5j7wLc7MVrEGfuNyJYUG1Ci0yy3tkElD gXfPhXD6sS/uXjbdWTg6Zx7j9jJUA3hhasEpg7gUWMO2bEZhxxEJdxbi/K7wGA21rudx 8utetzuoze8s9TCikfc80vQO2QkUXX9MBxuLY3QXn1IHT5OLMtRA0e/ev+86QYKeQYCV +WkG6PMF3OMMMYEfDuDCoR3vuwiIlXsMPO1tuOkxtJ7XNBWS8vEa4BbHtLgQYe6DwRZK 9DAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677771; x=1750282571; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=btr0cphDsMq+/yUhHVR8RE1UTj6gq99THk7CUF4LA9c=; b=CxXAHk/qhfnhcwWn/0ciTMniLLav+xJuc+RJ9JhZpU6PXzmzk4pv7CvLQ2NKBtEIda AXm3kfHqgsHzL8Dt5WCYOpxWkR2AeWqmhHXNknF5L5lS7roVO2DEgRM6DUDEeWBrB6wF P6vaGEVLhGe/47QhVZCVFVZgaahuZEjCLtUWA7E0y7MAwC1fV7emS4g9f/XIWzLUUCF2 TjwCNGrUyNqmGaoln6JNQXtpPbkrxInLicBrl06Vsw/7vIuesDasm6YI2r3uXDb1jKwc Ru+rLoqb981gPLufjoF6pkBHZ6kUNk8Ij922Qq67ux+DXtGmT/cv/X2U4pVoItYCrv0D XdXQ== X-Forwarded-Encrypted: i=1; AJvYcCUp5mBi5xMU+iq6klk7ZTMTJYBuYcm1vGR00XH5Kc5WmlcrB+qXkKcWa51kI22S/rFt6q7mrzdrqQ75cxU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9ANoMvqu/K6QSLs9ePO1t/fE4joHBnAmi1nv3VgNBFiqJNrkI EhqgSiaBG7VdyzAcKEZCoGwh1OE3Vqp4n2jLG11JGFtlmIsL62Gc7XZQvWL5EiNB8jKRKLim9N+ 3rw+cnA== X-Google-Smtp-Source: AGHT+IFsPfyLnlFkwEO+3G76q5pk5GAKqTVHEuqReQsV0DBZ81IuIEqthkXBqU0MXTWDMH0fmDduzmsim6M= X-Received: from pfwp55.prod.google.com ([2002:a05:6a00:26f7:b0:746:2a27:3025]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:ad2:b0:742:a5f2:9c51 with SMTP id d2e1a72fcca58-7487e288d11mr630129b3a.16.1749677771627; Wed, 11 Jun 2025 14:36:11 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:45 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-7-seanjc@google.com> Subject: [PATCH v2 06/18] KVM: x86: Move KVM_{GET,SET}_IRQCHIP ioctl helpers to irq.c From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the ioctl helpers for getting/setting fully in-kernel IRQ chip state to irq.c, partly to trim down x86.c, but mostly in preparation for adding a Kconfig to control support for in-kernel I/O APIC, PIC, and PIT emulation. No functional change intended. Signed-off-by: Sean Christopherson Acked-by: Kai Huang --- arch/x86/kvm/irq.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++ arch/x86/kvm/irq.h | 3 +++ arch/x86/kvm/x86.c | 55 --------------------------------------------- 3 files changed, 59 insertions(+), 55 deletions(-) diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c index 97d68d837929..da47e2165389 100644 --- a/arch/x86/kvm/irq.c +++ b/arch/x86/kvm/irq.c @@ -12,6 +12,7 @@ #include #include =20 +#include "ioapic.h" #include "irq.h" #include "i8254.h" #include "x86.h" @@ -178,3 +179,58 @@ bool kvm_arch_irqchip_in_kernel(struct kvm *kvm) { return irqchip_in_kernel(kvm); } + +int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip) +{ + struct kvm_pic *pic =3D kvm->arch.vpic; + int r; + + r =3D 0; + switch (chip->chip_id) { + case KVM_IRQCHIP_PIC_MASTER: + memcpy(&chip->chip.pic, &pic->pics[0], + sizeof(struct kvm_pic_state)); + break; + case KVM_IRQCHIP_PIC_SLAVE: + memcpy(&chip->chip.pic, &pic->pics[1], + sizeof(struct kvm_pic_state)); + break; + case KVM_IRQCHIP_IOAPIC: + kvm_get_ioapic(kvm, &chip->chip.ioapic); + break; + default: + r =3D -EINVAL; + break; + } + return r; +} + +int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip) +{ + struct kvm_pic *pic =3D kvm->arch.vpic; + int r; + + r =3D 0; + switch (chip->chip_id) { + case KVM_IRQCHIP_PIC_MASTER: + spin_lock(&pic->lock); + memcpy(&pic->pics[0], &chip->chip.pic, + sizeof(struct kvm_pic_state)); + spin_unlock(&pic->lock); + break; + case KVM_IRQCHIP_PIC_SLAVE: + spin_lock(&pic->lock); + memcpy(&pic->pics[1], &chip->chip.pic, + sizeof(struct kvm_pic_state)); + spin_unlock(&pic->lock); + break; + case KVM_IRQCHIP_IOAPIC: + kvm_set_ioapic(kvm, &chip->chip.ioapic); + break; + default: + r =3D -EINVAL; + break; + } + kvm_pic_update_irq(pic); + return r; +} diff --git a/arch/x86/kvm/irq.h b/arch/x86/kvm/irq.h index 33dd5666b656..aa77a6b2828c 100644 --- a/arch/x86/kvm/irq.h +++ b/arch/x86/kvm/irq.h @@ -66,6 +66,9 @@ void kvm_pic_update_irq(struct kvm_pic *s); int kvm_pic_set_irq(struct kvm_kernel_irq_routing_entry *e, struct kvm *kv= m, int irq_source_id, int level, bool line_status); =20 +int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip); +int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip); + static inline int irqchip_split(struct kvm *kvm) { int mode =3D kvm->arch.irqchip_mode; diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 50e9fa57b859..311a670b6652 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -6395,61 +6395,6 @@ static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm = *kvm, return 0; } =20 -static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *c= hip) -{ - struct kvm_pic *pic =3D kvm->arch.vpic; - int r; - - r =3D 0; - switch (chip->chip_id) { - case KVM_IRQCHIP_PIC_MASTER: - memcpy(&chip->chip.pic, &pic->pics[0], - sizeof(struct kvm_pic_state)); - break; - case KVM_IRQCHIP_PIC_SLAVE: - memcpy(&chip->chip.pic, &pic->pics[1], - sizeof(struct kvm_pic_state)); - break; - case KVM_IRQCHIP_IOAPIC: - kvm_get_ioapic(kvm, &chip->chip.ioapic); - break; - default: - r =3D -EINVAL; - break; - } - return r; -} - -static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *c= hip) -{ - struct kvm_pic *pic =3D kvm->arch.vpic; - int r; - - r =3D 0; - switch (chip->chip_id) { - case KVM_IRQCHIP_PIC_MASTER: - spin_lock(&pic->lock); - memcpy(&pic->pics[0], &chip->chip.pic, - sizeof(struct kvm_pic_state)); - spin_unlock(&pic->lock); - break; - case KVM_IRQCHIP_PIC_SLAVE: - spin_lock(&pic->lock); - memcpy(&pic->pics[1], &chip->chip.pic, - sizeof(struct kvm_pic_state)); - spin_unlock(&pic->lock); - break; - case KVM_IRQCHIP_IOAPIC: - kvm_set_ioapic(kvm, &chip->chip.ioapic); - break; - default: - r =3D -EINVAL; - break; - } - kvm_pic_update_irq(pic); - return r; -} - void kvm_arch_sync_dirty_log(struct kvm *kvm, struct kvm_memory_slot *mems= lot) { =20 --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1272D250BEC for ; Wed, 11 Jun 2025 21:36:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677776; cv=none; b=riGsf5G2nVKg2ju4QZzeUkuxSgtxGSWZe6K6ve0e9J9oMFlXDJHLefutjAt/YQ3JrTQfP2smVrEsWqibMYsZwXZxOHn14nXS7v4nu52pdb/4BisgZCgyERJg9nUGKD1ZUigdUJTOy/p1BzQoFGb+jHELgDgteQR5b/dQOq6lmNU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677776; c=relaxed/simple; bh=XorePl0mxfOcrJfGTzaPFq1U7BBsUL2+aNak2wohPm4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=kofHUeTyDTpJgZ4pjIEEtWbnHc7OzPwJpc1chXJflsfX6u1SFRHDPp4xHGrOaE/jnS3epzDyHK4e9p3sKcJf4yjjuVol3JWVxd+KMS5XvPkF6YWZ2md92ZFzwoQGwWjRuPLzlmz1mEnOha1XIKWSjuTaTsqKNhf2WdsFwFOmPJY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=xrjHjBhB; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="xrjHjBhB" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-3122368d82bso446580a91.0 for ; Wed, 11 Jun 2025 14:36:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677773; x=1750282573; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=4gDUIVx78BpW8niDMorhxWJJwZ8FKj7ZSpFaK3gGW20=; b=xrjHjBhB9OuZWoH14W4L+aQYZz4vNCO3yBjwtw1zxDRzptLbLUGBxUwLkm9R4Z5MhW stEUONlsVskkmJGWI+3Osdby+gcUVpx+bf1InMd1MVdYCbSLhnUmcfLuu3OCNR3KyaTD Rc+d07PszsQU++hgLwS4MQ1EjLVVFnpmkmxp4RSv//cyaMJxCNNWe0Rz8cBr6eYrgYl+ +Yy+VajFlfz4dL8o+0+3W41ccuPVo2QcaoxNJGJWcnf4h5OyomgnWOCRMIRo3ajUE9lU cf94C2Kne9p9RypVAZqDUVLzIzKcnx1pqEbPZy8begexOfXOayzVJ82M/OXJ9fMbaIHp arRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677773; x=1750282573; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=4gDUIVx78BpW8niDMorhxWJJwZ8FKj7ZSpFaK3gGW20=; b=USQgveNfxIzpWnowbDPp0GnK5MAJgVrsojm5Rv2MFe4a94i1eCcbTBqt14b1nl1oXw DYJTb2+X42OYEKBibaBUjwd4CbNFUR3+bO2n6b8axhmdVaAH1inmA5rZwzIHFWTVYj9I r0/hUPS1hU5+nYoDyZL75ZdHtvJ/NQj/P77WWtWOrE67Li9e8jk0MeOCndUzwO0QudEr 8Gc4ni0pQJ3AbSbi2UseYKSAK4vCAtY+CCORYCu7dMb1i5IAHTDqbwArG6C3mco8LHHc bYama5zz9MNHbAcPNyJqBO4lHPUo5Cmx624yhfIW47xYJ01BtcUBtdG/VyIooLIEm3to 9aBA== X-Forwarded-Encrypted: i=1; AJvYcCUnAubhISbT9s5gvuXCKiP33dk5zFdYyTs+uSHluIAg+/yr1XB0jz7J7LAHr1ZBuCx3DKSsL4e8XnLzjI0=@vger.kernel.org X-Gm-Message-State: AOJu0Yy3zhZQnyMW/4C7pQil843Gbb2T3un/NEXDtZtNr3KJAVoVF7te I52LBrrk3bm02Xv2HE+UZ1FmZrMgsGhmAo6R1yT+rb6R3uMB09P1JnLQ58QDd3/Z/YZAU5IYnCP /9+3c0Q== X-Google-Smtp-Source: AGHT+IFxUADQqWbYA8KE1mFSsyzUwkZdB7xqcgPI+4qVwr0jLE4fnzqBJqKweobTOL2ru25CHC0FfYWl+BI= X-Received: from pjl7.prod.google.com ([2002:a17:90b:2f87:b0:312:1dae:6bf0]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:520a:b0:312:1d2d:18e2 with SMTP id 98e67ed59e1d1-313bfbf4236mr1385761a91.20.1749677773499; Wed, 11 Jun 2025 14:36:13 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:46 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-8-seanjc@google.com> Subject: [PATCH v2 07/18] KVM: x86: Rename irqchip_kernel() to irqchip_full() From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename irqchip_kernel() to irqchip_full(), as "kernel" is very ambiguous due to the existence of split IRQ chip support, where only some of the "irqchip" is in emulated by the kernel/KVM. E.g. irqchip_kernel() often gets confused with irqchip_in_kernel(). Opportunistically hoist the definition up in irq.h so that it's co-located with other "full" irqchip code in anticipation of wrapping it all with a Kconfig/#ifdef. No functional change intended. Suggested-by: Paolo Bonzini Signed-off-by: Sean Christopherson Acked-by: Kai Huang --- arch/x86/kvm/ioapic.h | 2 +- arch/x86/kvm/irq.c | 2 +- arch/x86/kvm/irq.h | 22 +++++++++++----------- arch/x86/kvm/irq_comm.c | 2 +- arch/x86/kvm/x86.c | 4 ++-- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/arch/x86/kvm/ioapic.h b/arch/x86/kvm/ioapic.h index a86f59bbea44..289cca3aec69 100644 --- a/arch/x86/kvm/ioapic.h +++ b/arch/x86/kvm/ioapic.h @@ -103,7 +103,7 @@ do { \ =20 static inline int ioapic_in_kernel(struct kvm *kvm) { - return irqchip_kernel(kvm); + return irqchip_full(kvm); } =20 void kvm_rtc_eoi_tracking_restore_one(struct kvm_vcpu *vcpu); diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c index da47e2165389..97e1617ce24d 100644 --- a/arch/x86/kvm/irq.c +++ b/arch/x86/kvm/irq.c @@ -172,7 +172,7 @@ bool kvm_arch_irqfd_allowed(struct kvm *kvm, struct kvm= _irqfd *args) { bool resample =3D args->flags & KVM_IRQFD_FLAG_RESAMPLE; =20 - return resample ? irqchip_kernel(kvm) : irqchip_in_kernel(kvm); + return resample ? irqchip_full(kvm) : irqchip_in_kernel(kvm); } =20 bool kvm_arch_irqchip_in_kernel(struct kvm *kvm) diff --git a/arch/x86/kvm/irq.h b/arch/x86/kvm/irq.h index aa77a6b2828c..4ac346102350 100644 --- a/arch/x86/kvm/irq.h +++ b/arch/x86/kvm/irq.h @@ -69,16 +69,7 @@ int kvm_pic_set_irq(struct kvm_kernel_irq_routing_entry = *e, struct kvm *kvm, int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip); int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip); =20 -static inline int irqchip_split(struct kvm *kvm) -{ - int mode =3D kvm->arch.irqchip_mode; - - /* Matches smp_wmb() when setting irqchip_mode */ - smp_rmb(); - return mode =3D=3D KVM_IRQCHIP_SPLIT; -} - -static inline int irqchip_kernel(struct kvm *kvm) +static inline int irqchip_full(struct kvm *kvm) { int mode =3D kvm->arch.irqchip_mode; =20 @@ -89,7 +80,16 @@ static inline int irqchip_kernel(struct kvm *kvm) =20 static inline int pic_in_kernel(struct kvm *kvm) { - return irqchip_kernel(kvm); + return irqchip_full(kvm); +} + +static inline int irqchip_split(struct kvm *kvm) +{ + int mode =3D kvm->arch.irqchip_mode; + + /* Matches smp_wmb() when setting irqchip_mode */ + smp_rmb(); + return mode =3D=3D KVM_IRQCHIP_SPLIT; } =20 static inline int irqchip_in_kernel(struct kvm *kvm) diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c index 28a8555ab58b..bcf2f1e4a005 100644 --- a/arch/x86/kvm/irq_comm.c +++ b/arch/x86/kvm/irq_comm.c @@ -200,7 +200,7 @@ void kvm_free_irq_source_id(struct kvm *kvm, int irq_so= urce_id) goto unlock; } clear_bit(irq_source_id, &kvm->arch.irq_sources_bitmap); - if (!irqchip_kernel(kvm)) + if (!irqchip_full(kvm)) goto unlock; =20 kvm_ioapic_clear_all(kvm->arch.vioapic, irq_source_id); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 311a670b6652..fb7b0d301c38 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -7039,7 +7039,7 @@ int kvm_arch_vm_ioctl(struct file *filp, unsigned int= ioctl, unsigned long arg) } =20 r =3D -ENXIO; - if (!irqchip_kernel(kvm)) + if (!irqchip_full(kvm)) goto get_irqchip_out; r =3D kvm_vm_ioctl_get_irqchip(kvm, chip); if (r) @@ -7063,7 +7063,7 @@ int kvm_arch_vm_ioctl(struct file *filp, unsigned int= ioctl, unsigned long arg) } =20 r =3D -ENXIO; - if (!irqchip_kernel(kvm)) + if (!irqchip_full(kvm)) goto set_irqchip_out; r =3D kvm_vm_ioctl_set_irqchip(kvm, chip); set_irqchip_out: --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CD1302517AF for ; Wed, 11 Jun 2025 21:36:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677777; cv=none; b=M2Xnb2WBLXTCOU8mlDcCijlVQLyrmT208s1dKDXmeqT3PveqIuNvb/5IP3cZCs6WlgP+v+PzP0+N+D/BxS6InvfrxagirJLpW+cn2liOyFA9bhhbrP+U2n9xDRGLZggsqlVRvUa0nsqv6tkp6MNb31knMncX2v9NF0CoXfada4A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677777; c=relaxed/simple; bh=pZl2VSKAfR5v4Bw2AKfURG4THxaXEzLGkGiVfL5sIHo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YSyPLEYca+d+nooqCyBuZTXWWft9/tPQ8cc36CzBBj9XnhKDS7Oy8kUmwK8LzjiUpc3n5AVOkFbApw2HKEkwdU/txGPMVTn1yVacX7FL70a9ozOIUT5Ztr9KYxD9InBGUUj/Fel/T+ho3RqSAKCfBUnWUyD9h+yAi+D/oG2hYlY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=pbrNte8o; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="pbrNte8o" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-7377139d8b1so235604b3a.0 for ; Wed, 11 Jun 2025 14:36:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677775; x=1750282575; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=oni1jfbd5pBW7XeSkgGvJ+4ZwWsOOKBYCbwtU5ZqKQs=; b=pbrNte8oIWP/wKXszHbFxx4GQMbtaNPR8I1Qx9y+fywB+PrhAl2G4XnTl0U7NFAbsm uPSf5gfLzC92BvYurV2DhyKXOwmL9K+uOz8lT+MvLtW0ApyKY4pcXJFNe4KUhRVmfEjZ zXe+uqpiwuw/v9I0N6pG1sW5ScSK+yjbTegItTV6jLjKLUVo/1SK+lRz09j3E/C2v53W cV3ZRIkmlMiVnE+tdaayHHtrLa0kyTVivEeyIffY+XYJcXsvu93yLMu5cPQvo34I7L9c JYtP1WrnCicGNWmDMW/Pw+wy6zfVe5D0wbJuUVHsbTwfuieVVRP+B3k+IZ3zIRqRbyj0 8nyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677775; x=1750282575; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=oni1jfbd5pBW7XeSkgGvJ+4ZwWsOOKBYCbwtU5ZqKQs=; b=q4JdFtybvpUIigddtGRfbQhZsbbCkuwp4GZSPg18+CWjO8r9KK1nOs8bRLFeg/ZGdZ jFbiyjWuDDQxIEvLDUEea6MfeaCf8b+yjMGxzyF0EQVxcOxXTC9qVNzpg5j09MD1bg10 sE4J+3oOi1Y6KQAsgR3sph2VNvJJSO+fzDwVr2RRbHlrNjLsZh64N+FuVASmpAz+3bPm QEZnsHDd6zrzfEwlyJEdd8x+ZljFRrRTgBX+I20XfJd5vrlOJ0KZlJIETjCS4VF0WfYa hswq9X76mipt1XpxFjpeROeqD4FMbugnnHKd6ndblvJnSFJ/8dNRynGoIPozL794EEaa zvxA== X-Forwarded-Encrypted: i=1; AJvYcCUAimhNOkv9TCiB4SAJ00udFhFjT30h9de3EnPgRAGH2trLjJPX/QuFABncJq1uR6g6qstWO9oKVanu6Sc=@vger.kernel.org X-Gm-Message-State: AOJu0YwJC7AfDUaOTqPfwJkerfVXS75ZpYcIfwKMuAqDu8jq3moTecuN TPnOLNEIG21XQFnL/55Jvhu2LRTachlmH4n+yIYDJbdsYWTMMjHwOML/thZz2/p57oM8RdgoAAK vc31Kow== X-Google-Smtp-Source: AGHT+IGYTun2uqID12Wrh0REil2e2ryIuSl2BbCmsAyARmY7r8+j7UXcE1vuirTxZmTRrYFotB9aYBO41Kw= X-Received: from pfxx12.prod.google.com ([2002:a05:6a00:10c:b0:746:fd4c:1fcf]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:12c6:b0:218:c22:e3e6 with SMTP id adf61e73a8af0-21f9b9eed98mr446426637.12.1749677775238; Wed, 11 Jun 2025 14:36:15 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:47 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-9-seanjc@google.com> Subject: [PATCH v2 08/18] KVM: x86: Move kvm_setup_default_irq_routing() into irq.c From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the default IRQ routing table used for in-kernel I/O APIC and PIC routing to irq.c, and tweak the name to make it explicitly clear what routing is being initialized. In addition to making it more obvious that the so called "default" routing only applies to an in-kernel I/O APIC, getting it out of irq_comm.c will allow removing irq_comm.c entirely. And placing the function alongside other I/O APIC and PIC code will allow for guarding KVM's in-kernel I/O APIC and PIC emulation with a Kconfig with minimal #ifdefs. No functional change intended. Cc: Kai Huang Signed-off-by: Sean Christopherson Acked-by: Kai Huang --- arch/x86/kvm/irq.c | 32 ++++++++++++++++++++++++++++++++ arch/x86/kvm/irq.h | 3 ++- arch/x86/kvm/irq_comm.c | 32 -------------------------------- arch/x86/kvm/x86.c | 2 +- 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c index 97e1617ce24d..b696161ec078 100644 --- a/arch/x86/kvm/irq.c +++ b/arch/x86/kvm/irq.c @@ -180,6 +180,38 @@ bool kvm_arch_irqchip_in_kernel(struct kvm *kvm) return irqchip_in_kernel(kvm); } =20 +#define IOAPIC_ROUTING_ENTRY(irq) \ + { .gsi =3D irq, .type =3D KVM_IRQ_ROUTING_IRQCHIP, \ + .u.irqchip =3D { .irqchip =3D KVM_IRQCHIP_IOAPIC, .pin =3D (irq) } } +#define ROUTING_ENTRY1(irq) IOAPIC_ROUTING_ENTRY(irq) + +#define PIC_ROUTING_ENTRY(irq) \ + { .gsi =3D irq, .type =3D KVM_IRQ_ROUTING_IRQCHIP, \ + .u.irqchip =3D { .irqchip =3D SELECT_PIC(irq), .pin =3D (irq) % 8 } } +#define ROUTING_ENTRY2(irq) \ + IOAPIC_ROUTING_ENTRY(irq), PIC_ROUTING_ENTRY(irq) + +static const struct kvm_irq_routing_entry default_routing[] =3D { + ROUTING_ENTRY2(0), ROUTING_ENTRY2(1), + ROUTING_ENTRY2(2), ROUTING_ENTRY2(3), + ROUTING_ENTRY2(4), ROUTING_ENTRY2(5), + ROUTING_ENTRY2(6), ROUTING_ENTRY2(7), + ROUTING_ENTRY2(8), ROUTING_ENTRY2(9), + ROUTING_ENTRY2(10), ROUTING_ENTRY2(11), + ROUTING_ENTRY2(12), ROUTING_ENTRY2(13), + ROUTING_ENTRY2(14), ROUTING_ENTRY2(15), + ROUTING_ENTRY1(16), ROUTING_ENTRY1(17), + ROUTING_ENTRY1(18), ROUTING_ENTRY1(19), + ROUTING_ENTRY1(20), ROUTING_ENTRY1(21), + ROUTING_ENTRY1(22), ROUTING_ENTRY1(23), +}; + +int kvm_setup_default_ioapic_and_pic_routing(struct kvm *kvm) +{ + return kvm_set_irq_routing(kvm, default_routing, + ARRAY_SIZE(default_routing), 0); +} + int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip) { struct kvm_pic *pic =3D kvm->arch.vpic; diff --git a/arch/x86/kvm/irq.h b/arch/x86/kvm/irq.h index 4ac346102350..7b8b54462f95 100644 --- a/arch/x86/kvm/irq.h +++ b/arch/x86/kvm/irq.h @@ -66,6 +66,8 @@ void kvm_pic_update_irq(struct kvm_pic *s); int kvm_pic_set_irq(struct kvm_kernel_irq_routing_entry *e, struct kvm *kv= m, int irq_source_id, int level, bool line_status); =20 +int kvm_setup_default_ioapic_and_pic_routing(struct kvm *kvm); + int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip); int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip); =20 @@ -110,7 +112,6 @@ void __kvm_migrate_timers(struct kvm_vcpu *vcpu); =20 int apic_has_pending_timer(struct kvm_vcpu *vcpu); =20 -int kvm_setup_default_irq_routing(struct kvm *kvm); int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src, struct kvm_lapic_irq *irq, struct dest_map *dest_map); diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c index bcf2f1e4a005..99c521bd9db5 100644 --- a/arch/x86/kvm/irq_comm.c +++ b/arch/x86/kvm/irq_comm.c @@ -334,38 +334,6 @@ bool kvm_intr_is_single_vcpu(struct kvm *kvm, struct k= vm_lapic_irq *irq, } EXPORT_SYMBOL_GPL(kvm_intr_is_single_vcpu); =20 -#define IOAPIC_ROUTING_ENTRY(irq) \ - { .gsi =3D irq, .type =3D KVM_IRQ_ROUTING_IRQCHIP, \ - .u.irqchip =3D { .irqchip =3D KVM_IRQCHIP_IOAPIC, .pin =3D (irq) } } -#define ROUTING_ENTRY1(irq) IOAPIC_ROUTING_ENTRY(irq) - -#define PIC_ROUTING_ENTRY(irq) \ - { .gsi =3D irq, .type =3D KVM_IRQ_ROUTING_IRQCHIP, \ - .u.irqchip =3D { .irqchip =3D SELECT_PIC(irq), .pin =3D (irq) % 8 } } -#define ROUTING_ENTRY2(irq) \ - IOAPIC_ROUTING_ENTRY(irq), PIC_ROUTING_ENTRY(irq) - -static const struct kvm_irq_routing_entry default_routing[] =3D { - ROUTING_ENTRY2(0), ROUTING_ENTRY2(1), - ROUTING_ENTRY2(2), ROUTING_ENTRY2(3), - ROUTING_ENTRY2(4), ROUTING_ENTRY2(5), - ROUTING_ENTRY2(6), ROUTING_ENTRY2(7), - ROUTING_ENTRY2(8), ROUTING_ENTRY2(9), - ROUTING_ENTRY2(10), ROUTING_ENTRY2(11), - ROUTING_ENTRY2(12), ROUTING_ENTRY2(13), - ROUTING_ENTRY2(14), ROUTING_ENTRY2(15), - ROUTING_ENTRY1(16), ROUTING_ENTRY1(17), - ROUTING_ENTRY1(18), ROUTING_ENTRY1(19), - ROUTING_ENTRY1(20), ROUTING_ENTRY1(21), - ROUTING_ENTRY1(22), ROUTING_ENTRY1(23), -}; - -int kvm_setup_default_irq_routing(struct kvm *kvm) -{ - return kvm_set_irq_routing(kvm, default_routing, - ARRAY_SIZE(default_routing), 0); -} - void kvm_scan_ioapic_irq(struct kvm_vcpu *vcpu, u32 dest_id, u16 dest_mode, u8 vector, unsigned long *ioapic_handled_vectors) { diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index fb7b0d301c38..f02a9a332f69 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -6991,7 +6991,7 @@ int kvm_arch_vm_ioctl(struct file *filp, unsigned int= ioctl, unsigned long arg) goto create_irqchip_unlock; } =20 - r =3D kvm_setup_default_irq_routing(kvm); + r =3D kvm_setup_default_ioapic_and_pic_routing(kvm); if (r) { kvm_ioapic_destroy(kvm); kvm_pic_destroy(kvm); --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BA16D253B7B for ; Wed, 11 Jun 2025 21:36:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677779; cv=none; b=IGJQVUsSKvrDwBmkowzDdrFn2rK1TrpMuDFkI4PESfNWBFxXj7jhDMTGCxbdGHZMgv+8jA2cIt+aJ5vjFTDvQd52wUr5IOfYhWH476DCKt5qnaAU/LyAHOiN7vEKIDoZV0Gm6t3q+AZ+SERN9t6qqNwV6cRoJFRlqBiL5oV/Uog= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677779; c=relaxed/simple; bh=+vYrgJY1+/1o07RK4HZUh7EncKERE3O3MBachh0luvA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=OaUYQDCD7iJFskrnYGSShkIWjaN8hQy0OONaUX/oBkquYotPyZXDwKEeyrFR41t5mmzn/aPf5D561hnLWdoyd2sEaRv5KL0oyzgl2YT9WDWCiHjsjtxEQKMeCrVGl08na8LxaWQu7y/iiKnvQgOmes/E1hkVtSWjXyh5wxo0hA8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=eylpKjSU; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="eylpKjSU" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b1fa2cad5c9so88628a12.2 for ; Wed, 11 Jun 2025 14:36:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677777; x=1750282577; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=afviLMdVVwZckbxRv+VEZNnw8Pog0zIlB+4nuAi0opA=; b=eylpKjSUBOUwmPeaM6afliuGW+5lIGVadVKBUU9GQeP1X8eOUydDgwzZnaeKirP1nO cXz/kWacejmdMmz255JDL3Yr4uKnP7o/ZWxLog4fjz1imxkUYAPcOcU4oC6afHhHDBCq 7IsFVX/bbqCqFRLaQLI/ZZuRRRxVAiumQKHcH5aMjK7Obs1V92QuKvdH3RkSkEMSbUNx CpMAa8zeDPrZaxWNjQ535wA3pFEQ/kBwCZpC30HeBjUg0/fMlb84q7m5zZ7nUck7RrQW s6OzYynaGVr+nmhjibHIqakk6qPX9rmxdwmYGPIdQ723ZrC4Wwrlj4KPbblswUerdw24 Eehg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677777; x=1750282577; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=afviLMdVVwZckbxRv+VEZNnw8Pog0zIlB+4nuAi0opA=; b=VWGopbJBuX4nkPBv95VOeGTK6XYn6Tjrl5B9gbigcRYbqLnvOXQcgizxO4RnoctzLk 33d+vg5RwdvMVy2FFTDEPr44BpWccCuK5kax1HFvaEHseJ+xxgr7VNhtNARTEeplQROt jlLZZyLdfZTGXSr3GZelxmYy+vrGvIJ+yWmJac9kxQzGMHzJsNkQpFbGuF3AO1jVctb6 eLb2NA3RhTPsup5+9gQL7vAZiFtbI4y73GNny7ozyS/+eykjmFKCN+Yu1k8SNfRgBys1 4DLzKQlyy1f7XxVYdMotvjTkFiDI8zNvvGgPtyydjH9oVpqViO4J4Tm3LhSTLMVZ1vHW fU0g== X-Forwarded-Encrypted: i=1; AJvYcCX+SowR9c1Xj2LrX8HOtPNOo1fArMFJtOZp2edUVrz31JwmuLf7Cll5nwtg9nXHbJ939PQV8YWcWzLrfks=@vger.kernel.org X-Gm-Message-State: AOJu0Yyye10HagO4bneSD3wWtK05vJlbaTP3yhqXpVekiYMlCZn5iGL6 Oq2Rf4L6JQo7pLmrn6HU4Uw/4pgxqcI3FWXVFi2wJTSQKfVP3xFIghueouC/gkuOD3Ytki9rdzC twYVZ6g== X-Google-Smtp-Source: AGHT+IEJRurOYzy7EBSRytoln369m1CPCouqctswPhetUVJJ/3eBhE1YoV5gyGB5lgBPAN2muoLSu1GC+rM= X-Received: from pfbbe7.prod.google.com ([2002:a05:6a00:1f07:b0:746:1a2e:b29b]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:b90:b0:1f5:7eb5:72dc with SMTP id adf61e73a8af0-21f97752d70mr1972780637.3.1749677777044; Wed, 11 Jun 2025 14:36:17 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:48 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-10-seanjc@google.com> Subject: [PATCH v2 09/18] KVM: x86: Move kvm_{request,free}_irq_source_id() to i8254.c (PIT) From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move kvm_{request,free}_irq_source_id() to i8254.c, i.e. the dedicated PIT emulation file, in anticipation of removing them entirely in favor of hardcoding the PIT's "requested" source ID (the source ID can only ever be '2', and the request can never fail). No functional change intended. Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- arch/x86/kvm/i8254.c | 44 ++++++++++++++++++++++++++++++++++++++++ arch/x86/kvm/irq_comm.c | 44 ---------------------------------------- include/linux/kvm_host.h | 2 -- 3 files changed, 44 insertions(+), 46 deletions(-) diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index 59f956f35f4c..2bb223bf0dac 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c @@ -641,6 +641,50 @@ static void kvm_pit_reset(struct kvm_pit *pit) kvm_pit_reset_reinject(pit); } =20 +static int kvm_request_irq_source_id(struct kvm *kvm) +{ + unsigned long *bitmap =3D &kvm->arch.irq_sources_bitmap; + int irq_source_id; + + mutex_lock(&kvm->irq_lock); + irq_source_id =3D find_first_zero_bit(bitmap, BITS_PER_LONG); + + if (irq_source_id >=3D BITS_PER_LONG) { + pr_warn("exhausted allocatable IRQ sources!\n"); + irq_source_id =3D -EFAULT; + goto unlock; + } + + ASSERT(irq_source_id !=3D KVM_USERSPACE_IRQ_SOURCE_ID); + ASSERT(irq_source_id !=3D KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID); + set_bit(irq_source_id, bitmap); +unlock: + mutex_unlock(&kvm->irq_lock); + + return irq_source_id; +} + +static void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id) +{ + ASSERT(irq_source_id !=3D KVM_USERSPACE_IRQ_SOURCE_ID); + ASSERT(irq_source_id !=3D KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID); + + mutex_lock(&kvm->irq_lock); + if (irq_source_id < 0 || + irq_source_id >=3D BITS_PER_LONG) { + pr_err("IRQ source ID out of range!\n"); + goto unlock; + } + clear_bit(irq_source_id, &kvm->arch.irq_sources_bitmap); + if (!irqchip_full(kvm)) + goto unlock; + + kvm_ioapic_clear_all(kvm->arch.vioapic, irq_source_id); + kvm_pic_clear_all(kvm->arch.vpic, irq_source_id); +unlock: + mutex_unlock(&kvm->irq_lock); +} + static void pit_mask_notifer(struct kvm_irq_mask_notifier *kimn, bool mask) { struct kvm_pit *pit =3D container_of(kimn, struct kvm_pit, mask_notifier); diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c index 99c521bd9db5..138c675dc24b 100644 --- a/arch/x86/kvm/irq_comm.c +++ b/arch/x86/kvm/irq_comm.c @@ -165,50 +165,6 @@ int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_ro= uting_entry *e, return -EWOULDBLOCK; } =20 -int kvm_request_irq_source_id(struct kvm *kvm) -{ - unsigned long *bitmap =3D &kvm->arch.irq_sources_bitmap; - int irq_source_id; - - mutex_lock(&kvm->irq_lock); - irq_source_id =3D find_first_zero_bit(bitmap, BITS_PER_LONG); - - if (irq_source_id >=3D BITS_PER_LONG) { - pr_warn("exhausted allocatable IRQ sources!\n"); - irq_source_id =3D -EFAULT; - goto unlock; - } - - ASSERT(irq_source_id !=3D KVM_USERSPACE_IRQ_SOURCE_ID); - ASSERT(irq_source_id !=3D KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID); - set_bit(irq_source_id, bitmap); -unlock: - mutex_unlock(&kvm->irq_lock); - - return irq_source_id; -} - -void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id) -{ - ASSERT(irq_source_id !=3D KVM_USERSPACE_IRQ_SOURCE_ID); - ASSERT(irq_source_id !=3D KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID); - - mutex_lock(&kvm->irq_lock); - if (irq_source_id < 0 || - irq_source_id >=3D BITS_PER_LONG) { - pr_err("IRQ source ID out of range!\n"); - goto unlock; - } - clear_bit(irq_source_id, &kvm->arch.irq_sources_bitmap); - if (!irqchip_full(kvm)) - goto unlock; - - kvm_ioapic_clear_all(kvm->arch.vioapic, irq_source_id); - kvm_pic_clear_all(kvm->arch.vpic, irq_source_id); -unlock: - mutex_unlock(&kvm->irq_lock); -} - void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq, struct kvm_irq_mask_notifier *kimn) { diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 9461517b4e62..cba8fc4529e8 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1784,8 +1784,6 @@ void kvm_register_irq_ack_notifier(struct kvm *kvm, struct kvm_irq_ack_notifier *kian); void kvm_unregister_irq_ack_notifier(struct kvm *kvm, struct kvm_irq_ack_notifier *kian); -int kvm_request_irq_source_id(struct kvm *kvm); -void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id); bool kvm_arch_irqfd_allowed(struct kvm *kvm, struct kvm_irqfd *args); =20 /* --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6BFB6256C61 for ; Wed, 11 Jun 2025 21:36:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677781; cv=none; b=OUJ/Xs4YSUpNuSQDCv4c8psYkACV6j3DLSlzr0bDb/JbrmjXYUWqdALG6R3a1uMG5ZCqKPBGUK1t38C2+3kMQ7oOK5zduTh/8CNx9im2H2gH1yLWdbOJQd6Llwa9fhjkjgZWfEEOzyDU23e3rM286dDAO0xJDLogI5flh9t8XuA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677781; c=relaxed/simple; bh=eJwcngQ+DpTfv+ouROAPw+UWqw33arcrIBz+YZkiD5k=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YYsf+9jCVpLZhX9sMKs+0RoWWQ7FmFsqbKw0VL4fRU3Daas+SjFGwDqJF05/nAZMKvKek8MmVKkgPlJK9yvLIYMnphlTtC30PnFa5lxPVab0JFlkRHqVNmclNWH7uNJey2ievlVD7YW9hkUAFNJD5pNpARizRNcIoXohmiN5UaI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=1FAD1fhl; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="1FAD1fhl" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b2fb347b3e6so185026a12.1 for ; Wed, 11 Jun 2025 14:36:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677779; x=1750282579; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=kpb+iWlljlUnDOEgX9GQ6UR4rnxmypu3poRL7IS771A=; b=1FAD1fhlhOTrEDChMbP71We9Kr0HKcqs2pZ41nt/o14BDAGFJqA+BKXZeWW1qJHZ3j /+yLCM3fs+caSHcqwlOPJa0UN9GwjcB4WlLIpq5niqA1qUvABdnKdtWHEXeoaMk1IL4T zzlljPtk1+f7C7ifj38+YZHVNB6K9MKueDTx+mThK0wbfGPLcEwX3k113jnHeiBg+d9X sl6lPNwcNFKF9581QbWw6/pa91ZmXRUEm8uYwGpxIPIQGPl88PqPhVSyBrVl3ySriZXQ 8uTaFwr3M3FD0WcHjK7gT9s45p905l2z04Lf4/6ZHQhLigPznWt+TG31fwqFH4TvFQ5w Db+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677779; x=1750282579; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=kpb+iWlljlUnDOEgX9GQ6UR4rnxmypu3poRL7IS771A=; b=Yxg0lSZDBz6eJS+qYecNyzTDIc5n5o0WG1MhIs2V+1yao9ycn8hoiCYukgCmBNK5AY S6yTI19TuYV8VbO1/3yTjMa4BKWut0z9Bncj1qafcUTzDqpQJTvEjoW+kcj6s5SUJuE5 oqLUv/OSr5B6ExI6YNjjOuwattpwiQOzf9PU8X8U8Ue5HOC7v8ww7oru/TIHN3c/zpep 94/YWSu/vOdl/XJwEtrfO2ivqvQl+L2zElGCLIx0nafmoYFZCd80RO9D8M5xkCksQYgI 4vbvaBweL7gR07PLLPHQzsrhI9fKtvnghM0BlgZHEzsNYt7my9ARnZ0xhUWHGSLgmNzx hNyg== X-Forwarded-Encrypted: i=1; AJvYcCVUi2nBYkCdGhw5d58gYv6GfYjc9/H08PysPcxUPEo62JpMVpwRyQo3KrPxApPtWZFPwbRT6nj6MkOw9RE=@vger.kernel.org X-Gm-Message-State: AOJu0YwiE23Ql0xkbItHbTxnGkCKpdBnq6/ldS5tiuDs3KjCv9qWRlpQ 4yRK0DZdzpEFJHMYH67Ijg/jVoO5MVFxxjcpbnPdryN5xPc97PkGu5bOa6IRgXknkALsgSgKwa8 J3ggxcA== X-Google-Smtp-Source: AGHT+IFUJOSi+ExSQf/7uPqW/JnEPdK6RMy8kqpSeeweq1JUqHHcz/MuEs5VAl/nK94ZZSQTxiasBAv1p/4= X-Received: from pjqq12.prod.google.com ([2002:a17:90b:584c:b0:312:ea08:fa64]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1d4f:b0:311:c1ec:7d05 with SMTP id 98e67ed59e1d1-313af24e4a0mr6860950a91.35.1749677778771; Wed, 11 Jun 2025 14:36:18 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:49 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-11-seanjc@google.com> Subject: [PATCH v2 10/18] KVM: x86: Hardcode the PIT IRQ source ID to '2' From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Hardcode the PIT's source IRQ ID to '2' instead of "finding" that bit 2 is always the first available bit in irq_sources_bitmap. Bits 0 and 1 are set/reserved by kvm_arch_init_vm(), i.e. long before kvm_create_pit() can be invoked, and KVM allows at most one in-kernel PIT instance, i.e. it's impossible for the PIT to find a different free bit (there are no other users of kvm_request_irq_source_id(). Delete the now-defunct irq_sources_bitmap and all its associated code. Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 1 - arch/x86/kvm/i8254.c | 55 +++++---------------------------- arch/x86/kvm/i8254.h | 1 - arch/x86/kvm/x86.c | 6 ---- include/linux/kvm_host.h | 1 + 5 files changed, 8 insertions(+), 56 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index f25ec3ec5ce4..c8654e461933 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1396,7 +1396,6 @@ struct kvm_arch { bool pause_in_guest; bool cstate_in_guest; =20 - unsigned long irq_sources_bitmap; s64 kvmclock_offset; =20 /* diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index 2bb223bf0dac..fa8187608cfc 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c @@ -248,8 +248,8 @@ static void pit_do_work(struct kthread_work *work) if (atomic_read(&ps->reinject) && !atomic_xchg(&ps->irq_ack, 0)) return; =20 - kvm_set_irq(kvm, pit->irq_source_id, 0, 1, false); - kvm_set_irq(kvm, pit->irq_source_id, 0, 0, false); + kvm_set_irq(kvm, KVM_PIT_IRQ_SOURCE_ID, 0, 1, false); + kvm_set_irq(kvm, KVM_PIT_IRQ_SOURCE_ID, 0, 0, false); =20 /* * Provides NMI watchdog support via Virtual Wire mode. @@ -641,47 +641,11 @@ static void kvm_pit_reset(struct kvm_pit *pit) kvm_pit_reset_reinject(pit); } =20 -static int kvm_request_irq_source_id(struct kvm *kvm) +static void kvm_pit_clear_all(struct kvm *kvm) { - unsigned long *bitmap =3D &kvm->arch.irq_sources_bitmap; - int irq_source_id; - mutex_lock(&kvm->irq_lock); - irq_source_id =3D find_first_zero_bit(bitmap, BITS_PER_LONG); - - if (irq_source_id >=3D BITS_PER_LONG) { - pr_warn("exhausted allocatable IRQ sources!\n"); - irq_source_id =3D -EFAULT; - goto unlock; - } - - ASSERT(irq_source_id !=3D KVM_USERSPACE_IRQ_SOURCE_ID); - ASSERT(irq_source_id !=3D KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID); - set_bit(irq_source_id, bitmap); -unlock: - mutex_unlock(&kvm->irq_lock); - - return irq_source_id; -} - -static void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id) -{ - ASSERT(irq_source_id !=3D KVM_USERSPACE_IRQ_SOURCE_ID); - ASSERT(irq_source_id !=3D KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID); - - mutex_lock(&kvm->irq_lock); - if (irq_source_id < 0 || - irq_source_id >=3D BITS_PER_LONG) { - pr_err("IRQ source ID out of range!\n"); - goto unlock; - } - clear_bit(irq_source_id, &kvm->arch.irq_sources_bitmap); - if (!irqchip_full(kvm)) - goto unlock; - - kvm_ioapic_clear_all(kvm->arch.vioapic, irq_source_id); - kvm_pic_clear_all(kvm->arch.vpic, irq_source_id); -unlock: + kvm_ioapic_clear_all(kvm->arch.vioapic, KVM_PIT_IRQ_SOURCE_ID); + kvm_pic_clear_all(kvm->arch.vpic, KVM_PIT_IRQ_SOURCE_ID); mutex_unlock(&kvm->irq_lock); } =20 @@ -788,10 +752,6 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 fl= ags) if (!pit) return NULL; =20 - pit->irq_source_id =3D kvm_request_irq_source_id(kvm); - if (pit->irq_source_id < 0) - goto fail_request; - mutex_init(&pit->pit_state.lock); =20 pid =3D get_pid(task_tgid(current)); @@ -843,8 +803,7 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 fla= gs) kvm_pit_set_reinject(pit, false); kthread_destroy_worker(pit->worker); fail_kthread: - kvm_free_irq_source_id(kvm, pit->irq_source_id); -fail_request: + kvm_pit_clear_all(kvm); kfree(pit); return NULL; } @@ -861,7 +820,7 @@ void kvm_free_pit(struct kvm *kvm) kvm_pit_set_reinject(pit, false); hrtimer_cancel(&pit->pit_state.timer); kthread_destroy_worker(pit->worker); - kvm_free_irq_source_id(kvm, pit->irq_source_id); + kvm_pit_clear_all(kvm); kfree(pit); } } diff --git a/arch/x86/kvm/i8254.h b/arch/x86/kvm/i8254.h index 338095829ec8..b9c1feb379a7 100644 --- a/arch/x86/kvm/i8254.h +++ b/arch/x86/kvm/i8254.h @@ -44,7 +44,6 @@ struct kvm_pit { struct kvm_io_device speaker_dev; struct kvm *kvm; struct kvm_kpit_state pit_state; - int irq_source_id; struct kvm_irq_mask_notifier mask_notifier; struct kthread_worker *worker; struct kthread_work expired; diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index f02a9a332f69..115405f496ef 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -12669,12 +12669,6 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned lon= g type) INIT_HLIST_HEAD(&kvm->arch.mask_notifier_list); atomic_set(&kvm->arch.noncoherent_dma_count, 0); =20 - /* Reserve bit 0 of irq_sources_bitmap for userspace irq source */ - set_bit(KVM_USERSPACE_IRQ_SOURCE_ID, &kvm->arch.irq_sources_bitmap); - /* Reserve bit 1 of irq_sources_bitmap for irqfd-resampler */ - set_bit(KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID, - &kvm->arch.irq_sources_bitmap); - raw_spin_lock_init(&kvm->arch.tsc_write_lock); mutex_init(&kvm->arch.apic_map_lock); seqcount_raw_spinlock_init(&kvm->arch.pvclock_sc, &kvm->arch.tsc_write_lo= ck); diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index cba8fc4529e8..4ff5ea29e343 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -190,6 +190,7 @@ bool kvm_make_all_cpus_request(struct kvm *kvm, unsigne= d int req); =20 #define KVM_USERSPACE_IRQ_SOURCE_ID 0 #define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID 1 +#define KVM_PIT_IRQ_SOURCE_ID 2 =20 extern struct mutex kvm_lock; extern struct list_head vm_list; --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1F0872594AA for ; Wed, 11 Jun 2025 21:36:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677782; cv=none; b=lOgqxvZbpwgv0JSqDdShRgcpdaumtAD+xF+xmo/EEILmYPbs5VLt0eOVV+/KsM25NeN/aaNK9AOnqg7tdoseuauGoSrd1bbbP4Q+ru4lnWJg9bOKODruxYymghViofCjcRPF1ErUhVLxETAnlBb9iYYmxaxSSPDb5r0Ognz8eZk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677782; c=relaxed/simple; bh=eMo600wYx6b04es2mg4zvb7ZJ1X3gsBg3cCmJNefs84=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ZAEgCYgVRsFSmdtYPAMN4iWNPJCY0bhh/5fvUO1PlHMdVe+L0pR+gkkPFxLVeIelo8OjuhZHCUXP4VmhDqJRkqYsckedUCZtT2qvAV557mJuIB0YyXIO7atKfKRaTIvItzfdEZkZR6CMn7q2ZCTT944l33Q32rTUGDbNUxbMaqk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=K23i7uht; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="K23i7uht" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-311ae2b6647so287490a91.0 for ; Wed, 11 Jun 2025 14:36:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677780; x=1750282580; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=5FzQpJPBws5g+wsljIIo7Z5Bp6DrDU9fqIl8eG4VyGw=; b=K23i7uhtvUee2Hm04PJeJNl3e01MBUj+203+fGJs95Zy5MmxWKnB51IYgnV6xTBzDa tGVHWBLOLaKS2ClIFHffrimTQhSAi4eDkJkz4KYj4AiadjOUweqrH91RhXLWP5cKAn37 UXK3Pfk8vTeW00G6t/8szU8I4GpjmZ8cKboBNZ41msBDnZT5QQWVzU1ytcBNrqzNzpEU /4ONxA8H1P2CT5vhADKLO5gvnJdIyElqWPjXaBoSj6s2tOpcBrVrl61A8QpSdeLbDYze 1xis52dQtnjNiOYEhhfCyOSTpzq2HbBfHJ2LwFXYd7Sn/kuTIByOwAuvES6FsxdEa88x TjjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677780; x=1750282580; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=5FzQpJPBws5g+wsljIIo7Z5Bp6DrDU9fqIl8eG4VyGw=; b=H8emwfkfa58kKG8dyrQtRNUoyYaWU8+BxuCvJbY4oEOYRsqtkKeVzblalX++G2r7cj Pytj/hsPRnplArf/i6w8wgYgtkvRyoEFg6xTQSs24CmPknT+LHUk2oPz8DsSpfLRXZup PLfjyfjz++iincsVD9IjXRwGn9oRdBkXQiuQmun33A1pVx2M9rjOcaq6LaDcY3FLvwiK TIq1uCCkklk7uYOiXQNd9T5REphFeN20DCFDqjrsRHCj2WBU1O51Pn+n5qGgb8qNvJPi mPJIcZ2IsgNET+lU0u1NVjymSeOo94sqF9t7mHlZouP22ahUC0YF98NRvUggvHaxkiUh uAXQ== X-Forwarded-Encrypted: i=1; AJvYcCXJdZ4R0NBOoqEsiiLrWB34phb17K2lHRGrr9fT8VLlwNSgf8oFXPaVs4WGKRh0t+ghxE9OIX5EV0vidok=@vger.kernel.org X-Gm-Message-State: AOJu0YxzqDJnqg4QY17N2fFY3ov0PT2esN9dAXtC6hRHdRSyfEbV/qDd ZnM61jyoghGB5f/T99+hHe4TcWqEZ77QWAQCj0+AdoIxGNJm1ZxEUJ6ZFDqlQ7pfYGP4OoWZmu0 fX+ZqzQ== X-Google-Smtp-Source: AGHT+IFD12JRdHUCksGhy/XcWTkonRiOG3BhyvAgj37rBTKE+EmIrEmNXmDOjjdvt8FotqXYFeSehrvQeAA= X-Received: from pjbpl16.prod.google.com ([2002:a17:90b:2690:b0:311:e9bb:f8d4]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3e43:b0:312:e445:fdd5 with SMTP id 98e67ed59e1d1-313bfbe89f9mr1322456a91.35.1749677780496; Wed, 11 Jun 2025 14:36:20 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:50 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-12-seanjc@google.com> Subject: [PATCH v2 11/18] KVM: x86: Don't clear PIT's IRQ line status when destroying PIT From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Don't bother clearing the PIT's IRQ line status when destroying the PIT, as userspace can't possibly rely on KVM to lower the IRQ line in any sane use case, and it's not at all obvious that clearing the PIT's IRQ line is correct/desirable in kvm_create_pit()'s error path. When called from kvm_arch_pre_destroy_vm(), the entire VM is being torn down and thus {kvm_pic,kvm_ioapic}.irq_states are unreachable. As for the error path in kvm_create_pit(), the only way the PIT's bit in irq_states can be set is if userspace raises the associated IRQ before KVM_CREATE_PIT{2} completes. Forcefully clearing the bit would clobber userspace's input, nonsensical though that input may be. Not to mention that no known VMM will continue on if PIT creation fails. Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 2 -- arch/x86/kvm/i8254.c | 10 ---------- arch/x86/kvm/i8259.c | 10 ---------- arch/x86/kvm/ioapic.c | 10 ---------- arch/x86/kvm/ioapic.h | 1 - 5 files changed, 33 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index c8654e461933..ebda93979179 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -2207,8 +2207,6 @@ static inline int __kvm_irq_line_state(unsigned long = *irq_state, return !!(*irq_state); } =20 -void kvm_pic_clear_all(struct kvm_pic *pic, int irq_source_id); - void kvm_inject_nmi(struct kvm_vcpu *vcpu); int kvm_get_nr_pending_nmis(struct kvm_vcpu *vcpu); =20 diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index fa8187608cfc..d1b79b418c05 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c @@ -641,14 +641,6 @@ static void kvm_pit_reset(struct kvm_pit *pit) kvm_pit_reset_reinject(pit); } =20 -static void kvm_pit_clear_all(struct kvm *kvm) -{ - mutex_lock(&kvm->irq_lock); - kvm_ioapic_clear_all(kvm->arch.vioapic, KVM_PIT_IRQ_SOURCE_ID); - kvm_pic_clear_all(kvm->arch.vpic, KVM_PIT_IRQ_SOURCE_ID); - mutex_unlock(&kvm->irq_lock); -} - static void pit_mask_notifer(struct kvm_irq_mask_notifier *kimn, bool mask) { struct kvm_pit *pit =3D container_of(kimn, struct kvm_pit, mask_notifier); @@ -803,7 +795,6 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 fla= gs) kvm_pit_set_reinject(pit, false); kthread_destroy_worker(pit->worker); fail_kthread: - kvm_pit_clear_all(kvm); kfree(pit); return NULL; } @@ -820,7 +811,6 @@ void kvm_free_pit(struct kvm *kvm) kvm_pit_set_reinject(pit, false); hrtimer_cancel(&pit->pit_state.timer); kthread_destroy_worker(pit->worker); - kvm_pit_clear_all(kvm); kfree(pit); } } diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index 0150aec4f523..4de055efc4ee 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c @@ -206,16 +206,6 @@ int kvm_pic_set_irq(struct kvm_kernel_irq_routing_entr= y *e, struct kvm *kvm, return ret; } =20 -void kvm_pic_clear_all(struct kvm_pic *s, int irq_source_id) -{ - int i; - - pic_lock(s); - for (i =3D 0; i < PIC_NUM_PINS; i++) - __clear_bit(irq_source_id, &s->irq_states[i]); - pic_unlock(s); -} - /* * acknowledge interrupt 'irq' */ diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c index 8c8a8062eb19..65626da1407f 100644 --- a/arch/x86/kvm/ioapic.c +++ b/arch/x86/kvm/ioapic.c @@ -498,16 +498,6 @@ int kvm_ioapic_set_irq(struct kvm_kernel_irq_routing_e= ntry *e, struct kvm *kvm, return ret; } =20 -void kvm_ioapic_clear_all(struct kvm_ioapic *ioapic, int irq_source_id) -{ - int i; - - spin_lock(&ioapic->lock); - for (i =3D 0; i < KVM_IOAPIC_NUM_PINS; i++) - __clear_bit(irq_source_id, &ioapic->irq_states[i]); - spin_unlock(&ioapic->lock); -} - static void kvm_ioapic_eoi_inject_work(struct work_struct *work) { int i; diff --git a/arch/x86/kvm/ioapic.h b/arch/x86/kvm/ioapic.h index 289cca3aec69..dc92bd7c37bc 100644 --- a/arch/x86/kvm/ioapic.h +++ b/arch/x86/kvm/ioapic.h @@ -114,7 +114,6 @@ void kvm_ioapic_destroy(struct kvm *kvm); int kvm_ioapic_set_irq(struct kvm_kernel_irq_routing_entry *e, struct kvm = *kvm, int irq_source_id, int level, bool line_status); =20 -void kvm_ioapic_clear_all(struct kvm_ioapic *ioapic, int irq_source_id); void kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state); void kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state); void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu, --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 214DB25B1C5 for ; Wed, 11 Jun 2025 21:36:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677784; cv=none; b=JzXGnpChLIC/RSncqukTM3SuBT9KWLLbOmyKrWSJ1EM+awtp1t6fh98UAjxbjb09FncsA9wVRPAX+SOyK3cXcoNQELr9/mq6oNWo8243cWBlx2oFzaB1gu0vXR+6+AD+BkhrmcgaESd5rbSYKkNEfCAQRStJbtbSHvxMN4OM60g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677784; c=relaxed/simple; bh=HU/O+hAQBRCathiCEhtneyg+3txtTnYDWui28f+iNq4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Nodz4sFTr/We2qVOxCsxF+dL2shC2ef3SGDddkxe5PLMuo3yOJk0El2cwBHnMklAEebAvZFj2/1oIq1msH+ha/SQq07ERKGPvxI+ETeI1366OlsrQPU5+0BRs1wS3b3nau345YlJxgppl8AHUpXvcYi8kSGGUCkNNsNzan1is7A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=K6haRCWK; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="K6haRCWK" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b16b35ea570so202261a12.0 for ; Wed, 11 Jun 2025 14:36:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677782; x=1750282582; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=PIqY5l9QTfLBnGxVH0bNVPmqIZNzodkqRPy8g7rI1YM=; b=K6haRCWKfka0gB4LnfmDsj+eWuOP+4xTGOO+EN6DLMmxhRfi37u5gbfvJ/UfmCZt3a qCVZ2JoauypbcvpKoHQhInucVDP21kHRLvyXy4WOZ2mTU07YnNXUdTXVWQS0udHKE6S9 KQWvTu/kgnFVYQfcgpzUPVPfeyiHhsKTbqElF/6ll1B131fMWNO2LofaDVAn+VHi8Jq6 1vv96eCw8InDVWr5ynLwbjsPegWAnJgbqQZLVuQS5+EyOlBg/2+uSREx0awzMfAtYKzS Ds95lQW4oRY79LCX6LANmQ8WyrzPD1mfWNdG9Yfppv8w8Bot9gps2jCmyowXY0HljLsw DU8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677782; x=1750282582; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=PIqY5l9QTfLBnGxVH0bNVPmqIZNzodkqRPy8g7rI1YM=; b=jCjq8wR8TGL74AJGTD5+JYAM5Ga6O57OvSrU9T8b+ki+Uguq9P3VpZnqlJ5bTZiskl V8HtPhAD4BYHBSy5W1waS5BxYuD9M0xy1aLf7QeuNNbRNMtOJj7lFiOScZlqbvEJRyZ/ wHF0QLMXo7qUCUZU97X3iJDVw6pdV9pcEIPctwmPD5BmcdZm5wpiz4CzhKmKTBCBUfQv aOpb67aeYgmY4ImlisZLtpKq0Sr7Iz/Fref20KWg/cXm04Yoah8D9MCOuvlh7bF5JT+D evsp27NpYRbXpkp24zQ72RQGBPj5GLvL2g/Ftel9AFhTVl4AToC4FKmxP4jIgP2h1Gtq My4g== X-Forwarded-Encrypted: i=1; AJvYcCVQjncjPce3YNPOs7EDH2nwX79f8L3oazD3lRaDIvIkemwA7MDpl6fQKNVAJ5KRr8Mamg0nxrXXzzjGZWA=@vger.kernel.org X-Gm-Message-State: AOJu0Yz5nurj3/da5HIAvWDsD4EwgK2lz2WyEZ3d6M3WXcV8HjUVExiX V9zgruJemFXIUA8C1R8JZYwOvBjErhur8Q+fzT/5ZQKJY+ncubZBpN9NVahB3z0+qsCtmvx0Ehm q9gs0wg== X-Google-Smtp-Source: AGHT+IE4xupnaiqX63lqW3UVbRH6cr7BEnhgz243ASqU8XEvcG4UXXe/TA4G9u/tYDjQoONdqCLDMZz1UGY= X-Received: from pghc2.prod.google.com ([2002:a63:da02:0:b0:b2c:4fcd:fe1b]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:6e92:b0:215:dbb0:2a85 with SMTP id adf61e73a8af0-21f9b52c5e6mr536039637.0.1749677782442; Wed, 11 Jun 2025 14:36:22 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:51 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-13-seanjc@google.com> Subject: [PATCH v2 12/18] KVM: x86: Explicitly check for in-kernel PIC when getting ExtINT From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Explicitly check for an in-kernel PIC when checking for a pending ExtINT in the PIC. Effectively swapping the split vs. full irqchip logic will allow guarding the in-kernel I/O APIC (and PIC) emulation with a Kconfig, and also makes it more obvious that kvm_pic_read_irq() won't result in a NULL pointer dereference. Opportunistically add WARNs in the fallthrough path, mostly to document that the userspace ExtINT logic is only relevant to split IRQ chips. Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- arch/x86/kvm/irq.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c index b696161ec078..fb3bad0f4965 100644 --- a/arch/x86/kvm/irq.c +++ b/arch/x86/kvm/irq.c @@ -42,6 +42,14 @@ static int pending_userspace_extint(struct kvm_vcpu *v) return v->arch.pending_external_vector !=3D -1; } =20 +static int get_userspace_extint(struct kvm_vcpu *vcpu) +{ + int vector =3D vcpu->arch.pending_external_vector; + + vcpu->arch.pending_external_vector =3D -1; + return vector; +} + /* * check if there is pending interrupt from * non-APIC source without intack. @@ -68,10 +76,11 @@ int kvm_cpu_has_extint(struct kvm_vcpu *v) if (!kvm_apic_accept_pic_intr(v)) return 0; =20 - if (irqchip_split(v->kvm)) - return pending_userspace_extint(v); - else + if (pic_in_kernel(v->kvm)) return v->kvm->arch.vpic->output; + + WARN_ON_ONCE(!irqchip_split(v->kvm)); + return pending_userspace_extint(v); } =20 /* @@ -127,13 +136,11 @@ int kvm_cpu_get_extint(struct kvm_vcpu *v) return v->kvm->arch.xen.upcall_vector; #endif =20 - if (irqchip_split(v->kvm)) { - int vector =3D v->arch.pending_external_vector; - - v->arch.pending_external_vector =3D -1; - return vector; - } else + if (pic_in_kernel(v->kvm)) return kvm_pic_read_irq(v->kvm); /* PIC */ + + WARN_ON_ONCE(!irqchip_split(v->kvm)); + return get_userspace_extint(v); } EXPORT_SYMBOL_GPL(kvm_cpu_get_extint); =20 --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BFB3C25B316 for ; Wed, 11 Jun 2025 21:36:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677786; cv=none; b=pmiRmYvGYn1DQmQYuqQxe0xn9w/nMV1hhPP9mra4TWwMOxWTee+ccMxw4WIwji9VbpgR3a3SoIqh9CBxax6JNkodUlVHPTIs8qmUiQFHq0kDYSHxS9/6mVsGjlMzsVfERehE7BQROccMqCog1/xlM2yAnPaqSog61BYV98FUeeA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677786; c=relaxed/simple; bh=sSXkJ0TZe+ygIMYoASgFqHZzpgqIcoACWrzJR/DJBLc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=CGEd0yqNktQW3r7Bem3EXfYMmAFbwf8Kqf2m68bqUvCRe0mlySQv1w8xDMc7X0tc2kuEfYMzzuLgNIKowRks0faJKYluLWYNcGkwDXb2pTIlO9XwHTsa0lAUixwO90GZPwXhT9Kdb4nOu+Ikhnui6W9cZoqnMiegCDs5Fs94DkQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=LrFJRpcU; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="LrFJRpcU" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-311ae2b6647so287513a91.0 for ; Wed, 11 Jun 2025 14:36:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677784; x=1750282584; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=JJ4icDH9pAHV3iqWVHA0f06vGLaBRGgQJvOqw3/pxTI=; b=LrFJRpcUJEADYUSmzPUn0YHMijlmTzB+/us70hmARmTBoahEhBFJTW1w6etwjiMEkv stJP4lF8oZChezcVx5oN7K2ku6f1wNWHwjUxAkNeROEKpb7tAqvflxI69wjp54cTwd6X ga7KcpDC9k6uF2/Snjb1x7D5JQtwpcoh6EkNbVWdd8wTOdEAdu/M72zgaSx92sypw/h2 3DHDGsMluHyawL/8y8qvX9+oNRgludIIJLAV53kB/n/Ewmeor+y3scGoVMROLAk6YkDy vlyinAD+gsZuJ6BE6wtzaIlFvRYNhbYhrcKdtULpf6veR4X4MSjwC5jkQYxRmzc84w38 cNvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677784; x=1750282584; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=JJ4icDH9pAHV3iqWVHA0f06vGLaBRGgQJvOqw3/pxTI=; b=m31YAQX8hxtpHIVzfbHDAzuqzytXMRY4dlddwh3aC8W9vL1CuRhDqPmGFZ2WECDfSY uCqdM7dSgwd1SYm8nuCVLXpR9hFuhsJvRbgYAnZFclHZz3n8LWPWA/g3dPIpVohVxm7c ZtxFzJ1twG0yAVATZUz3bqW27q07oCQz8yfJgaPrD0Wmuyav+wX0vHjb6yDbUhPqcLkT bMT5FFLYg2rFr2gQXTqg6xObGg5GpFROBkaxUyomDPdnDZNVfyx4yZsM4HbO67QDxBP2 QB5P3TrAkWRvu6Otjv2IDU2yO2V0u9WKG0+HkK5lFDwf3yiAWTM16wd/Uq63GFhT8faa kaXA== X-Forwarded-Encrypted: i=1; AJvYcCXeWvtyWvI2bV43jK0Z9o8fFt+YiJ17iY9fFQACcwbnCzUSBdgU6SfREaEVb6OsXK0y+aHZTIFyxyfdwQc=@vger.kernel.org X-Gm-Message-State: AOJu0YxUZy5V+taVLs0bg0P5AKkw7Be8nyKu77rf20s1IcYPyhMVYMjV vGHOq2NF4KtzpnPtQm0NeZ4PfB+oaO5Zq5KUURXdcRNgZbsuaJsdMGX52RQrv3OwtMQ2LTvQiX1 r6qb02g== X-Google-Smtp-Source: AGHT+IH2RdmBLZckAl0b1aVX3IeMbOtuIQc9imdRugK5KZRJRktWKbTEjRk/bYnXfpJGJM2fLWrWGj4vd8c= X-Received: from pjur7.prod.google.com ([2002:a17:90a:d407:b0:311:ea2a:3919]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3d87:b0:313:2adc:b4c4 with SMTP id 98e67ed59e1d1-313bfbdb37bmr1601072a91.24.1749677783899; Wed, 11 Jun 2025 14:36:23 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:52 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-14-seanjc@google.com> Subject: [PATCH v2 13/18] KVM: Move x86-only tracepoints to x86's trace.h From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the I/O APIC tracepoints and trace_kvm_msi_set_irq() to x86, as __KVM_HAVE_IOAPIC is just code for "x86", and trace_kvm_msi_set_irq() isn't unique to I/O APIC emulation. Opportunistically clean up the absurdly messy #includes in ioapic.c. No functional change intended. Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- arch/x86/kvm/ioapic.c | 2 +- arch/x86/kvm/irq_comm.c | 10 ++--- arch/x86/kvm/trace.h | 78 ++++++++++++++++++++++++++++++++++++++ include/trace/events/kvm.h | 77 ------------------------------------- 4 files changed, 82 insertions(+), 85 deletions(-) diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c index 65626da1407f..fa7481814bc6 100644 --- a/arch/x86/kvm/ioapic.c +++ b/arch/x86/kvm/ioapic.c @@ -41,11 +41,11 @@ #include #include #include -#include =20 #include "ioapic.h" #include "lapic.h" #include "irq.h" +#include "trace.h" =20 static int ioapic_service(struct kvm_ioapic *vioapic, int irq, bool line_status); diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c index 138c675dc24b..13d84c25e503 100644 --- a/arch/x86/kvm/irq_comm.c +++ b/arch/x86/kvm/irq_comm.c @@ -15,15 +15,11 @@ #include #include =20 -#include - -#include "irq.h" - +#include "hyperv.h" #include "ioapic.h" - +#include "irq.h" #include "lapic.h" - -#include "hyperv.h" +#include "trace.h" #include "x86.h" #include "xen.h" =20 diff --git a/arch/x86/kvm/trace.h b/arch/x86/kvm/trace.h index ba736cbb0587..4ef17990574d 100644 --- a/arch/x86/kvm/trace.h +++ b/arch/x86/kvm/trace.h @@ -260,6 +260,84 @@ TRACE_EVENT(kvm_cpuid, __entry->used_max_basic ? ", used max basic" : "") ); =20 +#define kvm_deliver_mode \ + {0x0, "Fixed"}, \ + {0x1, "LowPrio"}, \ + {0x2, "SMI"}, \ + {0x3, "Res3"}, \ + {0x4, "NMI"}, \ + {0x5, "INIT"}, \ + {0x6, "SIPI"}, \ + {0x7, "ExtINT"} + +TRACE_EVENT(kvm_ioapic_set_irq, + TP_PROTO(__u64 e, int pin, bool coalesced), + TP_ARGS(e, pin, coalesced), + + TP_STRUCT__entry( + __field( __u64, e ) + __field( int, pin ) + __field( bool, coalesced ) + ), + + TP_fast_assign( + __entry->e =3D e; + __entry->pin =3D pin; + __entry->coalesced =3D coalesced; + ), + + TP_printk("pin %u dst %x vec %u (%s|%s|%s%s)%s", + __entry->pin, (u8)(__entry->e >> 56), (u8)__entry->e, + __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode), + (__entry->e & (1<<11)) ? "logical" : "physical", + (__entry->e & (1<<15)) ? "level" : "edge", + (__entry->e & (1<<16)) ? "|masked" : "", + __entry->coalesced ? " (coalesced)" : "") +); + +TRACE_EVENT(kvm_ioapic_delayed_eoi_inj, + TP_PROTO(__u64 e), + TP_ARGS(e), + + TP_STRUCT__entry( + __field( __u64, e ) + ), + + TP_fast_assign( + __entry->e =3D e; + ), + + TP_printk("dst %x vec %u (%s|%s|%s%s)", + (u8)(__entry->e >> 56), (u8)__entry->e, + __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode), + (__entry->e & (1<<11)) ? "logical" : "physical", + (__entry->e & (1<<15)) ? "level" : "edge", + (__entry->e & (1<<16)) ? "|masked" : "") +); + +TRACE_EVENT(kvm_msi_set_irq, + TP_PROTO(__u64 address, __u64 data), + TP_ARGS(address, data), + + TP_STRUCT__entry( + __field( __u64, address ) + __field( __u64, data ) + ), + + TP_fast_assign( + __entry->address =3D address; + __entry->data =3D data; + ), + + TP_printk("dst %llx vec %u (%s|%s|%s%s)", + (u8)(__entry->address >> 12) | ((__entry->address >> 32) & 0xffffff00), + (u8)__entry->data, + __print_symbolic((__entry->data >> 8 & 0x7), kvm_deliver_mode), + (__entry->address & (1<<2)) ? "logical" : "physical", + (__entry->data & (1<<15)) ? "level" : "edge", + (__entry->address & (1<<3)) ? "|rh" : "") +); + #define AREG(x) { APIC_##x, "APIC_" #x } =20 #define kvm_trace_symbol_apic \ diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index fc7d0f8ff078..96e581900c8e 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h @@ -85,83 +85,6 @@ TRACE_EVENT(kvm_set_irq, #endif /* defined(CONFIG_HAVE_KVM_IRQCHIP) */ =20 #if defined(__KVM_HAVE_IOAPIC) -#define kvm_deliver_mode \ - {0x0, "Fixed"}, \ - {0x1, "LowPrio"}, \ - {0x2, "SMI"}, \ - {0x3, "Res3"}, \ - {0x4, "NMI"}, \ - {0x5, "INIT"}, \ - {0x6, "SIPI"}, \ - {0x7, "ExtINT"} - -TRACE_EVENT(kvm_ioapic_set_irq, - TP_PROTO(__u64 e, int pin, bool coalesced), - TP_ARGS(e, pin, coalesced), - - TP_STRUCT__entry( - __field( __u64, e ) - __field( int, pin ) - __field( bool, coalesced ) - ), - - TP_fast_assign( - __entry->e =3D e; - __entry->pin =3D pin; - __entry->coalesced =3D coalesced; - ), - - TP_printk("pin %u dst %x vec %u (%s|%s|%s%s)%s", - __entry->pin, (u8)(__entry->e >> 56), (u8)__entry->e, - __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode), - (__entry->e & (1<<11)) ? "logical" : "physical", - (__entry->e & (1<<15)) ? "level" : "edge", - (__entry->e & (1<<16)) ? "|masked" : "", - __entry->coalesced ? " (coalesced)" : "") -); - -TRACE_EVENT(kvm_ioapic_delayed_eoi_inj, - TP_PROTO(__u64 e), - TP_ARGS(e), - - TP_STRUCT__entry( - __field( __u64, e ) - ), - - TP_fast_assign( - __entry->e =3D e; - ), - - TP_printk("dst %x vec %u (%s|%s|%s%s)", - (u8)(__entry->e >> 56), (u8)__entry->e, - __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode), - (__entry->e & (1<<11)) ? "logical" : "physical", - (__entry->e & (1<<15)) ? "level" : "edge", - (__entry->e & (1<<16)) ? "|masked" : "") -); - -TRACE_EVENT(kvm_msi_set_irq, - TP_PROTO(__u64 address, __u64 data), - TP_ARGS(address, data), - - TP_STRUCT__entry( - __field( __u64, address ) - __field( __u64, data ) - ), - - TP_fast_assign( - __entry->address =3D address; - __entry->data =3D data; - ), - - TP_printk("dst %llx vec %u (%s|%s|%s%s)", - (u8)(__entry->address >> 12) | ((__entry->address >> 32) & 0xffffff00), - (u8)__entry->data, - __print_symbolic((__entry->data >> 8 & 0x7), kvm_deliver_mode), - (__entry->address & (1<<2)) ? "logical" : "physical", - (__entry->data & (1<<15)) ? "level" : "edge", - (__entry->address & (1<<3)) ? "|rh" : "") -); =20 #define kvm_irqchips \ {KVM_IRQCHIP_PIC_MASTER, "PIC master"}, \ --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6CAEC25C816 for ; Wed, 11 Jun 2025 21:36:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677788; cv=none; b=D0WYQdIHwPYqDqbT8JCS0vjml5RGaEgTrlzYqeGotNcTP1zKSgnY/r4cQojXuzXsotPcBiOwLAqsWHg45AuchEXVutBobPSKoWAa6Gl53ozDWZbJSScB7jev+zNCLkoWLsNpw6ZkLUvrQtYdKQa91cyyK729VZhz98phoJCy8SQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677788; c=relaxed/simple; bh=gAiOyGBDazVA/57ay8kWqpiCuGFe8WYLz5SPrNws7d8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=NmXoAvTDowx5+96zUVAL4l/BjpmQIq33ly/e7pQezEdTLXB/KnuZc0ZUfD04flTDwPCL2KkN3+ada5yVUltMw+WUvuZeeI/PpNYRRa1+LcPgG5DNy7JdbVtS096VmEN8ilbEue9TSo/TSF1c38PohAbYnsM2r2QuCoCkr2NLv4E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=rdF1ely2; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="rdF1ely2" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-31202bbaafaso247239a91.1 for ; Wed, 11 Jun 2025 14:36:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677786; x=1750282586; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=lfmQPMzSVsDo7Zoyui0jc0TkIPNEMYAlP9pV9h8hDXc=; b=rdF1ely2IKA+Zn2MsJH3x75pg/pbG9VuvTYd5a8uw8fG2HlWzyt10b1J0TSdZzLDev WZvkgZ4jLc8ZbYctdc3eWJnXI5azSBlhwcjgl82ea9d5S6cdd8IGR8Ch0tHssV8CuLsb 7Rs5oJ67778LDEiArIqBBkih+nAf7u6jIdJxtgNtg192DENXeCPaYlqkfd9IscSSsxxK jhDVvRGXWwSy/5IApiF7H7UIjDsg6Y0Ocy4aE8DhHwk/SX8+gH5dpCe87k/98JlkuC0R 8Mw/SUK78twT+kD9rWnOB0ZE5C09v2CRi8XL79WAgP7h7kLgu1PnkXP9Jyf8fl9eWIBk cpDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677786; x=1750282586; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=lfmQPMzSVsDo7Zoyui0jc0TkIPNEMYAlP9pV9h8hDXc=; b=lBD770WRTZ6OCGn4Eps6ixQNDX8+XYE1BZspWjs/MXIB6IHAU1Mg0M4Z3NvWRhxN3T vdZQV3Cz8dZ5/eOfuw7/GyfPzw62lqcKk0sBsO9SOp0VIUuhyut88UsFB04S/aj0SmXh Xkc5xWesCsAkrZ3Kdp7JLbRMbtyU5ZdHOWxjCB6xEyBVZDUvnlcx14OI8uEv99kELT9H 0IbdPqnE3r1Qkmf696sJFe4+2jmUv+g8bt5/TDKzHs/r/T/aMooehj6iPj5JFHtO1Xjp gS1LK/PAeAwImgQjN9oh0cSyId6lsc89XfiUYnh16Y/YDhjqZMtZf7GfZAKxW0oSoZhJ 354w== X-Forwarded-Encrypted: i=1; AJvYcCUMg20LAKliZb1KUq1VmhIySBmuPNKZZwU2NoZ9RQ1VdmBf/VXbT0U3dQgN3RASwHYWzaWGaHqnhjG/eiM=@vger.kernel.org X-Gm-Message-State: AOJu0YybTXLa4/9S2QbAEEQzWXzATXxWN4ZvR7yqPl6YKjRuRuh9LkEC glpE2wIUnFCcW10krur7cB6BD18pbbMZDyA0T0WReQevnirfOGft8ClFmfSCdFBKst57t1RzYPO LOJGVmg== X-Google-Smtp-Source: AGHT+IFJZse34GkBp2Np+0jzsDBv9GLpSMFW3pCuOtalBTnCB0ZQ3qdGdFbcXcU/88x11+qo8vzvraLe5ps= X-Received: from pjp5.prod.google.com ([2002:a17:90b:55c5:b0:301:1bf5:2f07]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2745:b0:311:a623:676c with SMTP id 98e67ed59e1d1-313c08c8b9amr815599a91.27.1749677785722; Wed, 11 Jun 2025 14:36:25 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:53 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-15-seanjc@google.com> Subject: [PATCH v2 14/18] KVM: x86: Add CONFIG_KVM_IOAPIC to allow disabling in-kernel I/O APIC From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a Kconfig to allow building KVM without support for emulating a I/O APIC, PIC, and PIT, which is desirable for deployments that effectively don't support a fully in-kernel IRQ chip, i.e. never expect any VMM to create an in-kernel I/O APIC. E.g. compiling out support eliminates a few thousand lines of guest-facing code and gives security folks warm fuzzies. As a bonus, wrapping relevant paths with CONFIG_KVM_IOAPIC #ifdefs makes it much easier for readers to understand which bits and pieces exist specifically for fully in-kernel IRQ chips. Opportunistically convert all two in-kernel uses of __KVM_HAVE_IOAPIC to CONFIG_KVM_IOAPIC, e.g. rather than add a second #ifdef to generate a stub for kvm_arch_post_irq_routing_update(). Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 2 ++ arch/x86/kvm/Kconfig | 10 ++++++++++ arch/x86/kvm/Makefile | 5 +++-- arch/x86/kvm/i8254.h | 2 ++ arch/x86/kvm/irq.c | 8 ++++++++ arch/x86/kvm/irq.h | 9 +++++++++ arch/x86/kvm/irq_comm.c | 2 ++ arch/x86/kvm/lapic.c | 7 ++++++- arch/x86/kvm/trace.h | 2 ++ arch/x86/kvm/x86.c | 22 ++++++++++++++++++---- include/linux/kvm_host.h | 2 +- include/trace/events/kvm.h | 4 ++-- 12 files changed, 65 insertions(+), 10 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index ebda93979179..f5ff5174674c 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1374,9 +1374,11 @@ struct kvm_arch { atomic_t noncoherent_dma_count; #define __KVM_HAVE_ARCH_ASSIGNED_DEVICE atomic_t assigned_device_count; +#ifdef CONFIG_KVM_IOAPIC struct kvm_pic *vpic; struct kvm_ioapic *vioapic; struct kvm_pit *vpit; +#endif atomic_t vapics_in_nmi_mode; struct mutex apic_map_lock; struct kvm_apic_map __rcu *apic_map; diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 2eeffcec5382..2c86673155c9 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -166,6 +166,16 @@ config KVM_AMD_SEV Encrypted State (SEV-ES), and Secure Encrypted Virtualization with Secure Nested Paging (SEV-SNP) technologies on AMD processors. =20 +config KVM_IOAPIC + bool "I/O APIC, PIC, and PIT emulation" + default y + depends on KVM + help + Provides support for KVM to emulate an I/O APIC, PIC, and PIT, i.e. + for full in-kernel APIC emulation. + + If unsure, say Y. + config KVM_SMM bool "System Management Mode emulation" default y diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile index a5d362c7b504..92c737257789 100644 --- a/arch/x86/kvm/Makefile +++ b/arch/x86/kvm/Makefile @@ -5,12 +5,13 @@ ccflags-$(CONFIG_KVM_WERROR) +=3D -Werror =20 include $(srctree)/virt/kvm/Makefile.kvm =20 -kvm-y +=3D x86.o emulate.o i8259.o irq.o lapic.o \ - i8254.o ioapic.o irq_comm.o cpuid.o pmu.o mtrr.o \ +kvm-y +=3D x86.o emulate.o irq.o lapic.o \ + irq_comm.o cpuid.o pmu.o mtrr.o \ debugfs.o mmu/mmu.o mmu/page_track.o \ mmu/spte.o =20 kvm-$(CONFIG_X86_64) +=3D mmu/tdp_iter.o mmu/tdp_mmu.o +kvm-$(CONFIG_KVM_IOAPIC) +=3D i8259.o i8254.o ioapic.o kvm-$(CONFIG_KVM_HYPERV) +=3D hyperv.o kvm-$(CONFIG_KVM_XEN) +=3D xen.o kvm-$(CONFIG_KVM_SMM) +=3D smm.o diff --git a/arch/x86/kvm/i8254.h b/arch/x86/kvm/i8254.h index b9c1feb379a7..e8bd59ad8a7c 100644 --- a/arch/x86/kvm/i8254.h +++ b/arch/x86/kvm/i8254.h @@ -8,6 +8,7 @@ =20 #include =20 +#ifdef CONFIG_KVM_IOAPIC struct kvm_kpit_channel_state { u32 count; /* can be 65536 */ u16 latched_count; @@ -64,5 +65,6 @@ int kvm_vm_ioctl_reinject(struct kvm *kvm, struct kvm_rei= nject_control *control) =20 struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags); void kvm_free_pit(struct kvm *kvm); +#endif /* CONFIG_KVM_IOAPIC */ =20 #endif diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c index fb3bad0f4965..4c219e9f52b0 100644 --- a/arch/x86/kvm/irq.c +++ b/arch/x86/kvm/irq.c @@ -76,8 +76,10 @@ int kvm_cpu_has_extint(struct kvm_vcpu *v) if (!kvm_apic_accept_pic_intr(v)) return 0; =20 +#ifdef CONFIG_KVM_IOAPIC if (pic_in_kernel(v->kvm)) return v->kvm->arch.vpic->output; +#endif =20 WARN_ON_ONCE(!irqchip_split(v->kvm)); return pending_userspace_extint(v); @@ -136,8 +138,10 @@ int kvm_cpu_get_extint(struct kvm_vcpu *v) return v->kvm->arch.xen.upcall_vector; #endif =20 +#ifdef CONFIG_KVM_IOAPIC if (pic_in_kernel(v->kvm)) return kvm_pic_read_irq(v->kvm); /* PIC */ +#endif =20 WARN_ON_ONCE(!irqchip_split(v->kvm)); return get_userspace_extint(v); @@ -171,7 +175,9 @@ void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcp= u) void __kvm_migrate_timers(struct kvm_vcpu *vcpu) { __kvm_migrate_apic_timer(vcpu); +#ifdef CONFIG_KVM_IOAPIC __kvm_migrate_pit_timer(vcpu); +#endif kvm_x86_call(migrate_timers)(vcpu); } =20 @@ -187,6 +193,7 @@ bool kvm_arch_irqchip_in_kernel(struct kvm *kvm) return irqchip_in_kernel(kvm); } =20 +#ifdef CONFIG_KVM_IOAPIC #define IOAPIC_ROUTING_ENTRY(irq) \ { .gsi =3D irq, .type =3D KVM_IRQ_ROUTING_IRQCHIP, \ .u.irqchip =3D { .irqchip =3D KVM_IRQCHIP_IOAPIC, .pin =3D (irq) } } @@ -273,3 +280,4 @@ int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kv= m_irqchip *chip) kvm_pic_update_irq(pic); return r; } +#endif diff --git a/arch/x86/kvm/irq.h b/arch/x86/kvm/irq.h index 7b8b54462f95..5e62c1f79ce6 100644 --- a/arch/x86/kvm/irq.h +++ b/arch/x86/kvm/irq.h @@ -18,6 +18,8 @@ #include #include "lapic.h" =20 +#ifdef CONFIG_KVM_IOAPIC + #define PIC_NUM_PINS 16 #define SELECT_PIC(irq) \ ((irq) < 8 ? KVM_IRQCHIP_PIC_MASTER : KVM_IRQCHIP_PIC_SLAVE) @@ -79,12 +81,19 @@ static inline int irqchip_full(struct kvm *kvm) smp_rmb(); return mode =3D=3D KVM_IRQCHIP_KERNEL; } +#else /* CONFIG_KVM_IOAPIC */ +static __always_inline int irqchip_full(struct kvm *kvm) +{ + return false; +} +#endif =20 static inline int pic_in_kernel(struct kvm *kvm) { return irqchip_full(kvm); } =20 + static inline int irqchip_split(struct kvm *kvm) { int mode =3D kvm->arch.irqchip_mode; diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c index 13d84c25e503..14fc8db0206c 100644 --- a/arch/x86/kvm/irq_comm.c +++ b/arch/x86/kvm/irq_comm.c @@ -208,6 +208,7 @@ int kvm_set_routing_entry(struct kvm *kvm, * check kvm_arch_can_set_irq_routing() before calling this function. */ switch (ue->type) { +#ifdef CONFIG_KVM_IOAPIC case KVM_IRQ_ROUTING_IRQCHIP: if (irqchip_split(kvm)) return -EINVAL; @@ -231,6 +232,7 @@ int kvm_set_routing_entry(struct kvm *kvm, } e->irqchip.irqchip =3D ue->u.irqchip.irqchip; break; +#endif case KVM_IRQ_ROUTING_MSI: e->set =3D kvm_set_msi; e->msi.address_lo =3D ue->u.msi.address_lo; diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 73418dc0ebb2..4cf8c1f753d3 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -1455,7 +1455,7 @@ static bool kvm_ioapic_handles_vector(struct kvm_lapi= c *apic, int vector) =20 static void kvm_ioapic_send_eoi(struct kvm_lapic *apic, int vector) { - int trigger_mode; + int __maybe_unused trigger_mode; =20 /* Eoi the ioapic only if the ioapic doesn't own the vector. */ if (!kvm_ioapic_handles_vector(apic, vector)) @@ -1476,12 +1476,14 @@ static void kvm_ioapic_send_eoi(struct kvm_lapic *a= pic, int vector) return; } =20 +#ifdef CONFIG_KVM_IOAPIC if (apic_test_vector(vector, apic->regs + APIC_TMR)) trigger_mode =3D IOAPIC_LEVEL_TRIG; else trigger_mode =3D IOAPIC_EDGE_TRIG; =20 kvm_ioapic_update_eoi(apic->vcpu, vector, trigger_mode); +#endif } =20 static int apic_set_eoi(struct kvm_lapic *apic) @@ -3146,8 +3148,11 @@ int kvm_apic_set_state(struct kvm_vcpu *vcpu, struct= kvm_lapic_state *s) kvm_x86_call(hwapic_isr_update)(vcpu, apic_find_highest_isr(apic)); } kvm_make_request(KVM_REQ_EVENT, vcpu); + +#ifdef CONFIG_KVM_IOAPIC if (ioapic_in_kernel(vcpu->kvm)) kvm_rtc_eoi_tracking_restore_one(vcpu); +#endif =20 vcpu->arch.apic_arb_prio =3D 0; =20 diff --git a/arch/x86/kvm/trace.h b/arch/x86/kvm/trace.h index 4ef17990574d..ababdba2c186 100644 --- a/arch/x86/kvm/trace.h +++ b/arch/x86/kvm/trace.h @@ -270,6 +270,7 @@ TRACE_EVENT(kvm_cpuid, {0x6, "SIPI"}, \ {0x7, "ExtINT"} =20 +#ifdef CONFIG_KVM_IOAPIC TRACE_EVENT(kvm_ioapic_set_irq, TP_PROTO(__u64 e, int pin, bool coalesced), TP_ARGS(e, pin, coalesced), @@ -314,6 +315,7 @@ TRACE_EVENT(kvm_ioapic_delayed_eoi_inj, (__entry->e & (1<<15)) ? "level" : "edge", (__entry->e & (1<<16)) ? "|masked" : "") ); +#endif =20 TRACE_EVENT(kvm_msi_set_irq, TP_PROTO(__u64 address, __u64 data), diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 115405f496ef..a39babc32a6a 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -4632,17 +4632,20 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, l= ong ext) case KVM_CAP_EXT_CPUID: case KVM_CAP_EXT_EMUL_CPUID: case KVM_CAP_CLOCKSOURCE: +#ifdef CONFIG_KVM_IOAPIC case KVM_CAP_PIT: + case KVM_CAP_PIT2: + case KVM_CAP_PIT_STATE2: + case KVM_CAP_REINJECT_CONTROL: +#endif case KVM_CAP_NOP_IO_DELAY: case KVM_CAP_MP_STATE: case KVM_CAP_SYNC_MMU: case KVM_CAP_USER_NMI: - case KVM_CAP_REINJECT_CONTROL: case KVM_CAP_IRQ_INJECT_STATUS: case KVM_CAP_IOEVENTFD: case KVM_CAP_IOEVENTFD_NO_LENGTH: - case KVM_CAP_PIT2: - case KVM_CAP_PIT_STATE2: + case KVM_CAP_SET_IDENTITY_MAP_ADDR: case KVM_CAP_VCPU_EVENTS: #ifdef CONFIG_KVM_HYPERV @@ -6937,9 +6940,11 @@ int kvm_arch_vm_ioctl(struct file *filp, unsigned in= t ioctl, unsigned long arg) struct kvm *kvm =3D filp->private_data; void __user *argp =3D (void __user *)arg; int r =3D -ENOTTY; + +#ifdef CONFIG_KVM_IOAPIC /* * This union makes it completely explicit to gcc-3.x - * that these two variables' stack usage should be + * that these three variables' stack usage should be * combined, not added together. */ union { @@ -6947,6 +6952,7 @@ int kvm_arch_vm_ioctl(struct file *filp, unsigned int= ioctl, unsigned long arg) struct kvm_pit_state2 ps2; struct kvm_pit_config pit_config; } u; +#endif =20 switch (ioctl) { case KVM_SET_TSS_ADDR: @@ -6970,6 +6976,7 @@ int kvm_arch_vm_ioctl(struct file *filp, unsigned int= ioctl, unsigned long arg) case KVM_SET_NR_MMU_PAGES: r =3D kvm_vm_ioctl_set_nr_mmu_pages(kvm, arg); break; +#ifdef CONFIG_KVM_IOAPIC case KVM_CREATE_IRQCHIP: { mutex_lock(&kvm->lock); =20 @@ -7136,6 +7143,7 @@ int kvm_arch_vm_ioctl(struct file *filp, unsigned int= ioctl, unsigned long arg) r =3D kvm_vm_ioctl_reinject(kvm, &control); break; } +#endif case KVM_SET_BOOT_CPU_ID: r =3D 0; mutex_lock(&kvm->lock); @@ -10595,8 +10603,10 @@ static void vcpu_scan_ioapic(struct kvm_vcpu *vcpu) =20 if (irqchip_split(vcpu->kvm)) kvm_scan_ioapic_routes(vcpu, vcpu->arch.ioapic_handled_vectors); +#ifdef CONFIG_KVM_IOAPIC else if (ioapic_in_kernel(vcpu->kvm)) kvm_ioapic_scan_entry(vcpu, vcpu->arch.ioapic_handled_vectors); +#endif =20 if (is_guest_mode(vcpu)) vcpu->arch.load_eoi_exitmap_pending =3D true; @@ -12799,7 +12809,9 @@ void kvm_arch_pre_destroy_vm(struct kvm *kvm) cancel_delayed_work_sync(&kvm->arch.kvmclock_sync_work); cancel_delayed_work_sync(&kvm->arch.kvmclock_update_work); =20 +#ifdef CONFIG_KVM_IOAPIC kvm_free_pit(kvm); +#endif =20 kvm_mmu_pre_destroy_vm(kvm); static_call_cond(kvm_x86_vm_pre_destroy)(kvm); @@ -12823,8 +12835,10 @@ void kvm_arch_destroy_vm(struct kvm *kvm) } kvm_destroy_vcpus(kvm); kvm_free_msr_filter(srcu_dereference_check(kvm->arch.msr_filter, &kvm->sr= cu, 1)); +#ifdef CONFIG_KVM_IOAPIC kvm_pic_destroy(kvm); kvm_ioapic_destroy(kvm); +#endif kvfree(rcu_dereference_check(kvm->arch.apic_map, 1)); kfree(srcu_dereference_check(kvm->arch.pmu_event_filter, &kvm->srcu, 1)); kvm_mmu_uninit_vm(kvm); diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 4ff5ea29e343..3b5575d0b574 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1023,7 +1023,7 @@ void kvm_unlock_all_vcpus(struct kvm *kvm); void vcpu_load(struct kvm_vcpu *vcpu); void vcpu_put(struct kvm_vcpu *vcpu); =20 -#ifdef __KVM_HAVE_IOAPIC +#ifdef CONFIG_KVM_IOAPIC void kvm_arch_post_irq_ack_notifier_list_update(struct kvm *kvm); #else static inline void kvm_arch_post_irq_ack_notifier_list_update(struct kvm *= kvm) diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index 96e581900c8e..1065a81ca57f 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h @@ -84,14 +84,14 @@ TRACE_EVENT(kvm_set_irq, ); #endif /* defined(CONFIG_HAVE_KVM_IRQCHIP) */ =20 -#if defined(__KVM_HAVE_IOAPIC) +#ifdef CONFIG_KVM_IOAPIC =20 #define kvm_irqchips \ {KVM_IRQCHIP_PIC_MASTER, "PIC master"}, \ {KVM_IRQCHIP_PIC_SLAVE, "PIC slave"}, \ {KVM_IRQCHIP_IOAPIC, "IOAPIC"} =20 -#endif /* defined(__KVM_HAVE_IOAPIC) */ +#endif /* CONFIG_KVM_IOAPIC */ =20 #if defined(CONFIG_HAVE_KVM_IRQCHIP) =20 --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DFA4F25D1FC for ; Wed, 11 Jun 2025 21:36:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677790; cv=none; b=Q24PKtVnNLxkx6VYLbnUmyphxeW7TKlzkNDVnhC4cUzBiEPevsYH3GGg4ZCzN81Wg1RZPMOGEpRNgIDYW7eC9Y5mif9BJdfT2s6J8zWxE4azqO6UmnWtGEtChKATjVWU1A1kbVk+HXsWuE2j6oB36Q/rSrFm+7iDmbzfAEu/Rm8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677790; c=relaxed/simple; bh=pbzjMkYafGxcpLXLqdeS1eEDP6kDrKXYmWNpHPn0xGQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Yf6culoWvteGwKa3KcSlkA7baPKHJaF7aJifLaFuhDh30Vpz/Srh2HLYQ6XOibMb7jWVlhfawD5r0axWjSwNE4iGFkxmkDhuBr1Me+JIhwF/5CG1uJDrZ7Zb/KnhoqC4S8v86m3OK2ZLVv2YPJBmeSgkajziyo2gZQG12vb2oXk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=LkY8ERvl; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="LkY8ERvl" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-31366819969so257427a91.0 for ; Wed, 11 Jun 2025 14:36:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677787; x=1750282587; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=Xzs0IiSJuwZzmnPBx3wmk+iVHWs9BLQaD0Cp4OIfdsI=; b=LkY8ERvlf3FnZ8ZUvjDgJuiVI4mII6ZvPbVgYoKvAr53Gr9Pf7Fbu4IaTCOkveE6v1 RoWHSaNfkg9VUbYRIzVdtCzBHQ1Ew4hUTjeYNJ5X7PjFdyGkrvYsuTpxLgNjujWaq13X OnJk+ChHut6rduvNGeqep8UGAaXpLYzLFiAiHfL6TmC39FEz0vlFcKROeELyyapGJlBW bAWUDauTVck17KkkApFtxODVrV4FMG0WAIUqJA9TUyaaK0OmIWHV0THMCnvabHDikuZw WyHwnIKYlWzUlUHA1tFGNz3yHnUYrnq4n6M3LwKVXnYqjL5VLfyorYCcdbE1CXdO0n2V OKuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677787; x=1750282587; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Xzs0IiSJuwZzmnPBx3wmk+iVHWs9BLQaD0Cp4OIfdsI=; b=O4B+SMXUqMMxFIaOkE4CrMlhwXqYem1h79x8/24cLM9AGwNnScb38FvlKVhBpB67ZE AHhv8qvSjSVCWzwd2aq3pSb94wSE3kddxW1zYZwuvoDLf1V5YCkP+UTaBUo0/2PcE1zt H7gxpH1cvH4V2Zp/GEEolZ5hMOWwFcLp2/FbRoDmI7H8UjMpgoNZD7vPONYqViiGS181 zG/8vs+erLL9ZVPSx+06ZTZPG2WDeCjXZUfjlZYEvDL55MZOLg2B6SoKxDlSTsq0b9sS 3tzGewK498hEaRlCGgfvc06xHi9E65cNkWZx4EvnFfSrm9d7ak6+ZkL//NzDwSOLvVMV f/QA== X-Forwarded-Encrypted: i=1; AJvYcCV3FZT7nA7jeVVa8Lqqa0aAU6qDbE+48sTSmmrud1/Jx/omm511i1JAKET28cSf85Mma4aXK1nl8jK9AJI=@vger.kernel.org X-Gm-Message-State: AOJu0YzNFxlWNiIzXeHy86mT0HdP2w+kD9uS8AwTIvFlBdYR8GHf4nQB KkQOWG0c8yuEMTyEafhZEPaDnbp62gMdQykjKsHLZtrRiToJmUyfRNQlb2ZAQvz74rujV9/Ll7j ltetNTQ== X-Google-Smtp-Source: AGHT+IHIvhKkqqWWcEQHXFR65K8FZLh/xEt/zChKvBvk4uS5J2RIxt1u9I6b9xAUE+S9NBqKiPkCbq7uF9c= X-Received: from pjv12.prod.google.com ([2002:a17:90b:564c:b0:313:2b27:3f90]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4a8f:b0:311:ed2:b758 with SMTP id 98e67ed59e1d1-313af0fd2c3mr5826535a91.3.1749677787281; Wed, 11 Jun 2025 14:36:27 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:54 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-16-seanjc@google.com> Subject: [PATCH v2 15/18] KVM: Squash two CONFIG_HAVE_KVM_IRQCHIP #ifdefs into one From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Squash two #idef CONFIG_HAVE_KVM_IRQCHIP regions in KVM's trace events, as the only code outside of the #idefs depends on CONFIG_KVM_IOAPIC, and that Kconfig only exists for x86, which unconditionally selects HAVE_KVM_IRQCHIP. No functional change intended. Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- include/trace/events/kvm.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index 1065a81ca57f..0b6b79b1a1bc 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h @@ -82,7 +82,6 @@ TRACE_EVENT(kvm_set_irq, TP_printk("gsi %u level %d source %d", __entry->gsi, __entry->level, __entry->irq_source_id) ); -#endif /* defined(CONFIG_HAVE_KVM_IRQCHIP) */ =20 #ifdef CONFIG_KVM_IOAPIC =20 @@ -93,8 +92,6 @@ TRACE_EVENT(kvm_set_irq, =20 #endif /* CONFIG_KVM_IOAPIC */ =20 -#if defined(CONFIG_HAVE_KVM_IRQCHIP) - #ifdef kvm_irqchips #define kvm_ack_irq_string "irqchip %s pin %u" #define kvm_ack_irq_parm __print_symbolic(__entry->irqchip, kvm_irqchips)= , __entry->pin --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8030425DCF6 for ; Wed, 11 Jun 2025 21:36:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677791; cv=none; b=MyrPqzCBYHWNIdxTmBSEc7v3Y7w3NrmNzZsxLqMP0DlVRC7oobflLpO/VG1tGRNQmjJyX4SGZW4hqjjswnXIkWV0uFc+91ZryULhYbFq6w8avPb6AJomIMxeb1PzcEqlxDjtq4F1e/4lH00uupHHw4CFLfc8M1UtzfrkRWPpK9o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677791; c=relaxed/simple; bh=npPjU5eEGnuKsT0xEaMcH1B9YlxW36/8MC9u3V1VB0o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=hGXXNmSqR2WQ7Tw0SVMJbYlnXQt1RaSZ9vLQu+kM3G+UhyJgoUF8ry1pBK2oU04JCN/K75Fw7oDI3Pf8Xz+JQ3PuU104jI98e6dMtGXy7Qwo424tu8Iet2+Hmwnpf/ZLn1GBr9yaPvuPPPV7S1BYivPOKmpzh5QfYAB9P/0EO8U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=scnox8Tw; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="scnox8Tw" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b2c36d3f884so124209a12.2 for ; Wed, 11 Jun 2025 14:36:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677789; x=1750282589; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=0cQC/hkOLEWlnfZsN0A9UKbPGQtORyJ4/5SEvQ1tLM4=; b=scnox8TwtuU3aC+ZpJwAqGDq3SqpyrUhIa5Ek0jpx6jbytTlVMrSmUyhycqz98+UYS Q0ruCdOmwsxghoFTG4cuK4/mEinV5JEP72ukupZfPqpN17snCcFf9Q6eQyTa/rXrmKM9 F9hd2YSTgK1feLZa2N2zz6Bv866iLTC+pwC1EqldR2avrNNny/mmIpYyZqwf9ieFaoKp QUhedXefmTbHdd+EN4r+ruh3wpse2SJXLsk0e/9Z2pwvSKymzFuugeOQ8vC9UBlGrfdg Dq5MQ9ZoMWUztrTqNt8fImcVxPHn/Gke0u8Tg0pOG/xnBGQFwIiuAp+SkbSSO7zvtYdq JCmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677789; x=1750282589; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=0cQC/hkOLEWlnfZsN0A9UKbPGQtORyJ4/5SEvQ1tLM4=; b=pPVPF4i0Mz9doLVhnMqhUfFIpMkoxFqFT2pl8MW9PnI6C4REpybpy2cYM0VLBeTx4U 9mHmV7bhG/NTfqdio7Pbw6mmffg+OIYjvctt8Zht7MWTlJe4B5n+J/ogDux7+024cAqC xfNz5uJXXK6fjwLgAeT/YioTkLF6hyp4TrG7StlgQuD/94Tlg8CcS/7zdlcamqwJDPT0 Eyox2Z7PLSXwhD2NgLkIn8JG1H22rrfTP5vjS9aXiwOcYGh3J3bRY87YHONYloZhka6K vnDT9w4HhiuycoXXICEFXxdy0qCFyKZ+o1V6LufkJkZBr1njn/j9/iElD5POHfL1Bnh0 T9Ow== X-Forwarded-Encrypted: i=1; AJvYcCW4ViCVBs7NqaOrG0fC84MZYykwCv1uGXL6LuoZuLPF3fHbr5gDBLZJI2wCssQCPcCIUKlOnnyiQQqBhrU=@vger.kernel.org X-Gm-Message-State: AOJu0YwI+TkFw6foHl9gHetyGcDgtowd+jz0cm/nFwnFs/PYJH6qL/SQ 5s0ELGrISaHg/NYJT7wL2CslQat1+dA0N4uoRu47bNH1J7y7RZebZhCeKk/YKk53SH3gJSpJFdI OCicCNQ== X-Google-Smtp-Source: AGHT+IHKomR4o60NTzsrusMmg+bCGTRAszO7F/K0fCz4Tv+qh1wlC/LNy7j0ZhMaZ9VffDciXgTipqOz6Do= X-Received: from pgls10.prod.google.com ([2002:a63:524a:0:b0:b2e:beba:356]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:729e:b0:204:695f:47e1 with SMTP id adf61e73a8af0-21f978a5ca6mr1864502637.23.1749677788807; Wed, 11 Jun 2025 14:36:28 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:55 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-17-seanjc@google.com> Subject: [PATCH v2 16/18] KVM: selftests: Fall back to split IRQ chip if full in-kernel chip is unsupported From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that KVM x86 allows compiling out support for in-kernel I/O APIC (and PIC and PIT) emulation, i.e. allows disabling KVM_CREATE_IRQCHIP for all intents and purposes, fall back to a split IRQ chip for x86 if creating the full in-kernel version fails with ENOTTY. Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/lib/kvm_util.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index a055343a7bf7..93a921deeb99 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1716,7 +1716,18 @@ void *addr_gpa2alias(struct kvm_vm *vm, vm_paddr_t g= pa) /* Create an interrupt controller chip for the specified VM. */ void vm_create_irqchip(struct kvm_vm *vm) { - vm_ioctl(vm, KVM_CREATE_IRQCHIP, NULL); + int r; + + /* + * Allocate a fully in-kernel IRQ chip by default, but fall back to a + * split model (x86 only) if that fails (KVM x86 allows compiling out + * support for KVM_CREATE_IRQCHIP). + */ + r =3D __vm_ioctl(vm, KVM_CREATE_IRQCHIP, NULL); + if (r && errno =3D=3D ENOTTY && kvm_has_cap(KVM_CAP_SPLIT_IRQCHIP)) + vm_enable_cap(vm, KVM_CAP_SPLIT_IRQCHIP, 24); + else + TEST_ASSERT_VM_VCPU_IOCTL(!r, KVM_CREATE_IRQCHIP, r, vm); =20 vm->has_irqchip =3D true; } --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 28E8925EF93 for ; Wed, 11 Jun 2025 21:36:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677792; cv=none; b=AVTtUZdcEeDYPyc9Yw46kLnZs8DJe7dDAkFZzLJos0Dc4Sw5nei0dSTO0ylygU+5b8ncAsXwr2WEj/iS+HrVkP3AZC3ka+wndcQOKi5erltr5y/2XICaJ9XpREx3G04IUYCjzBPw6XWZ3sB2iCBCLFknWHG+1bYvpusEGyF+zDA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677792; c=relaxed/simple; bh=UW/uvryfcoYKLgUyl50A/XgEdMtEQO2H+FcIsqMZYE4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=NGtaHL8FmaUamIzlePAynS4c3z0xwhdUnNpsiYOynwGPQHjR+VnWvyrYJlQaThy9aFh213uZ4bHzSJv920cNSHMn8wCVP5uvCeCJhcD++p4lZhLrVigWcCSk6OOy0IXL8KtZd1HSWWS/xTjYZ7hP2qvuztpSuGEGmOUqt2j64ro= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=YYe7GXYL; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="YYe7GXYL" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-747dd44048cso250180b3a.3 for ; Wed, 11 Jun 2025 14:36:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677790; x=1750282590; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=7K1mqWB732JikqOweFoR2E3lczFj+uEntOhDuHKFp5M=; b=YYe7GXYLGSGBb5YjLiL3irKtydOhkgnNL+QH80xAiH/VFOv1oae6gCcefDjKzkxGgM cu9lmmi0ijmTGx7n3pOwfiZvPzHwqTPRg0/+AI2LePHJ7pBUSzETecZqGjlISEspRU/e i/nmsSoSYyGOMXHfW6cJXZcBGNcAPY41BDMKhqazrcw/iEtKXJ3/pA9gGX7PbYNUuY4P dibnb2upeUKcGz6QllCUXceJGZ0m5ToacyPQp5f7CITt+mwcCKUEJtGcqTJ0mvpEroFy vTVX1T7UAD0qec84EpB+4oElLzrjmUEk5XtJRxLjhu424sjKpnDBGFsh+44FISWxU6Qv 5LJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677790; x=1750282590; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=7K1mqWB732JikqOweFoR2E3lczFj+uEntOhDuHKFp5M=; b=sh9H8xfD5jFG593bgHIjr3qMgcUGr0NXFfcsKp4M0xCUSLLf/nmJ1OMtZpayH+rtKW kMsFNkKVSspy+dvXX6KnCJEcV67kOSRQmWFjBjxaiFsNJxJKiKBCc4f7TYT+0Tz3XH0b kyiw79tFls9ue+IiXT0yNxvVDvCkzufYCfeU9zB6/MNEPjisXYzywSh5mB/iJoO0NhQU jd5OFDTmmvsn/FBLZ8g/f+xNI4QqjKt/WM28pgqcA8tEEPQ/x5uEsIJcmpqUYibhKeXW P6Sk7KY3GSKIFb2KO/P+2G5fIVvvoDNCIjtfE6t1GrB7lZXLQvhSHu2RcYY+HxsWqkF9 oNRw== X-Forwarded-Encrypted: i=1; AJvYcCUdyNSCsA4GfGlVqtdXpWBn/5oVKd42mzF+m4/1DqUFIL6wnTPMxQb0f4YGX0snFVtdyu/lV/l7tRgCtrg=@vger.kernel.org X-Gm-Message-State: AOJu0YwkAc8B0v1wS1v5aSzBya+H1jKlirI5/l3D5nnBsFOpJG3KqPKn yzb1JPtgRrNjWS/0Asrq/SxqF9mAcqqKHTzw6jUZ8ROERoSzDurEbrBc1r3kJo3Ui3cnKuDqYcV XaqDQng== X-Google-Smtp-Source: AGHT+IF0AJp5zjM7O+4DgfrWlRKKJZ+9D1xF1XIaVW6Enm2otYNjDmEPFy0oaFaD5MAoVWU9l7pbSr8txmA= X-Received: from pfxx12.prod.google.com ([2002:a05:6a00:10c:b0:746:fd4c:1fcf]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3925:b0:748:323f:ba21 with SMTP id d2e1a72fcca58-7487bfe8a14mr1415018b3a.1.1749677790486; Wed, 11 Jun 2025 14:36:30 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:56 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-18-seanjc@google.com> Subject: [PATCH v2 17/18] KVM: x86: Move IRQ mask notifier infrastructure to I/O APIC emulation From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the IRQ mask logic to ioapic.c as KVM's only user is its in-kernel I/O APIC emulation. In addition to encapsulating more I/O APIC specific code, trimming down irq_comm.c helps pave the way for removing it entirely. Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 16 -------------- arch/x86/kvm/i8254.h | 2 ++ arch/x86/kvm/i8259.c | 2 ++ arch/x86/kvm/ioapic.c | 37 +++++++++++++++++++++++++++++++++ arch/x86/kvm/ioapic.h | 16 ++++++++++++++ arch/x86/kvm/irq_comm.c | 33 ----------------------------- arch/x86/kvm/x86.c | 1 - 7 files changed, 57 insertions(+), 50 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index f5ff5174674c..21ccb122ab76 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1426,9 +1426,6 @@ struct kvm_arch { struct delayed_work kvmclock_update_work; struct delayed_work kvmclock_sync_work; =20 - /* reads protected by irq_srcu, writes by irq_lock */ - struct hlist_head mask_notifier_list; - #ifdef CONFIG_KVM_HYPERV struct kvm_hv hyperv; #endif @@ -2038,19 +2035,6 @@ int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long= cr3); int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa, const void *val, int bytes); =20 -struct kvm_irq_mask_notifier { - void (*func)(struct kvm_irq_mask_notifier *kimn, bool masked); - int irq; - struct hlist_node link; -}; - -void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq, - struct kvm_irq_mask_notifier *kimn); -void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, - struct kvm_irq_mask_notifier *kimn); -void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned p= in, - bool mask); - extern bool tdp_enabled; =20 u64 vcpu_tsc_khz(struct kvm_vcpu *vcpu); diff --git a/arch/x86/kvm/i8254.h b/arch/x86/kvm/i8254.h index e8bd59ad8a7c..60fa499d2f8a 100644 --- a/arch/x86/kvm/i8254.h +++ b/arch/x86/kvm/i8254.h @@ -8,6 +8,8 @@ =20 #include =20 +#include "ioapic.h" + #ifdef CONFIG_KVM_IOAPIC struct kvm_kpit_channel_state { u32 count; /* can be 65536 */ diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index 4de055efc4ee..2ac7f1678c46 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c @@ -31,6 +31,8 @@ #include #include #include + +#include "ioapic.h" #include "irq.h" =20 #include diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c index fa7481814bc6..2b5d389bca5f 100644 --- a/arch/x86/kvm/ioapic.c +++ b/arch/x86/kvm/ioapic.c @@ -310,6 +310,42 @@ void kvm_arch_post_irq_ack_notifier_list_update(struct= kvm *kvm) kvm_make_scan_ioapic_request(kvm); } =20 +void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq, + struct kvm_irq_mask_notifier *kimn) +{ + struct kvm_ioapic *ioapic =3D kvm->arch.vioapic; + + mutex_lock(&kvm->irq_lock); + kimn->irq =3D irq; + hlist_add_head_rcu(&kimn->link, &ioapic->mask_notifier_list); + mutex_unlock(&kvm->irq_lock); +} + +void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, + struct kvm_irq_mask_notifier *kimn) +{ + mutex_lock(&kvm->irq_lock); + hlist_del_rcu(&kimn->link); + mutex_unlock(&kvm->irq_lock); + synchronize_srcu(&kvm->irq_srcu); +} + +void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned p= in, + bool mask) +{ + struct kvm_ioapic *ioapic =3D kvm->arch.vioapic; + struct kvm_irq_mask_notifier *kimn; + int idx, gsi; + + idx =3D srcu_read_lock(&kvm->irq_srcu); + gsi =3D kvm_irq_map_chip_pin(kvm, irqchip, pin); + if (gsi !=3D -1) + hlist_for_each_entry_rcu(kimn, &ioapic->mask_notifier_list, link) + if (kimn->irq =3D=3D gsi) + kimn->func(kimn, mask); + srcu_read_unlock(&kvm->irq_srcu, idx); +} + static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) { unsigned index; @@ -710,6 +746,7 @@ int kvm_ioapic_init(struct kvm *kvm) return -ENOMEM; spin_lock_init(&ioapic->lock); INIT_DELAYED_WORK(&ioapic->eoi_inject, kvm_ioapic_eoi_inject_work); + INIT_HLIST_HEAD(&ioapic->mask_notifier_list); kvm->arch.vioapic =3D ioapic; kvm_ioapic_reset(ioapic); kvm_iodevice_init(&ioapic->dev, &ioapic_mmio_ops); diff --git a/arch/x86/kvm/ioapic.h b/arch/x86/kvm/ioapic.h index dc92bd7c37bc..bf28dbc11ff6 100644 --- a/arch/x86/kvm/ioapic.h +++ b/arch/x86/kvm/ioapic.h @@ -86,8 +86,24 @@ struct kvm_ioapic { struct delayed_work eoi_inject; u32 irq_eoi[IOAPIC_NUM_PINS]; u32 irr_delivered; + + /* reads protected by irq_srcu, writes by irq_lock */ + struct hlist_head mask_notifier_list; }; =20 +struct kvm_irq_mask_notifier { + void (*func)(struct kvm_irq_mask_notifier *kimn, bool masked); + int irq; + struct hlist_node link; +}; + +void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq, + struct kvm_irq_mask_notifier *kimn); +void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, + struct kvm_irq_mask_notifier *kimn); +void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned p= in, + bool mask); + #ifdef DEBUG #define ASSERT(x) \ do { \ diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c index 14fc8db0206c..76d1c85a1011 100644 --- a/arch/x86/kvm/irq_comm.c +++ b/arch/x86/kvm/irq_comm.c @@ -161,39 +161,6 @@ int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_ro= uting_entry *e, return -EWOULDBLOCK; } =20 -void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq, - struct kvm_irq_mask_notifier *kimn) -{ - mutex_lock(&kvm->irq_lock); - kimn->irq =3D irq; - hlist_add_head_rcu(&kimn->link, &kvm->arch.mask_notifier_list); - mutex_unlock(&kvm->irq_lock); -} - -void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, - struct kvm_irq_mask_notifier *kimn) -{ - mutex_lock(&kvm->irq_lock); - hlist_del_rcu(&kimn->link); - mutex_unlock(&kvm->irq_lock); - synchronize_srcu(&kvm->irq_srcu); -} - -void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned p= in, - bool mask) -{ - struct kvm_irq_mask_notifier *kimn; - int idx, gsi; - - idx =3D srcu_read_lock(&kvm->irq_srcu); - gsi =3D kvm_irq_map_chip_pin(kvm, irqchip, pin); - if (gsi !=3D -1) - hlist_for_each_entry_rcu(kimn, &kvm->arch.mask_notifier_list, link) - if (kimn->irq =3D=3D gsi) - kimn->func(kimn, mask); - srcu_read_unlock(&kvm->irq_srcu, idx); -} - bool kvm_arch_can_set_irq_routing(struct kvm *kvm) { return irqchip_in_kernel(kvm); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index a39babc32a6a..28a20f0aa3dd 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -12676,7 +12676,6 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long= type) if (ret) goto out_uninit_mmu; =20 - INIT_HLIST_HEAD(&kvm->arch.mask_notifier_list); atomic_set(&kvm->arch.noncoherent_dma_count, 0); =20 raw_spin_lock_init(&kvm->arch.tsc_write_lock); --=20 2.50.0.rc1.591.g9c95f17f64-goog From nobody Fri Oct 3 20:25:50 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A4349260560 for ; Wed, 11 Jun 2025 21:36:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677795; cv=none; b=QtCmKK3cQPMQffGeNlvEWUseJEckKozs1SvHenl7xwqhf1abzodDy0SPkE1gT6GAa3LL4zEyK+vONn33+leZ2dk4FoNqcI5kYDLJM2svoev63+/okWzpV5XCM1P/O1Io3KiLoa5erWr0Q2lYlvR+0k26wB44q5lnaXagzd2Dj+E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749677795; c=relaxed/simple; bh=PmbWC/TIlLCQzSKdxm1GVL9bgskn+dbrOnYa6rqBgWg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=SSwPjNEvJCgUamoCofu3K6uQUiRZ4uYjum+IxQUnt3z0bc9F0SxXgR4Ao06wYat+yTmHPH7WRulEnFg8aUJh0cWKfWodvVG4Nc5wMlxazsIWHrUnM6ThMgcsa1GP9+D/fMAwL503E7//SrGXr1qDmttj4vxfjrjIYaI2z3TT8LU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=ZQBCirEh; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ZQBCirEh" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-747d29e90b4so250412b3a.0 for ; Wed, 11 Jun 2025 14:36:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749677792; x=1750282592; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=vsgWR+xgtVyVwImlz4N8xQ42xaa1qcLxZh31sYTHKkU=; b=ZQBCirEhbwb6PaKtnEB1N0kQqbCi1FS86iNR3pahqknFmH0WGb7LgxMiL3tpFQdqzm kyoUk+oI0Imt5fCE1xCT0J+Mij4ug/kXcAeeyJs8C0N1KQwDmwzMjjQ6/6Oh/1sNKPjY IXttyVEaGRH5NwxDZvnGocs5URXuyF2GUehvkxd3wN29iYb8XQlnl3GpMNoP0rg8kjiP n6oZEzilzWZAoVtpJknFgbONei13EJTs8S7a/Jtr2CIbHKZBw1zL9q4ScoLUIHbtAg/x ovovxe1UULct7Ohks4z0hG+gjTszopEUlDItgrUXhTwv1v74n7/x4F47MQGzlje3wVTH BkDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749677792; x=1750282592; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=vsgWR+xgtVyVwImlz4N8xQ42xaa1qcLxZh31sYTHKkU=; b=hBBJ/faTWzHapIUBcHWs2qTgwDTfAIQ+AJwAmWswYpxaNYUsmKOktb4/eO+yWKtHg5 e2LrNSrLg1efyUIibYf+Kr5bQGlHpKOnkM+oWGrxz9/W1hswPvR9mDiRF1oxnG4j5ZnI R6yZ3G7fTYoehYGdVoNtGgy82qpPXrY/KLj2PpQpDQG7nqbfOCWchxNq+zhJT0wQSPXL gsQpq4NUgM4b2Ybp4QUpzpXtwicyVGEl7rzIMCRGw3UQS/mCeXZdkIOl7ANRgRLNMSd9 iio0I2ewWibZrKmlIj4IASEgk0K+CuYN2rJG+UYghha7UYwIRSbljl3/v2K+h1KZDtc+ 9JNw== X-Forwarded-Encrypted: i=1; AJvYcCVVjTqbqZTu5rxV2rX800jvSLTtfeLtWwcBWKqrpwj+kxHb8MW0xoq0wfqlE1zk89c1K7C9AUXJiyvk9Bs=@vger.kernel.org X-Gm-Message-State: AOJu0Yy7GNnwDK5pOT8U5D3y30H32Zid/8biPFOalMTu8MuTzRRnt+HI gb72h80e3HR/ka3OAvN+KGO0ZZVp9t0Q9Vib4c63No/3ZpQjxlKe4G3o2ksj9uLVWeE1IUjuK07 +I3TTRQ== X-Google-Smtp-Source: AGHT+IErRFT1YxlszZ8+Hn/lk6gYaxEVplONKqwV+JCUeXaN9V2hIH4Qm61XoRwm2x2oWrmpm9siqH0ZiFQ= X-Received: from pfax8.prod.google.com ([2002:aa7:9188:0:b0:746:fd4c:1fd0]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3e29:b0:748:2ff7:5e22 with SMTP id d2e1a72fcca58-7487c239e74mr1359444b3a.10.1749677792072; Wed, 11 Jun 2025 14:36:32 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 11 Jun 2025 14:35:57 -0700 In-Reply-To: <20250611213557.294358-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250611213557.294358-1-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611213557.294358-19-seanjc@google.com> Subject: [PATCH v2 18/18] KVM: x86: Fold irq_comm.c into irq.c From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Vitaly Kuznetsov Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kai Huang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drop irq_comm.c, a.k.a. common IRQ APIs, as there has been no non-x86 user since commit 003f7de62589 ("KVM: ia64: remove") (at the time, irq_comm.c lived in virt/kvm, not arch/x86/kvm). Suggested-by: Paolo Bonzini Acked-by: Kai Huang Signed-off-by: Sean Christopherson --- arch/x86/kvm/Makefile | 6 +- arch/x86/kvm/irq.c | 304 ++++++++++++++++++++++++++++++++++++- arch/x86/kvm/irq_comm.c | 325 ---------------------------------------- 3 files changed, 305 insertions(+), 330 deletions(-) delete mode 100644 arch/x86/kvm/irq_comm.c diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile index 92c737257789..c4b8950c7abe 100644 --- a/arch/x86/kvm/Makefile +++ b/arch/x86/kvm/Makefile @@ -5,10 +5,8 @@ ccflags-$(CONFIG_KVM_WERROR) +=3D -Werror =20 include $(srctree)/virt/kvm/Makefile.kvm =20 -kvm-y +=3D x86.o emulate.o irq.o lapic.o \ - irq_comm.o cpuid.o pmu.o mtrr.o \ - debugfs.o mmu/mmu.o mmu/page_track.o \ - mmu/spte.o +kvm-y +=3D x86.o emulate.o irq.o lapic.o cpuid.o pmu.o mtrr.o \ + debugfs.o mmu/mmu.o mmu/page_track.o mmu/spte.o =20 kvm-$(CONFIG_X86_64) +=3D mmu/tdp_iter.o mmu/tdp_mmu.o kvm-$(CONFIG_KVM_IOAPIC) +=3D i8259.o i8254.o ioapic.o diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c index 4c219e9f52b0..a0b1499baf6e 100644 --- a/arch/x86/kvm/irq.c +++ b/arch/x86/kvm/irq.c @@ -12,9 +12,10 @@ #include #include =20 +#include "hyperv.h" #include "ioapic.h" #include "irq.h" -#include "i8254.h" +#include "trace.h" #include "x86.h" #include "xen.h" =20 @@ -193,6 +194,307 @@ bool kvm_arch_irqchip_in_kernel(struct kvm *kvm) return irqchip_in_kernel(kvm); } =20 +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_vcpu *vcpu, *lowest =3D NULL; + unsigned long i, dest_vcpu_bitmap[BITS_TO_LONGS(KVM_MAX_VCPUS)]; + unsigned int dest_vcpus =3D 0; + + if (kvm_irq_delivery_to_apic_fast(kvm, src, irq, &r, dest_map)) + return r; + + if (irq->dest_mode =3D=3D APIC_DEST_PHYSICAL && + irq->dest_id =3D=3D 0xff && kvm_lowest_prio_delivery(irq)) { + pr_info("apic: phys broadcast and lowest prio\n"); + irq->delivery_mode =3D APIC_DM_FIXED; + } + + memset(dest_vcpu_bitmap, 0, sizeof(dest_vcpu_bitmap)); + + kvm_for_each_vcpu(i, vcpu, kvm) { + if (!kvm_apic_present(vcpu)) + continue; + + if (!kvm_apic_match_dest(vcpu, src, irq->shorthand, + irq->dest_id, irq->dest_mode)) + continue; + + if (!kvm_lowest_prio_delivery(irq)) { + if (r < 0) + r =3D 0; + r +=3D kvm_apic_set_irq(vcpu, irq, dest_map); + } else if (kvm_apic_sw_enabled(vcpu->arch.apic)) { + if (!kvm_vector_hashing_enabled()) { + if (!lowest) + lowest =3D vcpu; + else if (kvm_apic_compare_prio(vcpu, lowest) < 0) + lowest =3D vcpu; + } else { + __set_bit(i, dest_vcpu_bitmap); + dest_vcpus++; + } + } + } + + if (dest_vcpus !=3D 0) { + int idx =3D kvm_vector_to_index(irq->vector, dest_vcpus, + dest_vcpu_bitmap, KVM_MAX_VCPUS); + + lowest =3D kvm_get_vcpu(kvm, idx); + } + + if (lowest) + r =3D kvm_apic_set_irq(lowest, irq, dest_map); + + return r; +} + +void kvm_set_msi_irq(struct kvm *kvm, struct kvm_kernel_irq_routing_entry = *e, + struct kvm_lapic_irq *irq) +{ + struct msi_msg msg =3D { .address_lo =3D e->msi.address_lo, + .address_hi =3D e->msi.address_hi, + .data =3D e->msi.data }; + + trace_kvm_msi_set_irq(msg.address_lo | (kvm->arch.x2apic_format ? + (u64)msg.address_hi << 32 : 0), msg.data); + + irq->dest_id =3D x86_msi_msg_get_destid(&msg, kvm->arch.x2apic_format); + irq->vector =3D msg.arch_data.vector; + irq->dest_mode =3D kvm_lapic_irq_dest_mode(msg.arch_addr_lo.dest_mode_log= ical); + irq->trig_mode =3D msg.arch_data.is_level; + irq->delivery_mode =3D msg.arch_data.delivery_mode << 8; + irq->msi_redir_hint =3D msg.arch_addr_lo.redirect_hint; + irq->level =3D 1; + irq->shorthand =3D APIC_DEST_NOSHORT; +} +EXPORT_SYMBOL_GPL(kvm_set_msi_irq); + +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); +} + +int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, + struct kvm *kvm, int irq_source_id, int level, bool line_status) +{ + struct kvm_lapic_irq irq; + + if (kvm_msi_route_invalid(kvm, e)) + return -EINVAL; + + if (!level) + return -1; + + kvm_set_msi_irq(kvm, e, &irq); + + return kvm_irq_delivery_to_apic(kvm, NULL, &irq, NULL); +} + +int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e, + struct kvm *kvm, int irq_source_id, int level, + bool line_status) +{ + struct kvm_lapic_irq irq; + int r; + + switch (e->type) { +#ifdef CONFIG_KVM_HYPERV + case KVM_IRQ_ROUTING_HV_SINT: + return kvm_hv_synic_set_irq(e, kvm, irq_source_id, level, + line_status); +#endif + + case KVM_IRQ_ROUTING_MSI: + if (kvm_msi_route_invalid(kvm, e)) + return -EINVAL; + + kvm_set_msi_irq(kvm, e, &irq); + + if (kvm_irq_delivery_to_apic_fast(kvm, NULL, &irq, &r, NULL)) + return r; + break; + +#ifdef CONFIG_KVM_XEN + case KVM_IRQ_ROUTING_XEN_EVTCHN: + if (!level) + return -1; + + return kvm_xen_set_evtchn_fast(&e->xen_evtchn, kvm); +#endif + default: + break; + } + + return -EWOULDBLOCK; +} + +bool kvm_arch_can_set_irq_routing(struct kvm *kvm) +{ + return irqchip_in_kernel(kvm); +} + +int kvm_set_routing_entry(struct kvm *kvm, + struct kvm_kernel_irq_routing_entry *e, + const struct kvm_irq_routing_entry *ue) +{ + /* We can't check irqchip_in_kernel() here as some callers are + * currently initializing the irqchip. Other callers should therefore + * check kvm_arch_can_set_irq_routing() before calling this function. + */ + switch (ue->type) { +#ifdef CONFIG_KVM_IOAPIC + case KVM_IRQ_ROUTING_IRQCHIP: + if (irqchip_split(kvm)) + return -EINVAL; + e->irqchip.pin =3D ue->u.irqchip.pin; + switch (ue->u.irqchip.irqchip) { + case KVM_IRQCHIP_PIC_SLAVE: + e->irqchip.pin +=3D PIC_NUM_PINS / 2; + fallthrough; + case KVM_IRQCHIP_PIC_MASTER: + if (ue->u.irqchip.pin >=3D PIC_NUM_PINS / 2) + return -EINVAL; + e->set =3D kvm_pic_set_irq; + break; + case KVM_IRQCHIP_IOAPIC: + if (ue->u.irqchip.pin >=3D KVM_IOAPIC_NUM_PINS) + return -EINVAL; + e->set =3D kvm_ioapic_set_irq; + break; + default: + return -EINVAL; + } + e->irqchip.irqchip =3D ue->u.irqchip.irqchip; + break; +#endif + case KVM_IRQ_ROUTING_MSI: + e->set =3D kvm_set_msi; + e->msi.address_lo =3D ue->u.msi.address_lo; + e->msi.address_hi =3D ue->u.msi.address_hi; + e->msi.data =3D ue->u.msi.data; + + if (kvm_msi_route_invalid(kvm, e)) + return -EINVAL; + break; +#ifdef CONFIG_KVM_HYPERV + case KVM_IRQ_ROUTING_HV_SINT: + e->set =3D kvm_hv_synic_set_irq; + e->hv_sint.vcpu =3D ue->u.hv_sint.vcpu; + e->hv_sint.sint =3D ue->u.hv_sint.sint; + break; +#endif +#ifdef CONFIG_KVM_XEN + case KVM_IRQ_ROUTING_XEN_EVTCHN: + return kvm_xen_setup_evtchn(kvm, e, ue); +#endif + default: + return -EINVAL; + } + + return 0; +} + +bool kvm_intr_is_single_vcpu(struct kvm *kvm, struct kvm_lapic_irq *irq, + struct kvm_vcpu **dest_vcpu) +{ + int r =3D 0; + unsigned long i; + struct kvm_vcpu *vcpu; + + if (kvm_intr_is_single_vcpu_fast(kvm, irq, dest_vcpu)) + return true; + + kvm_for_each_vcpu(i, vcpu, kvm) { + if (!kvm_apic_present(vcpu)) + continue; + + if (!kvm_apic_match_dest(vcpu, NULL, irq->shorthand, + irq->dest_id, irq->dest_mode)) + continue; + + if (++r =3D=3D 2) + return false; + + *dest_vcpu =3D vcpu; + } + + return r =3D=3D 1; +} +EXPORT_SYMBOL_GPL(kvm_intr_is_single_vcpu); + +void kvm_scan_ioapic_irq(struct kvm_vcpu *vcpu, u32 dest_id, u16 dest_mode, + u8 vector, unsigned long *ioapic_handled_vectors) +{ + /* + * Intercept EOI if the vCPU is the target of the new IRQ routing, or + * the vCPU has a pending IRQ from the old routing, i.e. if the vCPU + * may receive a level-triggered IRQ in the future, or already received + * level-triggered IRQ. The EOI needs to be intercepted and forwarded + * to I/O APIC emulation so that the IRQ can be de-asserted. + */ + if (kvm_apic_match_dest(vcpu, NULL, APIC_DEST_NOSHORT, dest_id, dest_mode= )) { + __set_bit(vector, ioapic_handled_vectors); + } else if (kvm_apic_pending_eoi(vcpu, vector)) { + __set_bit(vector, ioapic_handled_vectors); + + /* + * Track the highest pending EOI for which the vCPU is NOT the + * target in the new routing. Only the EOI for the IRQ that is + * in-flight (for the old routing) needs to be intercepted, any + * future IRQs that arrive on this vCPU will be coincidental to + * the level-triggered routing and don't need to be intercepted. + */ + if ((int)vector > vcpu->arch.highest_stale_pending_ioapic_eoi) + vcpu->arch.highest_stale_pending_ioapic_eoi =3D vector; + } +} + +void kvm_scan_ioapic_routes(struct kvm_vcpu *vcpu, + ulong *ioapic_handled_vectors) +{ + struct kvm *kvm =3D vcpu->kvm; + struct kvm_kernel_irq_routing_entry *entry; + struct kvm_irq_routing_table *table; + u32 i, nr_ioapic_pins; + int idx; + + idx =3D srcu_read_lock(&kvm->irq_srcu); + table =3D srcu_dereference(kvm->irq_routing, &kvm->irq_srcu); + nr_ioapic_pins =3D min_t(u32, table->nr_rt_entries, + kvm->arch.nr_reserved_ioapic_pins); + for (i =3D 0; i < nr_ioapic_pins; ++i) { + hlist_for_each_entry(entry, &table->map[i], link) { + struct kvm_lapic_irq irq; + + if (entry->type !=3D KVM_IRQ_ROUTING_MSI) + continue; + + kvm_set_msi_irq(vcpu->kvm, entry, &irq); + + if (!irq.trig_mode) + continue; + + kvm_scan_ioapic_irq(vcpu, irq.dest_id, irq.dest_mode, + irq.vector, ioapic_handled_vectors); + } + } + srcu_read_unlock(&kvm->irq_srcu, idx); +} + +void kvm_arch_irq_routing_update(struct kvm *kvm) +{ +#ifdef CONFIG_KVM_HYPERV + kvm_hv_irq_routing_update(kvm); +#endif + + if (irqchip_split(kvm)) + kvm_make_scan_ioapic_request(kvm); +} + #ifdef CONFIG_KVM_IOAPIC #define IOAPIC_ROUTING_ENTRY(irq) \ { .gsi =3D irq, .type =3D KVM_IRQ_ROUTING_IRQCHIP, \ diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c deleted file mode 100644 index 76d1c85a1011..000000000000 --- a/arch/x86/kvm/irq_comm.c +++ /dev/null @@ -1,325 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * irq_comm.c: Common API for in kernel interrupt controller - * Copyright (c) 2007, Intel Corporation. - * - * Authors: - * Yaozu (Eddie) Dong - * - * Copyright 2010 Red Hat, Inc. and/or its affiliates. - */ -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include -#include -#include -#include - -#include "hyperv.h" -#include "ioapic.h" -#include "irq.h" -#include "lapic.h" -#include "trace.h" -#include "x86.h" -#include "xen.h" - -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_vcpu *vcpu, *lowest =3D NULL; - unsigned long i, dest_vcpu_bitmap[BITS_TO_LONGS(KVM_MAX_VCPUS)]; - unsigned int dest_vcpus =3D 0; - - if (kvm_irq_delivery_to_apic_fast(kvm, src, irq, &r, dest_map)) - return r; - - if (irq->dest_mode =3D=3D APIC_DEST_PHYSICAL && - irq->dest_id =3D=3D 0xff && kvm_lowest_prio_delivery(irq)) { - pr_info("apic: phys broadcast and lowest prio\n"); - irq->delivery_mode =3D APIC_DM_FIXED; - } - - memset(dest_vcpu_bitmap, 0, sizeof(dest_vcpu_bitmap)); - - kvm_for_each_vcpu(i, vcpu, kvm) { - if (!kvm_apic_present(vcpu)) - continue; - - if (!kvm_apic_match_dest(vcpu, src, irq->shorthand, - irq->dest_id, irq->dest_mode)) - continue; - - if (!kvm_lowest_prio_delivery(irq)) { - if (r < 0) - r =3D 0; - r +=3D kvm_apic_set_irq(vcpu, irq, dest_map); - } else if (kvm_apic_sw_enabled(vcpu->arch.apic)) { - if (!kvm_vector_hashing_enabled()) { - if (!lowest) - lowest =3D vcpu; - else if (kvm_apic_compare_prio(vcpu, lowest) < 0) - lowest =3D vcpu; - } else { - __set_bit(i, dest_vcpu_bitmap); - dest_vcpus++; - } - } - } - - if (dest_vcpus !=3D 0) { - int idx =3D kvm_vector_to_index(irq->vector, dest_vcpus, - dest_vcpu_bitmap, KVM_MAX_VCPUS); - - lowest =3D kvm_get_vcpu(kvm, idx); - } - - if (lowest) - r =3D kvm_apic_set_irq(lowest, irq, dest_map); - - return r; -} - -void kvm_set_msi_irq(struct kvm *kvm, struct kvm_kernel_irq_routing_entry = *e, - struct kvm_lapic_irq *irq) -{ - struct msi_msg msg =3D { .address_lo =3D e->msi.address_lo, - .address_hi =3D e->msi.address_hi, - .data =3D e->msi.data }; - - trace_kvm_msi_set_irq(msg.address_lo | (kvm->arch.x2apic_format ? - (u64)msg.address_hi << 32 : 0), msg.data); - - irq->dest_id =3D x86_msi_msg_get_destid(&msg, kvm->arch.x2apic_format); - irq->vector =3D msg.arch_data.vector; - irq->dest_mode =3D kvm_lapic_irq_dest_mode(msg.arch_addr_lo.dest_mode_log= ical); - irq->trig_mode =3D msg.arch_data.is_level; - irq->delivery_mode =3D msg.arch_data.delivery_mode << 8; - irq->msi_redir_hint =3D msg.arch_addr_lo.redirect_hint; - irq->level =3D 1; - irq->shorthand =3D APIC_DEST_NOSHORT; -} -EXPORT_SYMBOL_GPL(kvm_set_msi_irq); - -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); -} - -int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, - struct kvm *kvm, int irq_source_id, int level, bool line_status) -{ - struct kvm_lapic_irq irq; - - if (kvm_msi_route_invalid(kvm, e)) - return -EINVAL; - - if (!level) - return -1; - - kvm_set_msi_irq(kvm, e, &irq); - - return kvm_irq_delivery_to_apic(kvm, NULL, &irq, NULL); -} - -int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e, - struct kvm *kvm, int irq_source_id, int level, - bool line_status) -{ - struct kvm_lapic_irq irq; - int r; - - switch (e->type) { -#ifdef CONFIG_KVM_HYPERV - case KVM_IRQ_ROUTING_HV_SINT: - return kvm_hv_synic_set_irq(e, kvm, irq_source_id, level, - line_status); -#endif - - case KVM_IRQ_ROUTING_MSI: - if (kvm_msi_route_invalid(kvm, e)) - return -EINVAL; - - kvm_set_msi_irq(kvm, e, &irq); - - if (kvm_irq_delivery_to_apic_fast(kvm, NULL, &irq, &r, NULL)) - return r; - break; - -#ifdef CONFIG_KVM_XEN - case KVM_IRQ_ROUTING_XEN_EVTCHN: - if (!level) - return -1; - - return kvm_xen_set_evtchn_fast(&e->xen_evtchn, kvm); -#endif - default: - break; - } - - return -EWOULDBLOCK; -} - -bool kvm_arch_can_set_irq_routing(struct kvm *kvm) -{ - return irqchip_in_kernel(kvm); -} - -int kvm_set_routing_entry(struct kvm *kvm, - struct kvm_kernel_irq_routing_entry *e, - const struct kvm_irq_routing_entry *ue) -{ - /* We can't check irqchip_in_kernel() here as some callers are - * currently initializing the irqchip. Other callers should therefore - * check kvm_arch_can_set_irq_routing() before calling this function. - */ - switch (ue->type) { -#ifdef CONFIG_KVM_IOAPIC - case KVM_IRQ_ROUTING_IRQCHIP: - if (irqchip_split(kvm)) - return -EINVAL; - e->irqchip.pin =3D ue->u.irqchip.pin; - switch (ue->u.irqchip.irqchip) { - case KVM_IRQCHIP_PIC_SLAVE: - e->irqchip.pin +=3D PIC_NUM_PINS / 2; - fallthrough; - case KVM_IRQCHIP_PIC_MASTER: - if (ue->u.irqchip.pin >=3D PIC_NUM_PINS / 2) - return -EINVAL; - e->set =3D kvm_pic_set_irq; - break; - case KVM_IRQCHIP_IOAPIC: - if (ue->u.irqchip.pin >=3D KVM_IOAPIC_NUM_PINS) - return -EINVAL; - e->set =3D kvm_ioapic_set_irq; - break; - default: - return -EINVAL; - } - e->irqchip.irqchip =3D ue->u.irqchip.irqchip; - break; -#endif - case KVM_IRQ_ROUTING_MSI: - e->set =3D kvm_set_msi; - e->msi.address_lo =3D ue->u.msi.address_lo; - e->msi.address_hi =3D ue->u.msi.address_hi; - e->msi.data =3D ue->u.msi.data; - - if (kvm_msi_route_invalid(kvm, e)) - return -EINVAL; - break; -#ifdef CONFIG_KVM_HYPERV - case KVM_IRQ_ROUTING_HV_SINT: - e->set =3D kvm_hv_synic_set_irq; - e->hv_sint.vcpu =3D ue->u.hv_sint.vcpu; - e->hv_sint.sint =3D ue->u.hv_sint.sint; - break; -#endif -#ifdef CONFIG_KVM_XEN - case KVM_IRQ_ROUTING_XEN_EVTCHN: - return kvm_xen_setup_evtchn(kvm, e, ue); -#endif - default: - return -EINVAL; - } - - return 0; -} - -bool kvm_intr_is_single_vcpu(struct kvm *kvm, struct kvm_lapic_irq *irq, - struct kvm_vcpu **dest_vcpu) -{ - int r =3D 0; - unsigned long i; - struct kvm_vcpu *vcpu; - - if (kvm_intr_is_single_vcpu_fast(kvm, irq, dest_vcpu)) - return true; - - kvm_for_each_vcpu(i, vcpu, kvm) { - if (!kvm_apic_present(vcpu)) - continue; - - if (!kvm_apic_match_dest(vcpu, NULL, irq->shorthand, - irq->dest_id, irq->dest_mode)) - continue; - - if (++r =3D=3D 2) - return false; - - *dest_vcpu =3D vcpu; - } - - return r =3D=3D 1; -} -EXPORT_SYMBOL_GPL(kvm_intr_is_single_vcpu); - -void kvm_scan_ioapic_irq(struct kvm_vcpu *vcpu, u32 dest_id, u16 dest_mode, - u8 vector, unsigned long *ioapic_handled_vectors) -{ - /* - * Intercept EOI if the vCPU is the target of the new IRQ routing, or - * the vCPU has a pending IRQ from the old routing, i.e. if the vCPU - * may receive a level-triggered IRQ in the future, or already received - * level-triggered IRQ. The EOI needs to be intercepted and forwarded - * to I/O APIC emulation so that the IRQ can be de-asserted. - */ - if (kvm_apic_match_dest(vcpu, NULL, APIC_DEST_NOSHORT, dest_id, dest_mode= )) { - __set_bit(vector, ioapic_handled_vectors); - } else if (kvm_apic_pending_eoi(vcpu, vector)) { - __set_bit(vector, ioapic_handled_vectors); - - /* - * Track the highest pending EOI for which the vCPU is NOT the - * target in the new routing. Only the EOI for the IRQ that is - * in-flight (for the old routing) needs to be intercepted, any - * future IRQs that arrive on this vCPU will be coincidental to - * the level-triggered routing and don't need to be intercepted. - */ - if ((int)vector > vcpu->arch.highest_stale_pending_ioapic_eoi) - vcpu->arch.highest_stale_pending_ioapic_eoi =3D vector; - } -} - -void kvm_scan_ioapic_routes(struct kvm_vcpu *vcpu, - ulong *ioapic_handled_vectors) -{ - struct kvm *kvm =3D vcpu->kvm; - struct kvm_kernel_irq_routing_entry *entry; - struct kvm_irq_routing_table *table; - u32 i, nr_ioapic_pins; - int idx; - - idx =3D srcu_read_lock(&kvm->irq_srcu); - table =3D srcu_dereference(kvm->irq_routing, &kvm->irq_srcu); - nr_ioapic_pins =3D min_t(u32, table->nr_rt_entries, - kvm->arch.nr_reserved_ioapic_pins); - for (i =3D 0; i < nr_ioapic_pins; ++i) { - hlist_for_each_entry(entry, &table->map[i], link) { - struct kvm_lapic_irq irq; - - if (entry->type !=3D KVM_IRQ_ROUTING_MSI) - continue; - - kvm_set_msi_irq(vcpu->kvm, entry, &irq); - - if (!irq.trig_mode) - continue; - - kvm_scan_ioapic_irq(vcpu, irq.dest_id, irq.dest_mode, - irq.vector, ioapic_handled_vectors); - } - } - srcu_read_unlock(&kvm->irq_srcu, idx); -} - -void kvm_arch_irq_routing_update(struct kvm *kvm) -{ -#ifdef CONFIG_KVM_HYPERV - kvm_hv_irq_routing_update(kvm); -#endif - - if (irqchip_split(kvm)) - kvm_make_scan_ioapic_request(kvm); -} --=20 2.50.0.rc1.591.g9c95f17f64-goog