From nobody Sat Sep 26 19:34:46 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (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 6C84E3C65FD for ; Mon, 31 Aug 2026 08:10:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788163824; cv=none; b=VdmTGak8MUX7B5SlzEFg51P3xDleI+AXf6Gm4kQY0qh8TwfUdVC38YSWE0WVZxPTtuWhhfRbbxhx2sPrOjt4pcU6TIR7zjJfPeqR/AiYmMRl2tp6XIryqcoEND7MwCph7JhPprVBO//wiDH5Ntdpd1fTH7x2wsNnwk5kXNiphXc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788163824; c=relaxed/simple; bh=r/bufVq0OkVZwEdQ//AHO/OTUOmVemWl8G+OQpZ2wJw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=uHR4Y+OYFCUxNvbrXAfWNCCvh54Ua3oohL+tos7dSl6IxyEbGVIlLmihoJKA48YoUCV45yec7T11ft/iDjHw36chRPAyp+KuI6fc40rvPdTQBFrwHP/SklKE45MqNPTQXGO+dCGVrbX18+qVvKQ3NWGLgMnAAVDGZ9PbSBTbW34= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Oa1FPmK+; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Oa1FPmK+" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-49ccfbe062eso12665995e9.3 for ; Mon, 31 Aug 2026 01:10:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788163821; x=1788768621; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Mg0FhLj+v96vUWe+LyIXKQir5MTYCv01Q4cNbefOBGw=; b=Oa1FPmK+llG2ZjaXwPvqJ403Aks7qoUpHSGmpXCa/9SUl+lU6W5FLrxK5+cUpdMw1N 7WBH+sDUtnN09CiqCZGvHJRiktyLn7FwWEbpUA234w8m0OFA6eVCQ11ss1gIhM7PJEwD qZZ4pa3ivIs0sxLIP4EiGEDDf39ElWG5b2JpnrUV8BIWkv0sjRPLB/C7sOQJRybJk19g HAzdm7yuYwx0VXGeffIIrKCtxA8qWMqiX3Od0J0zKjR2fbe8lux4qjkHMaiHzvTzGAIb ZE6uF3gTnhOnFbXCQw/7CGl/lVL+NhOGNmDuwF20haJ6dV12Ihc+4QFaaxeihcCfR5Be Gj7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788163821; x=1788768621; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Mg0FhLj+v96vUWe+LyIXKQir5MTYCv01Q4cNbefOBGw=; b=OMJk+Rc9+lA2JMf+IZ3fUpF9vsXTZFbKoEdf5J9Quh5tugSTF4SIxFWsRrtMR3oK+0 bWBfdxH6N4gOMPa6TRvQcLOiCq3WCAOAODT2DO9c81wlxa59kZVRQuX7v59p0lPOF7qR fv0Qe+BzWjDdZFnBEgK3vkvctYdEqBtt7RqTPnaaT4WTzgU+kLBDP3Qy5EsqZKZYGtuo j55wBLxPU40WAZ3o4ceaZvLFZrr/85iDWUakv4Lt9NoBJjXGFhOwR+TWl3J58FZ446rk de9zJL0axdfp5zno9FyrThJNxkrgZhR9oryWfuyoqW8VqPKkYD/Burxb8EDYEsQvDVHi hpww== X-Forwarded-Encrypted: i=1; AHgh+RquMW3Y8RqpTQKKSZcz3D6eCpp+O8RwQUqBos3RVnKKiWVpbVAdjaO0o04tCw88gc61Y5kuxnsvbE/o0vY=@vger.kernel.org X-Gm-Message-State: AFuF++nB6tQku987CYd55zJkzA2i0l937hduFgaEZ8saxSyJu2hnoQDT 6reKPmTmYGZaNa663Yt9yFIEfgrAGIsGrCADOql3ZFCBDqW2Rnu3wJSB X-Gm-Gg: AR+sD13iFbpb0Xx4uhrI1nnTTUa/MeEnjj1W7NW7URXP6p4a4ZuzD84mM5S1as+tN19 Tu2uRSkLxUQAYuGRnVFD9aUmnpeYNfUZPj0CFCnRHwrhklVstndVi67mynV2CKyrDo/9aii21rL X/ykpHHXddq4Tbtizj4rzA0BbWFUHf9YDzirTP2rTQsfM/AgjWXA5L99Y/nXkLzI4I95FyCnPQc M4+f3hCWC0+aNdAG3KjJPt3RPTjIwe3HiZQInwiyMKjoitmCRqy5UKvFVRCgJLaIzLfpHeWxFj2 pUBqIJgt89he6wjS4ioePqLTiApVMOjpMt/fPhLKTWQNCYtC4nOzt5y7lguphnE+cBTJSjHVVwe cNAewYvrcNfyFDNJtQPt7hbQqXoavaBhtYxA/SyclOXBmcPAicbNn3V2irbuN3iBCRj6qRDB4uq E+48uFzfwDRrS7YdLfMg3oitVieyy5i0YDAZfymi5vfJuPnxqoeI5sxGXsVgXWnTOswq/dMDh+C pRGKqFHL3CxU78CqcWFTJ1pk3gWJa0wUYopI1B6E8e3cGz2WompxrdUwBFZY0qnzjk75Ndq4UMD lyiVjif2lSrFNbmO7YqtW+m1xbRr1E6Cq2gqWDzt9B9Fc94Lj+3WwvYHn8luzRWGaBtSKrg= X-Received: by 2002:a05:600c:4f92:b0:49b:90cc:3c87 with SMTP id 5b1f17b1804b1-49b91c487b2mr367309225e9.13.1788163820227; Mon, 31 Aug 2026 01:10:20 -0700 (PDT) Received: from localhost.localdomain (dynamic-2a02-3100-acb9-0201-68d0-34d2-ad1a-175a.310.pool.telefonica.de. [2a02:3100:acb9:201:68d0:34d2:ad1a:175a]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b95013d06sm370393515e9.12.2026.08.31.01.10.18 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 31 Aug 2026 01:10:19 -0700 (PDT) From: Karl Mehltretter To: Marc Zyngier , Oliver Upton , kvmarm@lists.linux.dev Cc: Karl Mehltretter , Fuad Tabba , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Paolo Bonzini , Shuah Khan , Eric Auger , Christoffer Dall , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH v4 1/4] KVM: arm64: vgic-v3: Undo assignment on iodev registration failure Date: Mon, 31 Aug 2026 10:10:01 +0200 Message-Id: <20260831081005.41346-2-kmehltretter@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20260831081005.41346-1-kmehltretter@gmail.com> References: <20260831081005.41346-1-kmehltretter@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" vgic_register_redist_iodev() assigns a redistributor region and base address to the vCPU before adding its iodev to the MMIO bus. However, the region's free_index is advanced only after registration succeeds. If kvm_io_bus_register_dev() fails, the vCPU retains the assignment while free_index still identifies the same slot as free. A later registration can therefore reuse a slot that remains assigned to the vCPU. Reserve the slot before registering its iodev. The caller holds slots_lock, so a registration failure cannot race with a later assignment. Undo the reservation and clear the cached assignment on failure. Fixes: dbd9733ab674 ("KVM: arm/arm64: Replace the single rdist region by a = list") Cc: stable@vger.kernel.org Assisted-by: Codex:gpt-5.6-sol Signed-off-by: Karl Mehltretter Reviewed-by: Fuad Tabba --- arch/arm64/kvm/vgic/vgic-mmio-v3.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/arch/arm64/kvm/vgic/vgic-mmio-v3.c b/arch/arm64/kvm/vgic/vgic-= mmio-v3.c index 5913a20d8301..22897ce64dbf 100644 --- a/arch/arm64/kvm/vgic/vgic-mmio-v3.c +++ b/arch/arm64/kvm/vgic/vgic-mmio-v3.c @@ -766,6 +766,19 @@ unsigned int vgic_v3_init_dist_iodev(struct vgic_io_de= vice *dev) return SZ_64K; } =20 +static void vgic_undo_redist_assignment(struct kvm_vcpu *vcpu) +{ + struct vgic_cpu *vgic_cpu =3D &vcpu->arch.vgic_cpu; + + lockdep_assert_held(&vcpu->kvm->slots_lock); + + guard(mutex)(&vcpu->kvm->arch.config_lock); + + vgic_cpu->rdreg->free_index--; + vgic_cpu->rdreg =3D NULL; + vgic_cpu->rd_iodev.base_addr =3D VGIC_ADDR_UNDEF; +} + /** * vgic_register_redist_iodev - register a single redist iodev * @vcpu: The VCPU to which the redistributor belongs @@ -818,16 +831,17 @@ int vgic_register_redist_iodev(struct kvm_vcpu *vcpu) rd_dev->nr_regions =3D ARRAY_SIZE(vgic_v3_rd_registers); rd_dev->redist_vcpu =3D vcpu; =20 + /* Protected by slots_lock */ + rdreg->free_index++; + mutex_unlock(&kvm->arch.config_lock); =20 ret =3D kvm_io_bus_register_dev(kvm, KVM_MMIO_BUS, rd_base, 2 * SZ_64K, &rd_dev->dev); if (ret) - return ret; + vgic_undo_redist_assignment(vcpu); =20 - /* Protected by slots_lock */ - rdreg->free_index++; - return 0; + return ret; =20 out_unlock: mutex_unlock(&kvm->arch.config_lock); base-commit: cf72cbb39da84b6f02f90c07f33b102fc10b16f0 --=20 2.39.5 (Apple Git-154) From nobody Sat Sep 26 19:34:46 2026 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (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 E64A83CC9EA for ; Mon, 31 Aug 2026 08:10:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788163826; cv=none; b=nArI7kIjKR676KaynYMHbmLna0IB8uHL30PleClMRXuWzzvwBkzGLmp8CMvwuiv2wQ0Zd0gi/UGgggYQp93IXS0rUugNwUD0jVExG3dIFamQiW7T87tSdX6ZP9x29fpLNSunwe71xdfJ3+ntlVsen8hx1xsyU8F5tIpqXStl76U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788163826; c=relaxed/simple; bh=Aob392KCiPwYOZ26v4z6ameSKdVNEWay1hUTRybnICw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=g2ZtJYaEmwx7Uja01GnzrwfSSYxki0r1fGIueXQifYpjQHRgUSSdyS1aa1RVUQWpdGtvFMaejh/85UOuTM7oJq1RAcnnrP6lLESeigcF/YB5/5XlaNsetgH0DRuzlM6hfQAAs2GEgweQmkhdNub919gr6P6ormiEsuvh7Z4U7eI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=a6YXr0Cc; arc=none smtp.client-ip=209.85.128.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="a6YXr0Cc" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-490cf322ed0so36101685e9.1 for ; Mon, 31 Aug 2026 01:10:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788163822; x=1788768622; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=DQe0/H8SNUjRW9auKFahnt1W5WCW5fFGWugsoqcSd7E=; b=a6YXr0CcMuslOhGbOHvGG1AENbfAN3dxqwa3TkpYpBo5n7hRhqUs2JZTcJnrQQa0Jw EkBlGwygKVozAStl49+wKrfR9OVVzFD86NTxMOVtM1ELDvyNc+tndJ+W6ak4WoAAbowt g78k7jgeXfUyH9Wh8boZt0NyrRZ1WtbMSES0ppouGrz93g/55xSGx8Y0bHrsMigd5SXz US47fdUr0DFqw6giI1o/3lchJ4gL0nLAieNgOfLeahlayRxOuCpd1Kf5R+f4sCI3T+8S IwgpmxsSajV8QOEQ/wtwtZaQKcLr94Y2O10vPC97VZuW7+AvHtoVGg8vM6AyGWU22W0P moyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788163822; x=1788768622; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=DQe0/H8SNUjRW9auKFahnt1W5WCW5fFGWugsoqcSd7E=; b=Hj909VwtUp4/Q8F5dd0RYpVyi+Z8PyoSJOJZ0mlOFKrHqRbAEszC7JNK/d7FUVswC0 KV5kH9DSKKffPZRcZTPCf57sa6truoQTctxFQLJNysVubQbr/rC7C5LTn3SOGe3lD1ag guQgn5aF+EIeK/LvpxdRg+JwraH82yzlQ7l56kCMXeZT0iUXhU1t4np7GQIcgaavu9+e CpNj2yvMdT6blBo2obnpHEdTDjPjgjRw09BNNv7A1rzfZOgq+U9PzJdjBe6ivt1O6mzb oJnl90itc6eVO5ojcjWU1P0Fj17qVhJqBCiAj6evULYWtNPsSLjhdOX7QJ16s7zx4QG6 3GMw== X-Forwarded-Encrypted: i=1; AHgh+RohQmOOM290/XJKagTQ/XGJ52K4dmAh5GdDZdyDsm/35bsm+T/pRCb66DiuWOeNgfZLWdl24LmuH4vHC4Y=@vger.kernel.org X-Gm-Message-State: AFuF++m23WsAblxnA71ZtoScnXWYawGvf9jo2NHPQWnG2hQC/hnT/0/+ /6vaQxC/X/7jGfLFvjw3N4AzY5veni2rDe1UzvBv/rFEm4LNG848j/pD X-Gm-Gg: AR+sD12UauX5QwHqEB8dOQ9dGYYKyhPAuMDVx8xb6UmpLEDWMXiAuotHl3tuDVTv8gj v4HWg5eMeDY20BigPvpq/HsA8H4ymYhYjwVwxbl26kzrOy1aKmXJkc2BzGETkjPl6Zxp8B/SLir dCCeNxI2h1mcstJ+mVwwVUbeavlW6Cyr180aLGvF39CO7jNQGrVQbWzS5Ere/m63btEBVX2VVzq bcaEF62rA4OGaCzUeZCsDTgIjWd7r1GndG//feDYKN6/l52cHDUU1aExInqPRnSYy/NCbRQUdkt PIkWtooPd9SpHBc1jmKPH7CIfPqCwTrK4km8cb0aGz0wtBlKoK4/oXjNZqRzNck8IuDS5sbndg8 IDm2IOTPr8YOlTcx2JX3sb2t9YLHXuV+RNwt8eQjRwFE1fUBiO8eT3HWM3aJxQTbSopq1bjnQJk Ljde4U9XFk0iMOZUWhcxxBXoS+QRre3lCEmGNBawcfLFLmFhZBN7MxDsRT1KZrkbuJR/COoOzDY x4PuqnTKaf36sethL1BTj4kTGzQAR0fsaorYjoqrhUQUL4ilS9rjFeD0fAXg5ggu6dKmfKp2UZZ DKylZIi5q0fFBCuAyIEF+nyteRj/aIWLUrf2tHeAgDorUTTECnXgAM0ZK8rlaYOXXC26wQ8= X-Received: by 2002:a05:600c:c3cf:10b0:49b:8f18:714a with SMTP id 5b1f17b1804b1-49b91c47b76mr281088265e9.12.1788163821808; Mon, 31 Aug 2026 01:10:21 -0700 (PDT) Received: from localhost.localdomain (dynamic-2a02-3100-acb9-0201-68d0-34d2-ad1a-175a.310.pool.telefonica.de. [2a02:3100:acb9:201:68d0:34d2:ad1a:175a]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b95013d06sm370393515e9.12.2026.08.31.01.10.20 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 31 Aug 2026 01:10:21 -0700 (PDT) From: Karl Mehltretter To: Marc Zyngier , Oliver Upton , kvmarm@lists.linux.dev Cc: Karl Mehltretter , Fuad Tabba , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Paolo Bonzini , Shuah Khan , Eric Auger , Christoffer Dall , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH v4 2/4] KVM: arm64: vgic-v3: Roll back assignments from the new region Date: Mon, 31 Aug 2026 10:10:02 +0200 Message-Id: <20260831081005.41346-3-kmehltretter@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20260831081005.41346-1-kmehltretter@gmail.com> References: <20260831081005.41346-1-kmehltretter@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" A failed REDIST_REGION write unregisters the redistributor iodevs of every vCPU processed before the failure. This includes vCPUs assigned to older regions. Their assignments remain cached, so a retry does not register the iodevs again. The vCPU whose registration fails has no assignment to roll back. For vCPUs processed earlier, limit rollback to those assigned to the new region. The region is removed on failure, so its free_index does not need restoring. Resetting assignments from older regions is unsafe because a vCPU can own one before kvm_for_each_vcpu() can see it. Rollback could then move free_index behind that live assignment. kvm_vgic_addr() holds slots_lock across the REDIST_REGION write. vCPU creation takes the same lock before assigning a redistributor. A concurrent vCPU cannot acquire an assignment from the new region before rollback completes. The lock also keeps rdreg valid across the config_lock drop required by MMIO-bus registration. Fixes: c011f4ea106b ("KVM: arm/arm64: Check vcpu redist base before registe= ring an iodev") Cc: stable@vger.kernel.org Assisted-by: Codex:gpt-5.6-sol Signed-off-by: Karl Mehltretter --- arch/arm64/kvm/vgic/vgic-mmio-v3.c | 32 +++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/arch/arm64/kvm/vgic/vgic-mmio-v3.c b/arch/arm64/kvm/vgic/vgic-= mmio-v3.c index 22897ce64dbf..77aa8433701a 100644 --- a/arch/arm64/kvm/vgic/vgic-mmio-v3.c +++ b/arch/arm64/kvm/vgic/vgic-mmio-v3.c @@ -855,7 +855,25 @@ void vgic_unregister_redist_iodev(struct kvm_vcpu *vcp= u) kvm_io_bus_unregister_dev(vcpu->kvm, KVM_MMIO_BUS, &rd_dev->dev); } =20 -static int vgic_register_all_redist_iodevs(struct kvm *kvm) +static void vgic_rollback_redist_iodev(struct kvm_vcpu *vcpu, + struct vgic_redist_region *rdreg) +{ + struct vgic_cpu *vgic_cpu =3D &vcpu->arch.vgic_cpu; + + lockdep_assert_held(&vcpu->kvm->slots_lock); + + if (vgic_cpu->rdreg !=3D rdreg) + return; + + vgic_unregister_redist_iodev(vcpu); + + guard(mutex)(&vcpu->kvm->arch.config_lock); + vgic_cpu->rdreg =3D NULL; + vgic_cpu->rd_iodev.base_addr =3D VGIC_ADDR_UNDEF; +} + +static int vgic_register_all_redist_iodevs(struct kvm *kvm, + struct vgic_redist_region *rdreg) { struct kvm_vcpu *vcpu; unsigned long c; @@ -870,12 +888,12 @@ static int vgic_register_all_redist_iodevs(struct kvm= *kvm) } =20 if (ret) { - /* The current c failed, so iterate over the previous ones. */ + /* Undo assignments made from the region being added. */ int i; =20 for (i =3D 0; i < c; i++) { vcpu =3D kvm_get_vcpu(kvm, i); - vgic_unregister_redist_iodev(vcpu); + vgic_rollback_redist_iodev(vcpu, rdreg); } } =20 @@ -984,10 +1002,13 @@ void vgic_v3_free_redist_region(struct kvm *kvm, str= uct vgic_redist_region *rdre =20 int vgic_v3_set_redist_base(struct kvm *kvm, u32 index, u64 addr, u32 coun= t) { + struct vgic_redist_region *rdreg; int ret; =20 mutex_lock(&kvm->arch.config_lock); ret =3D vgic_v3_alloc_redist_region(kvm, index, addr, count); + if (!ret) + rdreg =3D vgic_v3_rdist_region_from_index(kvm, index); mutex_unlock(&kvm->arch.config_lock); if (ret) return ret; @@ -996,12 +1017,9 @@ int vgic_v3_set_redist_base(struct kvm *kvm, u32 inde= x, u64 addr, u32 count) * Register iodevs for each existing VCPU. Adding more VCPUs * afterwards will register the iodevs when needed. */ - ret =3D vgic_register_all_redist_iodevs(kvm); + ret =3D vgic_register_all_redist_iodevs(kvm, rdreg); if (ret) { - struct vgic_redist_region *rdreg; - mutex_lock(&kvm->arch.config_lock); - rdreg =3D vgic_v3_rdist_region_from_index(kvm, index); vgic_v3_free_redist_region(kvm, rdreg); mutex_unlock(&kvm->arch.config_lock); return ret; --=20 2.39.5 (Apple Git-154) From nobody Sat Sep 26 19:34:46 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (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 2D74B3CC7EA for ; Mon, 31 Aug 2026 08:10:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788163833; cv=none; b=C1bxOGBwJJoht1pDfZ3jhR8t0FO/8vDjqfDKvdz0QzaNLuLzhkh75wH/965KYel1hiN1fnHqd9+DTkI7xKj/8Y87a6O0aD7rs+zW+HNb6yCvAW4LDBPXS58R3d7dJf46RBDqQ6fJaPlAe6QAFtshnqdAjl05Q8d4cZjbkRfATCk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788163833; c=relaxed/simple; bh=QaFutOje1lyg823tSWBbhoOBYa9TMEFhpNTqa16R5ow=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=pl5ghniwIVj90AWCHWrLvLx/bgbRCgkd2vTzveDh0SwwYweb/BtHViMCZT2zgkNRWhbxZPDGz47pyIO6ESDUW93Y+k3y4Bs9ek5khPgNUaLUfM+c7PenDEHvV3EKA6ZnMzYziYN28gWfu4AgMINOI9ngvTDjd7eHfVe7irxIGB4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Ys3kfpn2; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Ys3kfpn2" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-499ac87c92bso28945495e9.1 for ; Mon, 31 Aug 2026 01:10:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788163824; x=1788768624; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=7d5RXYEUOuzc4V23hC9MU0bXZ0pxNQetgcVjvcKaM1c=; b=Ys3kfpn2WsO9Inm4kHCx9zumAjHgp9mktLZai/tLyejpwasTX+VB1PZYeFqy+2VsFb v40zKGbYbRD6lbyE+JoTlsDYXxztgA1eoxLbgaUjymAEGWkBH0yHT6Raiu1dkrBrwPmg eSj3OWVrOJRlvE0csw/GIR6xrErAk8zUg1X7OfiMtu3StJhx9iiWNBr7IISVS1JE16d8 0qD0usXwLpM6ffiBBKZcQbo6TCbPiFc92f0j39+NtzqBwnJ5Vnb6Fq9YQUXh0s0XhTSp wJzsByiyDCChGQ+AedQ5h3x32zqGp/+IEyM/r/2RuL4NC4oeZY4w3GeHN/wqjgLMbRL2 SPSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788163824; x=1788768624; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=7d5RXYEUOuzc4V23hC9MU0bXZ0pxNQetgcVjvcKaM1c=; b=SfZ6tVkYbH3a8FZeF4AIYmjvcHD+ntrRF6E+9glEjH0X4CozjxulV8SD/AYXua3ta5 3Vmu2/Ig+dBv6HEdZwEE0hPiMTdRANQmFNCznqS40R+Rbrdt155OHDttFktExagkVXvb n+4qrer91nXyq7cmBvzLo8ksA9f3LitexFRZlVayoOka8V6S5YYWkXL6Ero2VV/h/exK UG3iNPfFqG0PMV26LuJudocNva4+hAVK9TVrjkMsusP0q0JFDz99wNMGOnWCdwwCw/+9 xgeaPfce4jiqtUA1KIvrbfN3RaCmzUJ62wo8b+cYoffPKjrl1zQYUhABrfTySXUoyoPs WrOQ== X-Forwarded-Encrypted: i=1; AHgh+Rp7EEkgivjXAlXTseoMIpwtpxsa+PKWBwPadwnnheyRQsIb0hlSXUS/GhH3LmoUapLH9gH1wAhOMDDeMIw=@vger.kernel.org X-Gm-Message-State: AFuF++nUjvtGHe7VppeFqmvToyDo68HwvjFqazO+Ol0K4k2yyvDTNGr3 9Nw+Xj3atEvp9swgrn9ujjKJQ0QIYKB/a5jn/MWcMZfTgBnoSWOeMnK1 X-Gm-Gg: AR+sD13jce3hqKJfqgOgOuHGsl7qiJeJZLTJJ2ohnv4yfvOmJKO/EhjCPxQoabN4OAr 7ujvAZW/tlyoDM0oDIZfsUFdJCEh3JSUaoWfQEe/OvqVTQCY/b8InCADwnluaJ1aF+e6PhAkEqr BSVVArZ5vuDn6HcVxxchtgMcaaEwDrtCTSKg3EAHNp5d9u57NtqFiufn1DtzBZCL9FJerOnWysc hF8ZVSCCeXQtKXk1qgSG++t0Waa204SqhJSFSC3eELEg4NZ2H9+UTgJ8aRRVgjUp4WtZ1kLFelS rYhHueW3psQMFjS+qT0pHegcc2NMrgopHtWumHJ50D+vmNKQ6Vz4ckddTsSOBG+jf4UoN01lY7v Q924938KArEju9dZdHyaV37PiPvwxuUIOJDQ7xQMrye1Muscs5ee4ZZrg4xVY8NzHqFw2mKZm2p yACP1XZC1OhRzaI//rHQ5xDPyggE0m39Gz93D8QGr0TC+Dd+EpZLEsRi9Gw2zd3mkeeyqN3G80e yPsPC8LOJ9bom9wLhjmJGSbxSqy+XxxKPMMMflc1NHfNu/nrbFxmlHLs27Lu4UhI5+DML1bhbSy xyTUadVTBTF6P9PgLaXh4ReHtB4unwBXLYsrIwTbwClScMpfXGxASNsZrPa+HFDymg9o8ZnRcqs 7AnodgQ== X-Received: by 2002:a05:600c:354b:b0:495:4d88:e630 with SMTP id 5b1f17b1804b1-49b91c4fb4amr349472475e9.10.1788163823703; Mon, 31 Aug 2026 01:10:23 -0700 (PDT) Received: from localhost.localdomain (dynamic-2a02-3100-acb9-0201-68d0-34d2-ad1a-175a.310.pool.telefonica.de. [2a02:3100:acb9:201:68d0:34d2:ad1a:175a]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b95013d06sm370393515e9.12.2026.08.31.01.10.21 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 31 Aug 2026 01:10:23 -0700 (PDT) From: Karl Mehltretter To: Marc Zyngier , Oliver Upton , kvmarm@lists.linux.dev Cc: Karl Mehltretter , Fuad Tabba , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Paolo Bonzini , Shuah Khan , Eric Auger , Christoffer Dall , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH v4 3/4] KVM: arm64: selftests: Pass guest code to vm_gic_create_with_vcpus() Date: Mon, 31 Aug 2026 10:10:03 +0200 Message-Id: <20260831081005.41346-4-kmehltretter@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20260831081005.41346-1-kmehltretter@gmail.com> References: <20260831081005.41346-1-kmehltretter@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Pass the guest-code address to vm_gic_create_with_vcpus(), and use guest_code at the existing call sites. This lets tests with different guest code reuse the common VM and VGIC setup while retaining the void * interface of vm_create_with_vcpus(). Assisted-by: Codex:gpt-5.6-sol Signed-off-by: Karl Mehltretter Reviewed-by: Fuad Tabba --- tools/testing/selftests/kvm/arm64/vgic_init.c | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/kvm/arm64/vgic_init.c b/tools/testing/= selftests/kvm/arm64/vgic_init.c index 47e34b43afb2..84aa97204b7f 100644 --- a/tools/testing/selftests/kvm/arm64/vgic_init.c +++ b/tools/testing/selftests/kvm/arm64/vgic_init.c @@ -73,6 +73,7 @@ static int run_vcpu(struct kvm_vcpu *vcpu) =20 static struct vm_gic vm_gic_create_with_vcpus(u32 gic_dev_type, u32 nr_vcpus, + void *guest_code, struct kvm_vcpu *vcpus[]) { struct vm_gic v; @@ -338,7 +339,7 @@ static void test_vgic_then_vcpus(u32 gic_dev_type) struct vm_gic v; int ret, i; =20 - v =3D vm_gic_create_with_vcpus(gic_dev_type, 1, vcpus); + v =3D vm_gic_create_with_vcpus(gic_dev_type, 1, guest_code, vcpus); =20 subtest_dist_rdist(&v); =20 @@ -359,7 +360,8 @@ static void test_vcpus_then_vgic(u32 gic_dev_type) struct vm_gic v; int ret; =20 - v =3D vm_gic_create_with_vcpus(gic_dev_type, NR_VCPUS, vcpus); + v =3D vm_gic_create_with_vcpus(gic_dev_type, NR_VCPUS, guest_code, + vcpus); =20 subtest_dist_rdist(&v); =20 @@ -411,7 +413,8 @@ static void test_v3_new_redist_regions(void) u64 addr; int ret; =20 - v =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus); + v =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, + guest_code, vcpus); subtest_v3_redist_regions(&v); kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL, KVM_DEV_ARM_VGIC_CTRL_INIT, NULL); @@ -422,7 +425,8 @@ static void test_v3_new_redist_regions(void) =20 /* step2 */ =20 - v =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus); + v =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, + guest_code, vcpus); subtest_v3_redist_regions(&v); =20 addr =3D REDIST_REGION_ATTR_ADDR(1, 0x280000, 0, 2); @@ -436,7 +440,8 @@ static void test_v3_new_redist_regions(void) =20 /* step 3 */ =20 - v =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus); + v =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, + guest_code, vcpus); subtest_v3_redist_regions(&v); =20 ret =3D __kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, @@ -608,7 +613,8 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(= void) int ret, i; u64 addr; =20 - v =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, 1, vcpus); + v =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, 1, guest_code, + vcpus); =20 /* Set space for 3 redists, we have 1 vcpu, so this succeeds. */ addr =3D max_phys_size - (3 * 2 * 0x10000); @@ -641,7 +647,8 @@ static void test_v3_its_region(void) u64 addr; int its_fd, ret; =20 - v =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus); + v =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, + guest_code, vcpus); its_fd =3D kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS); =20 addr =3D 0x401000; @@ -684,7 +691,8 @@ static void test_v3_nassgicap(void) u32 typer2; int ret; =20 - vm =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus= ); + vm =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, + guest_code, vcpus); kvm_device_attr_get(vm.gic_fd, KVM_DEV_ARM_VGIC_GRP_DIST_REGS, GICD_TYPER2, &typer2); has_nassgicap =3D typer2 & GICD_TYPER2_nASSGIcap; --=20 2.39.5 (Apple Git-154) From nobody Sat Sep 26 19:34:46 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (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 9BEC03CAA5F for ; Mon, 31 Aug 2026 08:10:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788163833; cv=none; b=Dv7IE2pMOetCJMWU1FFgJFptt7fxR9QwLfubpqUDN+vWrr+ODm3Nk3Kmca+m4TGNGmrSoUbmulmYOscvy/mD+l5QbPairV1KOLbESXPu8iyz4R4TfkECXbIWCuSF4vZjp/NboHvSqACbRO9duQ7BVfpMPmP9OpeNZd0ic4u/UDM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788163833; c=relaxed/simple; bh=viAVRllkrsImHsNb1DnUub6XvU5jvIFJexyLibR+lA0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=b2uKxkiEMhzMbBMCopDqgw58RE2I1clEWtPsZUAbHjizgJ4TjxpehrRE49a8ITY8yMSdRFVJSiSgOwizi95pAAJeOm2GOs0VwwVbO7FxryLSk2/Qw2+iHX3HB3I9ccEjz2r/5iggfwqrUj53Wyjp1gT0We3E9FySnyNfHj1fHOU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=D5qnKccv; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="D5qnKccv" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-49b96837ca3so17160155e9.3 for ; Mon, 31 Aug 2026 01:10:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788163826; x=1788768626; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=zgxKhL7A1XKhNVrAX+Ck+KuNZ6TSYMACVM9Vad6BlYI=; b=D5qnKccvlUUEYfq9eCuyuQpE9/ccpM9rz/bAcchhSGdL7mFeocch4miEiUrQDGXQBU enuzFBdIp2aFtm9XoZxB5P0S/a7Vo6Ft4iDdJspNYtq1YU6+/TQ1K4QfaOM6/9FLusuY v/aAqJU1yrN4kolDJBUbUu6idmYeQKFKzHQYzG0bU+9tyOJdgB7hlx5LiiwWxjxjqJj3 SY/69/mXTAO5+al0govVYo7pVmVmcxx79MKLpqw494PlG8vXc5DGMKw/PsRxPmu9wfuJ q95yLbHfi1KqpKX58SIH5jGN7H5mnepoULJv6eChf7pBFR7iVf1Wp/8ZlBaUOuT6/yM2 fCRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788163826; x=1788768626; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=zgxKhL7A1XKhNVrAX+Ck+KuNZ6TSYMACVM9Vad6BlYI=; b=iie3rKFJUlGrVmMBVPnMmiph9BVCteOMuqn203OrH6J50N9cY3KpmcyDEEa3xfkxQX EOsuqAobbHaBi5xvkRTX3wYdZiog82Qpmk0m194+nyqiP10qFsOVBtYiEflMMTQSef53 KHETx4PCt/cBNm+GqX2tOEfYyrpK7stVglTdk1QeFPRAn8h+TkawrysqRNMbS8IFQe8F o17jyLAqOr9ht0pGSdMRfupJDCb0YIYuioKox1lecm/1Wg5lobcLZSKwOk2iK4JmBP/x W6tO8jZYfrO+fmx+twFZdTG5TkJVLrMEEjwZT1IgBHNOUmRDEV1XEs/rzUClKoJo8FQ8 Ml/A== X-Forwarded-Encrypted: i=1; AHgh+RowxqDexmcXugHOatcsuN8GlCvSM4l+97AhGJ+SaSY4XNCvuT/54M2bO4wl7SEiiloA+cgUD+Zo4lW++Vc=@vger.kernel.org X-Gm-Message-State: AFuF++mrd4zUQIwIJlvE8ZdqcWKhXyUsQ/HrtEnOzFNetBlNQTb2Ys4/ wJaQTtRuxgD+bMxNXGZB2xNDUQXqoLOy+Acgf7yUr49OyTcSuexZP9/n X-Gm-Gg: AR+sD13dQGJ9+dDYPEIjup/0P1OClaYL/IkF1mhlza69uRFycQxlV4Y5Wr0gZus9+9D T0sRaz4qTfjpJU5PkJAvV/lwCmYP1FX2msmDbG/7yyEFoI/867t93Kt0xPqUfDTHdspyBnmO0Wn o/4hUH9NBA7vuksS9aQQeoG8WewodXtFRs9RAe9iH78uR1omkwNDJ0HQfD5DwHPn0qR2+HdzvnL O3YR758O5xOgPt7yQzaTd8Da2DJ+5tH/w0ZpBAii2muM1abKIXiqk09isPg6acCA8gIO5CKQSt6 4csC0YdAUq7+0zcCbV73jBu1WJ4697SnAs/EZUMmjiXRUkWiFvac2Hp6QnSL8I4UqgJ519M8S1C MDVnrwEq32X1giKaDFaeUWtg7x+Tx7UMEw45YzU5z5g2kpTwC+QFgzz/MRQ52d0ihP3J9o/UTSh R4K1tC5A6xcK/XjQkczox5Mf826a0TOAKL1u3OHAd0paZgoud1SpUpWrCGAcgwpVPKO7cFKANrO ACwpwWXCNDoFchel9/ScxIv/IpONIJ07vcKu6+3gyv4lOhQGRPyx4dEH8jzQ0tSeviT8jL2M5Ia 9S5FtZXMwlPwyaPQOCiJRpK31jxJra2PJPB7XJH98SYpgcvH1gJPN59ed406JTugwWa69b0= X-Received: by 2002:a05:600c:3155:b0:49b:910c:7703 with SMTP id 5b1f17b1804b1-49b91c3dcb4mr350375865e9.9.1788163825607; Mon, 31 Aug 2026 01:10:25 -0700 (PDT) Received: from localhost.localdomain (dynamic-2a02-3100-acb9-0201-68d0-34d2-ad1a-175a.310.pool.telefonica.de. [2a02:3100:acb9:201:68d0:34d2:ad1a:175a]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b95013d06sm370393515e9.12.2026.08.31.01.10.24 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 31 Aug 2026 01:10:24 -0700 (PDT) From: Karl Mehltretter To: Marc Zyngier , Oliver Upton , kvmarm@lists.linux.dev Cc: Karl Mehltretter , Fuad Tabba , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Paolo Bonzini , Shuah Khan , Eric Auger , Christoffer Dall , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH v4 4/4] KVM: arm64: selftests: Test VGICv3 redistributor region retry Date: Mon, 31 Aug 2026 10:10:04 +0200 Message-Id: <20260831081005.41346-5-kmehltretter@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20260831081005.41346-1-kmehltretter@gmail.com> References: <20260831081005.41346-1-kmehltretter@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" A failed REDIST_REGION write can remove redistributor iodevs without clearing their cached vCPU assignments. A retry then skips those assignments and leaves the redistributors absent from the MMIO bus. Create two partial regions, reject a third region that overlaps the distributor, and retry at a valid address. After initializing the VGIC, have the guest read GICR_TYPER from all four redistributors and check their processor numbers. This verifies the final configuration without assuming that assignments survive the failed write. Keep the redistributor IPAs outside the guest RAM memslot and install only the stage-1 mappings needed for the MMIO accesses. If an iodev is missing, KVM_RUN therefore exits with KVM_EXIT_MMIO. Without the fix, the first redistributor access exits at 0x8030008. Assisted-by: Codex:gpt-5.6-sol Signed-off-by: Karl Mehltretter Reviewed-by: Fuad Tabba --- tools/testing/selftests/kvm/arm64/vgic_init.c | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/tools/testing/selftests/kvm/arm64/vgic_init.c b/tools/testing/= selftests/kvm/arm64/vgic_init.c index 84aa97204b7f..5a30f3cb039b 100644 --- a/tools/testing/selftests/kvm/arm64/vgic_init.c +++ b/tools/testing/selftests/kvm/arm64/vgic_init.c @@ -5,6 +5,7 @@ * Copyright (C) 2020, Red Hat, Inc. */ #include +#include #include #include #include @@ -13,12 +14,21 @@ =20 #include "test_util.h" #include "kvm_util.h" +#include "gic.h" #include "processor.h" #include "vgic.h" #include "gic_v3.h" =20 #define NR_VCPUS 4 =20 +#define REDIST_RETRY_REGION0_BASE GICR_BASE_GPA +#define REDIST_RETRY_REGION1_BASE \ + (REDIST_RETRY_REGION0_BASE + 2 * KVM_VGIC_V3_REDIST_SIZE) +#define REDIST_RETRY_DIST_BASE \ + (REDIST_RETRY_REGION1_BASE + KVM_VGIC_V3_REDIST_SIZE) +#define REDIST_RETRY_REGION2_BASE \ + (REDIST_RETRY_DIST_BASE + KVM_VGIC_V3_DIST_SIZE) + #define REG_OFFSET(vcpu, offset) (((u64)vcpu << 32) | offset) =20 #define VGIC_DEV_IS_V2(_d) ((_d) =3D=3D KVM_DEV_TYPE_ARM_VGIC_V2) @@ -65,6 +75,23 @@ static void guest_code(void) GUEST_DONE(); } =20 +static void guest_check_redist_retry(void) +{ + unsigned int i; + + /* The first three redistributors span adjacent regions 0 and 1. */ + for (i =3D 0; i < NR_VCPUS; i++) { + u64 base =3D i < 3 ? REDIST_RETRY_REGION0_BASE + + i * KVM_VGIC_V3_REDIST_SIZE : + REDIST_RETRY_REGION2_BASE; + u64 typer =3D readq((void *)(unsigned long)(base + GICR_TYPER)); + + GUEST_ASSERT_EQ(GICR_TYPER_CPU_NUMBER(typer), i); + } + + GUEST_DONE(); +} + /* we don't want to assert on run execution, hence that helper */ static int run_vcpu(struct kvm_vcpu *vcpu) { @@ -462,6 +489,70 @@ static void test_v3_new_redist_regions(void) vm_gic_destroy(&v); } =20 +static void test_v3_redist_region_retry(void) +{ + struct kvm_vcpu *vcpus[NR_VCPUS]; + struct vm_gic v; + struct ucall uc; + u64 addr; + int ret; + + v =3D vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, + guest_check_redist_retry, vcpus); + + addr =3D REDIST_REGION_ATTR_ADDR(2, REDIST_RETRY_REGION0_BASE, 0, 0); + kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr); + + addr =3D REDIST_REGION_ATTR_ADDR(1, REDIST_RETRY_REGION1_BASE, 0, 1); + kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr); + + addr =3D REDIST_RETRY_DIST_BASE; + kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_V3_ADDR_TYPE_DIST, &addr); + + addr =3D REDIST_REGION_ATTR_ADDR(1, REDIST_RETRY_DIST_BASE, 0, 2); + ret =3D __kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, + &addr); + TEST_ASSERT(ret && errno =3D=3D EINVAL, + "register redist region colliding with dist"); + + addr =3D REDIST_REGION_ATTR_ADDR(1, REDIST_RETRY_REGION2_BASE, 0, 2); + kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, + KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr); + + virt_map(v.vm, REDIST_RETRY_REGION0_BASE, REDIST_RETRY_REGION0_BASE, + vm_calc_num_guest_pages(v.vm->mode, + 3 * KVM_VGIC_V3_REDIST_SIZE)); + virt_map(v.vm, REDIST_RETRY_REGION2_BASE, REDIST_RETRY_REGION2_BASE, + vm_calc_num_guest_pages(v.vm->mode, + KVM_VGIC_V3_REDIST_SIZE)); + + kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL, + KVM_DEV_ARM_VGIC_CTRL_INIT, NULL); + + vcpu_run(vcpus[0]); + switch (get_ucall(vcpus[0], &uc)) { + case UCALL_DONE: + break; + case UCALL_ABORT: + REPORT_GUEST_ASSERT(uc); + break; + case UCALL_NONE: + if (vcpus[0]->run->exit_reason =3D=3D KVM_EXIT_MMIO) + TEST_FAIL("Unexpected MMIO exit at 0x%llx", + vcpus[0]->run->mmio.phys_addr); + fallthrough; + default: + TEST_FAIL("Unexpected ucall %lu, exit_reason %u", + uc.cmd, vcpus[0]->run->exit_reason); + } + + vm_gic_destroy(&v); +} + static void test_v3_typer_accesses(void) { struct vm_gic v; @@ -986,6 +1077,7 @@ void run_tests(u32 gic_dev_type) =20 if (VGIC_DEV_IS_V3(gic_dev_type)) { test_v3_new_redist_regions(); + test_v3_redist_region_retry(); test_v3_typer_accesses(); test_v3_last_bit_redist_regions(); test_v3_last_bit_single_rdist(); --=20 2.39.5 (Apple Git-154)