From nobody Mon Sep 28 11:39:39 2026 Received: from mail-ed1-f50.google.com (mail-ed1-f50.google.com [209.85.208.50]) (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 01B503C1D7F for ; Sat, 22 Aug 2026 09:53:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787392438; cv=none; b=U5CMNDMdNUy8lxWXOW8nx0+gpJR4ykkDZ5A6pa59SBrD4jctUKhLTjMmDHYWoaXxtPQeb21FjDiOh8ZHEutb4hJhjNjjA/mrKLM49XDA5wkfW78pNhH50O23hecmXGiSWmE3dK5BrOrY69YhTqu3y+49ckAOW87TLkZ+oyefZXk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787392438; c=relaxed/simple; bh=ah6a8+r9Fx1EVjERXoUoTSdBjhjWjPdaic29SNFB80I=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=XkWV8btr7lym7Wz2Cgbz+cU/wuXzQATCwAADiX+Glwx2fKfL/kGbmeXUls5c3mbxINrLQBJw/+wYi2IATpQT0G94/2U0GwHTdIEjh2uybc9B2ZpUXv5b2YbNjyL29UTrbyYK1Et99rDMkaJ2PVVGOFZBiICOXJJZjE7iOPP5lY4= 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=XAyrGwei; arc=none smtp.client-ip=209.85.208.50 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="XAyrGwei" Received: by mail-ed1-f50.google.com with SMTP id 4fb4d7f45d1cf-6a15d54ac95so3313665a12.0 for ; Sat, 22 Aug 2026 02:53:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787392435; x=1787997235; 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=GqVzAbnyjF6+2pKtzAxu1aGHo1gAHNbWqpu34didy+A=; b=XAyrGweisfw4pM0l+/YelQmoAeRPWlzi8VsPUNfpMtFkScc1lxjH/NfQQgsAnJlWwZ gKh/flOxwDfMCyabiIp316Q4Aa9uXH6uU4kS3zlr20G3Br7hlQv4myTRkhnaKgefBua7 pswwmNmxKT8WmoBpivK6mjfqq33Wcy1SglL+ojvTU07tSEwGaEx4HO20Gzt9tCWlTS1V h6TO4bnwBBlsvCrkK2tWG7QHuhke2dGqvU4h7nfJR3TXXELQd1wVatLvX50L7yt1xfLa rkAWLp4aLCaY8bGSBpR5O0i9Ws88V2n9aq3ty3gdWUYfEHu/XW9O20hJ6ccmz96IhJmr ErJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787392435; x=1787997235; 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=GqVzAbnyjF6+2pKtzAxu1aGHo1gAHNbWqpu34didy+A=; b=M+jTryTSEScMdhC+o8VSE2UKjZXH0H3HBgtwWSsx6cdYhNgHDHbHNkKzD05LxrkXSm HdBIXjclGC4s25d7MIX41HIyT55BRrVNcnbH1fjTIrapfiQC3qJvR0z0Qm1ZSHGubDC9 XziouAZesVO1cgBSOrdtakIJ0bIvl9BGYuQM49Ej7dG1NnTSdOoXkhs6oQvUfs3ZOpkl K34PhHv2oqtw6hCoR3IBVAGhVwNoqAXaMFFQc5Rx7ZZUbqti6hMQS2GVPbtEybTLnlmC QOxE68r9XsCoxTKMY9HyXallDw5cb5/umFLKwbpYUOFhuU6RpWk2psPs3wCXF82fjzRG 0dww== X-Forwarded-Encrypted: i=1; AHgh+Rqa5JsDl7FaAvLZIUDU8U5a/o+1HtgE/iPHHnrcUEivx0vucU7XKi6Xh3GOXjAXIhnAXpJuDhx/rymK8wM=@vger.kernel.org X-Gm-Message-State: AFuF++nPT/M9c7R8il0LP4HPe5gIS66pG9WaxWVAQ9rlGIJEyQmd1HRM 1prfenraQsVPGcolppfZzV7Tcq60fGr4KWAdSGzPo9JnxtkdwbWCzxRO X-Gm-Gg: AR+sD1316W5ykUql52+Nk/mXTeBqKVh8nD6qzlmtiPddSpDlQ2eIQXmUjeC3/A1kYe7 HbMG/W/GT88j2Sw+QvV6beljUXAOJPwYi1DfmNBBNW4wXGdR8P86kDNwFMVSmPwO5bNs86BqXMD sV5rA9oOltG767Tz40xz56s8QO31seHIHlO0gkAMHeN9ARVLHcOEsqapJQLJrAPPdgguF1rmad/ 0qZGBo1VOU/etUoFiq7ogNwpQovP48ikO4PnvXQp3NlogKdDxtqRaKTfdwjdi+Aq93jc22lPchb 2CnGj/2YIRFZ16RRqge2oTHJq633nDKhbB4jv+Dwx1/DRoItwt32Y9xQnUUmQy0HUX1jUq1WE0q ni3s7IlFgEYOyJ+3zLL0Y2JC+6MWXXy+s3rQaTp0TgDVZG6JyyGnyT+7TAbdu3ssG9vhFHx8s1s rwl2eRGcK96IqA5uPmX6W4cIR6rVV6v4WHfgmFhvGq1NHZI8pGvxLmFbebccRm4XghsxA6movHF IIZ23pzBAbbmlUV39fn+DGcpYmsls5FLIX6WFQW5uSEKILOGtn9J1NTaBsUmwhnaCjqVYgrTY97 kqFuqcAwP3So4x3WO1LzFrzGdbU+GpNOpa+mIfYf7lSsgcZq4oEJzvA+zefzGPF4Qr3o X-Received: by 2002:a05:6402:501f:b0:698:6084:db7f with SMTP id 4fb4d7f45d1cf-6a582b5f1a2mr5487769a12.10.1787392435123; Sat, 22 Aug 2026 02:53:55 -0700 (PDT) Received: from localhost.localdomain (dynamic-2a02-3100-a0f5-8c01-3de3-cd62-aa6f-2fb0.310.pool.telefonica.de. [2a02:3100:a0f5:8c01:3de3:cd62:aa6f:2fb0]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6a3ff0c327asm11151586a12.8.2026.08.22.02.53.53 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 22 Aug 2026 02:53:54 -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, stable@vger.kernel.org Subject: [PATCH v3 1/5] KVM: arm64: vgic-v3: Undo assignment on iodev registration failure Date: Sat, 22 Aug 2026 11:53:42 +0200 Message-Id: <20260822095346.53882-2-kmehltretter@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20260822095346.53882-1-kmehltretter@gmail.com> References: <20260822095346.53882-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 Tested-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); --=20 2.39.5 (Apple Git-154) From nobody Mon Sep 28 11:39:39 2026 Received: from mail-ed1-f48.google.com (mail-ed1-f48.google.com [209.85.208.48]) (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 B73E53C4563 for ; Sat, 22 Aug 2026 09:53:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787392443; cv=none; b=im8Qb2XYtkkOB1Gct2LcW2Of4CTHpECJrEunq9mYQOoSHC1u/JLShekzslMYH+Y1PrqpP9Cb31V4P6k4v8nFoox1uilggFt3zrCEUYTHCREz5c/GM7DH4caradAmpXcOxJXbcXePaJezukseQjhpEzK2oLlnuAoV0oc6NkUlKtg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787392443; c=relaxed/simple; bh=JkiYpsUShZAsY1TjWqWCJe4NOQB0f5121pa5w8xGrzI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Jxmr7jUjoDHM29/OZfHxH45hAkHprNtfJ1GmEpWQi76hf4SF00C/YYmmxXpTYjqyXI/uw5mEJBhyHUgVnO34LLbeFY/aWnzBrL9RP03PAePPSjFJTKoj9nbZ9WDCAsMyCsFgUGAzuo/xsvy3OiwoXYnOfAS93pLsErnQskdhf88= 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=Wynl2c6E; arc=none smtp.client-ip=209.85.208.48 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="Wynl2c6E" Received: by mail-ed1-f48.google.com with SMTP id 4fb4d7f45d1cf-69fc9f25118so2069316a12.2 for ; Sat, 22 Aug 2026 02:53:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787392438; x=1787997238; 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=t0Fit0ozccWqcIUOha2+PzcipOyCFUk6rmWi2DZINrs=; b=Wynl2c6Ew/l3SIbwApLc4p2Gnvhh0iEsUfYpHrWL/fuUZkPb0DqI+Jzd+VzPGddCUv q1vjxy3OFxXmtv+w0Dm4uBFNZ80KkUdzpQaIDFh5jMR0wZMezZzgE9o0eZ1niFncNIp7 giFtqbUFVK98o639LEun7Iq0mUamvlUU8bHMCSXCAfdsfs9RbO7ue6Wn+9V/K3OwCpud yK9ngMM4qbWWoE+gN6UfmmY3/XQolzDFrZm16uc9qhtA04WNjS3uUR8KdlSdYgYR2qrn q6guiwQuy7IdY8AevkA1I+KcqQHUp23ZHoD3dJg1HWu77hZu30vHzuYhTP6ckv45Qncp O0iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787392438; x=1787997238; 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=t0Fit0ozccWqcIUOha2+PzcipOyCFUk6rmWi2DZINrs=; b=s54zMoqQbMyVJn2Bg6qzV/Gyo1ejrZxFP6Byx5v7J9az5epRjtQrcJiiD152x1TTh8 E+PgGP4/1FnbV7Hcc++8wQ4q9fjGKZglv/VEb8esgk6hQUVT9BMLMXYSExmFTvN74kMc JjgkoFYITW0LGwYMRQ5Oo0EgGIIdkbDxVmNJR9XeKrpLk/UShIIUegxl9Vky6Dv502d4 hFIHIqSmDjmYaiXNBUfJz+IY2dVyMRMw3A/RwcISTfSC8OjHEDHGuKcKQwvj7dEBcCYK QQW0jBhRqnQzuU1vHe2wB9Z/YW4s/3ZoexhIj3u0FKj7JOrXtFvUOwLfzOBDMOh0povV bdjA== X-Forwarded-Encrypted: i=1; AHgh+RpSsm7UgMsALOJezNfvK0W3JdjrIoBGDVH8hEUSCRtuYDg8yBRAi/ZgH4veUvad2o168vRrODV3XBwPJoY=@vger.kernel.org X-Gm-Message-State: AFuF++mU96papyQ6/ngn73hFFWO3H/Da2Kv2YQO+wkb2VcPtHKidXRuu FPFaA6KeZnf96/6oDaoNE5H4MxGZ1CL7zo5HPgpEDSUwJ04b4LjBnIUn X-Gm-Gg: AR+sD10mFFwfR/A6W1YwfS6FBPpvW3TQgFBOV+v5eonU1sl5b8chP2sKasK3D4sYicG alwLkum2pC7Fb+yFxiJDuWncaK8r+Vs6I/kTalOz3b+r0vC0PArIR5WKdja992O2Amv4imE/ASg ZmP58fk3Z4E7m/9TnbHtW9OQ5IeiAw/botRMqXsLcL3RyatrwWVnnK+eyH/6pFKmw29qODZWccB 1YDk1HKe73IariMETsvnaCSxMzCyk6QKjsxzFyyt/RT61oPIOkk6aHAIX+nWXwT3Eoo6mHvRPz4 o2HXo4NMrh2HjLOwvVy6+MF/g5uaQUhRkhj9cWJqqERUla1KKva1+3TIZrpGgX7rLjePoxqaA/f mPrm8tnkbL6iAzfZppL2y/+CUkKnhJxD7eVscj8dq5VLLHOV7/njrs/hglsPDsA0RXb7dFDaC2k ZYG9kQtcFsNpISVkj0KsA+Htp5QO8MDSpIZt8cYRhsfUWJOLqWt4Nqojp+iAxzgZjuePw+eOdRj biILceiePkb77fAQdBgGCKC6+gDtmCF1ROmhcmg9obFftEaJX+QercEDmErBOKDxfkJiuL4JcES LdibE0RNNf0adAgk4k+/dABVFRC7noVb+VJt9K6n/BU8QPe7W0RnqYsUrtVBrRevT12RUw== X-Received: by 2002:a05:6402:2186:b0:6a1:2400:baea with SMTP id 4fb4d7f45d1cf-6a42f18a70cmr11760162a12.10.1787392437812; Sat, 22 Aug 2026 02:53:57 -0700 (PDT) Received: from localhost.localdomain (dynamic-2a02-3100-a0f5-8c01-3de3-cd62-aa6f-2fb0.310.pool.telefonica.de. [2a02:3100:a0f5:8c01:3de3:cd62:aa6f:2fb0]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6a3ff0c327asm11151586a12.8.2026.08.22.02.53.56 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 22 Aug 2026 02:53:57 -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, stable@vger.kernel.org Subject: [PATCH v3 2/5] KVM: arm64: vgic-v3: Reset redistributors after failed region setup Date: Sat, 22 Aug 2026 11:53:43 +0200 Message-Id: <20260822095346.53882-3-kmehltretter@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20260822095346.53882-1-kmehltretter@gmail.com> References: <20260822095346.53882-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 REDIST_REGION write can fail after redistributor iodevs have been registered. The existing rollback unregisters only vCPUs processed before the failure, leaving their cached assignments and free_index values intact. A retry then skips the unregistered iodevs. Userspace has no guarantee that redistributor assignments survive a failed region update. On failure, unregister every redistributor iodev and clear every cached vCPU assignment. Reset all region free_index values and free the newly inserted region. The next successful region update rebuilds all possible assignments in region-index order. While a vCPU is being created, its redistributor iodev may be registered before the vCPU is visible to kvm_for_each_vcpu(). Reject REDIST and REDIST_REGION writes while creation is in flight, so rollback can reset eve= ry assignment. The registration failure for the current vCPU is already undone by vgic_register_redist_iodev(). Fixes: c011f4ea106b ("KVM: arm/arm64: Check vcpu redist base before registe= ring an iodev") Suggested-by: Marc Zyngier Cc: stable@vger.kernel.org Assisted-by: Codex:gpt-5.6-sol Signed-off-by: Karl Mehltretter Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba --- arch/arm64/kvm/vgic/vgic-kvm-device.c | 20 ++++++++++ arch/arm64/kvm/vgic/vgic-mmio-v3.c | 53 +++++++++++++++++++-------- 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/arch/arm64/kvm/vgic/vgic-kvm-device.c b/arch/arm64/kvm/vgic/vg= ic-kvm-device.c index 90be99443df3..48c3b2a48c20 100644 --- a/arch/arm64/kvm/vgic/vgic-kvm-device.c +++ b/arch/arm64/kvm/vgic/vgic-kvm-device.c @@ -97,6 +97,9 @@ static int kvm_vgic_addr(struct kvm *kvm, struct kvm_devi= ce_attr *attr, bool wri phys_addr_t *addr_ptr, alignment, size; u64 undef_value =3D VGIC_ADDR_UNDEF; u64 addr; + bool redist_write =3D write && + (attr->attr =3D=3D KVM_VGIC_V3_ADDR_TYPE_REDIST || + attr->attr =3D=3D KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION); int r; =20 /* Reading a redistributor region addr implies getting the index */ @@ -104,6 +107,19 @@ static int kvm_vgic_addr(struct kvm *kvm, struct kvm_d= evice_attr *attr, bool wri if (get_user(addr, uaddr)) return -EFAULT; =20 + /* + * A vCPU can have an RD assignment before it is visible to + * kvm_for_each_vcpu(). Reject redistributor updates while vCPU creation + * is in progress, so rollback can reset every assignment. + */ + if (redist_write) { + mutex_lock(&kvm->lock); + if (kvm->created_vcpus !=3D atomic_read(&kvm->online_vcpus)) { + r =3D -EBUSY; + goto out_unlock_kvm; + } + } + /* * Since we can't hold config_lock while registering the redistributor * iodevs, take the slots_lock immediately. @@ -201,6 +217,10 @@ static int kvm_vgic_addr(struct kvm *kvm, struct kvm_d= evice_attr *attr, bool wri out: mutex_unlock(&kvm->slots_lock); =20 +out_unlock_kvm: + if (redist_write) + mutex_unlock(&kvm->lock); + if (!r && !write) r =3D put_user(addr, uaddr); =20 diff --git a/arch/arm64/kvm/vgic/vgic-mmio-v3.c b/arch/arm64/kvm/vgic/vgic-= mmio-v3.c index 22897ce64dbf..6c009deb11d4 100644 --- a/arch/arm64/kvm/vgic/vgic-mmio-v3.c +++ b/arch/arm64/kvm/vgic/vgic-mmio-v3.c @@ -855,6 +855,40 @@ 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 void vgic_reset_redist_iodev(struct kvm_vcpu *vcpu) +{ + struct vgic_cpu *vgic_cpu =3D &vcpu->arch.vgic_cpu; + + lockdep_assert_held(&vcpu->kvm->arch.config_lock); + + vgic_cpu->rdreg =3D NULL; + vgic_cpu->rd_iodev.base_addr =3D VGIC_ADDR_UNDEF; +} + +static void vgic_v3_rollback_redist_region(struct kvm *kvm, u32 index) +{ + struct vgic_redist_region *rdreg, *iter; + struct kvm_vcpu *vcpu; + unsigned long c; + + lockdep_assert_held(&kvm->slots_lock); + + rdreg =3D vgic_v3_rdist_region_from_index(kvm, index); + + kvm_for_each_vcpu(c, vcpu, kvm) + vgic_unregister_redist_iodev(vcpu); + + guard(mutex)(&kvm->arch.config_lock); + + kvm_for_each_vcpu(c, vcpu, kvm) + vgic_reset_redist_iodev(vcpu); + + list_for_each_entry(iter, &kvm->arch.vgic.rd_regions, list) + iter->free_index =3D 0; + + vgic_v3_free_redist_region(kvm, rdreg); +} + static int vgic_register_all_redist_iodevs(struct kvm *kvm) { struct kvm_vcpu *vcpu; @@ -869,16 +903,6 @@ static int vgic_register_all_redist_iodevs(struct kvm = *kvm) break; } =20 - if (ret) { - /* The current c failed, so iterate over the previous ones. */ - int i; - - for (i =3D 0; i < c; i++) { - vcpu =3D kvm_get_vcpu(kvm, i); - vgic_unregister_redist_iodev(vcpu); - } - } - return ret; } =20 @@ -986,6 +1010,8 @@ int vgic_v3_set_redist_base(struct kvm *kvm, u32 index= , u64 addr, u32 count) { int ret; =20 + lockdep_assert_held(&kvm->lock); + mutex_lock(&kvm->arch.config_lock); ret =3D vgic_v3_alloc_redist_region(kvm, index, addr, count); mutex_unlock(&kvm->arch.config_lock); @@ -998,12 +1024,7 @@ int vgic_v3_set_redist_base(struct kvm *kvm, u32 inde= x, u64 addr, u32 count) */ ret =3D vgic_register_all_redist_iodevs(kvm); 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); + vgic_v3_rollback_redist_region(kvm, index); return ret; } =20 --=20 2.39.5 (Apple Git-154) From nobody Mon Sep 28 11:39:39 2026 Received: from mail-ed1-f46.google.com (mail-ed1-f46.google.com [209.85.208.46]) (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 7A3EF3C1F22 for ; Sat, 22 Aug 2026 09:54:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787392444; cv=none; b=qdZD0qUKKu0sZq3w1lyUWXMjBVyAuk7ZWKNtF1KZ7/i5gQt0yYIh0+ctMCiX5SimTZMTOClBM622pf3F6fP9uIV5LOxL18NmupZvy/tkbKAWqSoL4j25h/mP4zGfcEkN83/p1D/p57CQJeYWvVXb8DKFay1NUa93CBIhsqGGww8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787392444; c=relaxed/simple; bh=0b8VuyaQuF/XCQ3FNlzXnVd3Yhyh8aOgT8hrkybBkwc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=RfQVGCDfFRqGmFVn5MmhuOHmQ9YRP2y/ud90QlO6t59xqCaMJLLym3p6i9udp592XbidBNX+FApG0CERRC0ntLnAwI1I2zxj6qYdmGolA4yS7Du5Kefe/Xlu0KwPLe2soYPVd1Ni4C1JgpyZ93TZEF4XbiQb5x7cJSPP2pfiers= 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=e9UnxW6j; arc=none smtp.client-ip=209.85.208.46 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="e9UnxW6j" Received: by mail-ed1-f46.google.com with SMTP id 4fb4d7f45d1cf-6a0de062db5so3425896a12.1 for ; Sat, 22 Aug 2026 02:54:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787392441; x=1787997241; 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=PqPQildVUr5OZauQmAhm0/cwcJh5PP5Ede7gwQE/8hQ=; b=e9UnxW6jDvw4BHJ7Rjzi8T2NImnZN4ZVApWPIFTFgjhe8NSSR8kuxyh3UIkjez0Ijv QLCgweKJg9uU2pprbRNq3Rsn+yOsaD5CpAA72+hN7qWNeSBAgP9elCu1aHhtqCe9U3Bg KU3WSR50Hq30ZyZYFhVa2i/LIXA/v0eqZ6v+R7CZfBcYD0kaeSp3yDNrlgXncH7Y1v3P Aw46C1xRRK+F8Is+k1nL9KtpNVCyQIrLnroH3clbLoKUk/5Ws50STOg+rV+PUeEooNOt ljtCIa3KRn1yomvD+MQsAJBh//URAF1v9adKw1efp0X+59phFdMlzmHDeuCjNmak/ugG McaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787392441; x=1787997241; 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=PqPQildVUr5OZauQmAhm0/cwcJh5PP5Ede7gwQE/8hQ=; b=ULTz0hPhFp43vsdsSskoA/ZI46WLUAjgU+nC3pFXqFqCFPzuV9Jy9kF6R618ZhiigU qJcLp/P6Qt79lPZsaxd400gjMHi75AfEVMVtvd9LfkEDJvHnySn1IqI6qV1zg60v+dW/ aElUzmiWhAMH+QhUG1UlNQBt0MH5oBC1W9epHKTsYzwsO0D+mrtq9972rrN5cxQOnS8I ZaiVEC486WCNX90rMBhPksaVbS4xN5MC2E2ZINLWlU9U+COBexcxYJJRIxdD/YDLYFW7 6zMr8K4cgd7OTHe3dQ6777HGyBaVQpSET+2q756Ej+jOhNqekn5N4jE5cQXJcwHQH0Bu 9InA== X-Forwarded-Encrypted: i=1; AHgh+RrdcMqdUjHDI+VbbOv7EMD6F3mm6T2ecuxA35D9I7o2XfKZkOObZoS+jbpay3lD0qndMUVRscY7hiB7jVQ=@vger.kernel.org X-Gm-Message-State: AFuF++nmJsDhM38t//4CcE0ODgsBBDM1xooEr9os2wB52hA7zb3Ef6lL uOdYDsQ6MVfY5i7TkZjbl+LuDg33PTogpqKe6R4g40noiPfI8kOLKTq7 X-Gm-Gg: AR+sD11sjcRSoE/cX3TBUMjyLMc52xSdphLDS1P6l13+S0fGvfuW1qZ8+jQDsIVMBkR kPA+TDFwlCW+ena1WekfiO5WCJiwZlZ5agenMC31mq+pz6CgvXqaCSRe3mMDMehXHspDDJHJb+7 2iFmGk6OZy9B0nAYa/PqENs6DnSYgMFlwuFsPhZegJpspxdXYt3sHlOwy2iHpunMlDMiRF83jrI fuyvmn+AgNesIBnyGPg1mEgmpd9D+kJMr/0DspX84ISBsvIq5xLrBuH+AvtDMrOGwD7+Veow3wL QfMDZ4/9shvep8q/zj181E5WHdBLQqhQGViRi9xFZAOqz+KOy7xs9byjpoCkmF28U7Wv9X27hxI EWZr/yh43iIKBclSQgaJLaGCm/m35bP8nZRib3J6x9twMrBuQFeow/RQyPwucHFxBz+Dipp2xHn bDysfEFGb9hnv98l1MFqXEQThbcjAtlvyi0L09IPrvLVn1uAmlXFXJ0uSZucSKWZcLvjYajoX0N liEcGeXxw7b04g/Ns0YdBXcvhKWOmcFLDehPfv3UHLZ47bX0/l5pYrTp0wcpgFzn0ZXXnePajv7 IjhZJCU/Ix6Qk3dIQgpnF1MPGKJLLwy2bj0eOwDoe9rgCUJ4vctWkKLTgwAyQ/uurlSn X-Received: by 2002:a05:6402:4613:b0:698:9e5e:5df8 with SMTP id 4fb4d7f45d1cf-6a42f1aca88mr12197582a12.7.1787392440592; Sat, 22 Aug 2026 02:54:00 -0700 (PDT) Received: from localhost.localdomain (dynamic-2a02-3100-a0f5-8c01-3de3-cd62-aa6f-2fb0.310.pool.telefonica.de. [2a02:3100:a0f5:8c01:3de3:cd62:aa6f:2fb0]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6a3ff0c327asm11151586a12.8.2026.08.22.02.53.59 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 22 Aug 2026 02:54:00 -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 v3 3/5] KVM: arm64: vgic-v3: Separate redistributor teardown from unassignment Date: Sat, 22 Aug 2026 11:53:44 +0200 Message-Id: <20260822095346.53882-4-kmehltretter@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20260822095346.53882-1-kmehltretter@gmail.com> References: <20260822095346.53882-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" MMIO-bus unregistration may synchronize SRCU and must run outside config_lock. Conversely, clearing the redistributor assignment needs config_lock, and teardown must do so before freeing the redistributor regions. Introduce an already-locked unassignment primitive that only clears the cached region and base address. It deliberately does not adjust free_index: failure rollback resets all region counters, while VM teardown frees the regions. Keep MMIO-bus unregistration separate. Unregister devices before taking config_lock in VM teardown, then unassign the vCPUs before freeing their regions. Move redistributor cleanup out of __kvm_vgic_vcpu_destroy() and into its outer wrapper. This preserves failed-vCPU cleanup before its memory can be freed, without the special conditional in the common destructor. The region destructor no longer needs to scan the vCPUs. Suggested-by: Marc Zyngier Assisted-by: Codex:gpt-5.6-sol Signed-off-by: Karl Mehltretter Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba --- arch/arm64/kvm/vgic/vgic-init.c | 46 +++++++++++------------------- arch/arm64/kvm/vgic/vgic-mmio-v3.c | 16 ++--------- arch/arm64/kvm/vgic/vgic.h | 1 + 3 files changed, 21 insertions(+), 42 deletions(-) diff --git a/arch/arm64/kvm/vgic/vgic-init.c b/arch/arm64/kvm/vgic/vgic-ini= t.c index 0a3df6d3a691..a0d72b540331 100644 --- a/arch/arm64/kvm/vgic/vgic-init.c +++ b/arch/arm64/kvm/vgic/vgic-init.c @@ -523,29 +523,6 @@ static void __kvm_vgic_vcpu_destroy(struct kvm_vcpu *v= cpu) INIT_LIST_HEAD(&vgic_cpu->ap_list_head); kfree(vgic_cpu->private_irqs); vgic_cpu->private_irqs =3D NULL; - - if (vcpu->kvm->arch.vgic.vgic_model =3D=3D KVM_DEV_TYPE_ARM_VGIC_V3) { - /* - * If this vCPU is being destroyed because of a failed creation - * then unregister the redistributor to avoid leaving behind a - * dangling pointer to the vCPU struct. - * - * vCPUs that have been successfully created (i.e. added to - * kvm->vcpu_array) get unregistered in kvm_vgic_destroy(), as - * this function gets called while holding kvm->arch.config_lock - * in the VM teardown path and would otherwise introduce a lock - * inversion w.r.t. kvm->srcu. - * - * vCPUs that failed creation are torn down outside of the - * kvm->arch.config_lock and do not get unregistered in - * kvm_vgic_destroy(), meaning it is both safe and necessary to - * do so here. - */ - if (kvm_get_vcpu_by_id(vcpu->kvm, vcpu->vcpu_id) !=3D vcpu) - vgic_unregister_redist_iodev(vcpu); - - vgic_cpu->rd_iodev.base_addr =3D VGIC_ADDR_UNDEF; - } } =20 void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) @@ -553,7 +530,16 @@ void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) struct kvm *kvm =3D vcpu->kvm; =20 mutex_lock(&kvm->slots_lock); + if (kvm->arch.vgic.vgic_model =3D=3D KVM_DEV_TYPE_ARM_VGIC_V3) + vgic_unregister_redist_iodev(vcpu); + __kvm_vgic_vcpu_destroy(vcpu); + + if (kvm->arch.vgic.vgic_model =3D=3D KVM_DEV_TYPE_ARM_VGIC_V3) { + mutex_lock(&kvm->arch.config_lock); + __vgic_unassign_redist_iodev(vcpu); + mutex_unlock(&kvm->arch.config_lock); + } mutex_unlock(&kvm->slots_lock); } =20 @@ -563,21 +549,23 @@ void kvm_vgic_destroy(struct kvm *kvm) unsigned long i; =20 mutex_lock(&kvm->slots_lock); + if (kvm->arch.vgic.vgic_model =3D=3D KVM_DEV_TYPE_ARM_VGIC_V3) + kvm_for_each_vcpu(i, vcpu, kvm) + vgic_unregister_redist_iodev(vcpu); + mutex_lock(&kvm->arch.config_lock); =20 vgic_debug_destroy(kvm); =20 - kvm_for_each_vcpu(i, vcpu, kvm) + kvm_for_each_vcpu(i, vcpu, kvm) { __kvm_vgic_vcpu_destroy(vcpu); + if (kvm->arch.vgic.vgic_model =3D=3D KVM_DEV_TYPE_ARM_VGIC_V3) + __vgic_unassign_redist_iodev(vcpu); + } =20 kvm_vgic_dist_destroy(kvm); =20 mutex_unlock(&kvm->arch.config_lock); - - if (kvm->arch.vgic.vgic_model =3D=3D KVM_DEV_TYPE_ARM_VGIC_V3) - kvm_for_each_vcpu(i, vcpu, kvm) - vgic_unregister_redist_iodev(vcpu); - mutex_unlock(&kvm->slots_lock); } =20 diff --git a/arch/arm64/kvm/vgic/vgic-mmio-v3.c b/arch/arm64/kvm/vgic/vgic-= mmio-v3.c index 6c009deb11d4..dc860178105d 100644 --- a/arch/arm64/kvm/vgic/vgic-mmio-v3.c +++ b/arch/arm64/kvm/vgic/vgic-mmio-v3.c @@ -775,8 +775,7 @@ static void vgic_undo_redist_assignment(struct kvm_vcpu= *vcpu) guard(mutex)(&vcpu->kvm->arch.config_lock); =20 vgic_cpu->rdreg->free_index--; - vgic_cpu->rdreg =3D NULL; - vgic_cpu->rd_iodev.base_addr =3D VGIC_ADDR_UNDEF; + __vgic_unassign_redist_iodev(vcpu); } =20 /** @@ -855,7 +854,7 @@ void vgic_unregister_redist_iodev(struct kvm_vcpu *vcpu) kvm_io_bus_unregister_dev(vcpu->kvm, KVM_MMIO_BUS, &rd_dev->dev); } =20 -static void vgic_reset_redist_iodev(struct kvm_vcpu *vcpu) +void __vgic_unassign_redist_iodev(struct kvm_vcpu *vcpu) { struct vgic_cpu *vgic_cpu =3D &vcpu->arch.vgic_cpu; =20 @@ -881,7 +880,7 @@ static void vgic_v3_rollback_redist_region(struct kvm *= kvm, u32 index) guard(mutex)(&kvm->arch.config_lock); =20 kvm_for_each_vcpu(c, vcpu, kvm) - vgic_reset_redist_iodev(vcpu); + __vgic_unassign_redist_iodev(vcpu); =20 list_for_each_entry(iter, &kvm->arch.vgic.rd_regions, list) iter->free_index =3D 0; @@ -991,17 +990,8 @@ static int vgic_v3_alloc_redist_region(struct kvm *kvm= , uint32_t index, =20 void vgic_v3_free_redist_region(struct kvm *kvm, struct vgic_redist_region= *rdreg) { - struct kvm_vcpu *vcpu; - unsigned long c; - lockdep_assert_held(&kvm->arch.config_lock); =20 - /* Garbage collect the region */ - kvm_for_each_vcpu(c, vcpu, kvm) { - if (vcpu->arch.vgic_cpu.rdreg =3D=3D rdreg) - vcpu->arch.vgic_cpu.rdreg =3D NULL; - } - list_del(&rdreg->list); kfree(rdreg); } diff --git a/arch/arm64/kvm/vgic/vgic.h b/arch/arm64/kvm/vgic/vgic.h index b71d486ae514..1a2e40004a47 100644 --- a/arch/arm64/kvm/vgic/vgic.h +++ b/arch/arm64/kvm/vgic/vgic.h @@ -350,6 +350,7 @@ int vgic_v3_save_pending_tables(struct kvm *kvm); int vgic_v3_set_redist_base(struct kvm *kvm, u32 index, u64 addr, u32 coun= t); int vgic_register_redist_iodev(struct kvm_vcpu *vcpu); void vgic_unregister_redist_iodev(struct kvm_vcpu *vcpu); +void __vgic_unassign_redist_iodev(struct kvm_vcpu *vcpu); bool vgic_v3_check_base(struct kvm *kvm); =20 void vgic_v3_load(struct kvm_vcpu *vcpu); --=20 2.39.5 (Apple Git-154) From nobody Mon Sep 28 11:39:39 2026 Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) (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 24DCC3998BE for ; Sat, 22 Aug 2026 09:54:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787392449; cv=none; b=bTgZiqeqL31QWWH5ptjqYtXMG23yqfxAOppEEach4SSyCeJ2nH7URu6Z+YMdobF7y/KvjPnAjjh9aW3WAzLBacC4m2y6IiUE18vv3hUrIp3vb97vybuktjQmCUL4Ik9QTWbPYvR8rotwQ7OtmP5F8GZ7Mo+HrCv9vHK7e1yql0Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787392449; c=relaxed/simple; bh=x1giPFDv/gONXuicCcEUE5OwuiGeHJuokCnsgSDm8JE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=hWRBzLiHZow2RO4FtrDiX2iMj6o9SJv9+EkUCgid5d+l9DAtTMr+y8ekKbE9c6Rcz5RIjUv92os6IBTbbtAXRnDpU87uT/3XAmEHkXfrX9iqVleZrlp+3ynY7aOmMR5sSbN6h0lqQiWNQH8Xdl0PMtnPWPKKJLFM9PAQiIKSREY= 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=UL1zbmWP; arc=none smtp.client-ip=209.85.208.47 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="UL1zbmWP" Received: by mail-ed1-f47.google.com with SMTP id 4fb4d7f45d1cf-69c600f76ccso3194484a12.0 for ; Sat, 22 Aug 2026 02:54:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787392443; x=1787997243; 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=IJR++uOi5dTiSKJhpV6uor7RZpeZqCuTfsiFF6sw6hM=; b=UL1zbmWPX+rlBmVCOAtzyj1Fkp3+mDpaKFsFHSb1A0BerxvTrm+J7qSVem0t9swKtk 8X3VGcHhmcpORVXcF7tob7zQdMev09UNT3YqLeK4Lsh0k3psmc0XDJWBvCCCu/WaOzGu Ahx7kh8p01TnxWqsL/YK/1i9dBvBejqW7uFIDeYNRGhqn1jMHu2aZdigUO26vklt46X4 nXLGgkqWk8uxOYimtdHqjpZZcWfn32YcILZf+PBc5WxQ41bexanpKbPBc+AJ+YgqiWrH L4s4pJgpKylJrOZn+00t4V/qWsEySBeTSpR4vDBAwzUA80E1i4vOPphSHK60lFtQwzOG i/aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787392443; x=1787997243; 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=IJR++uOi5dTiSKJhpV6uor7RZpeZqCuTfsiFF6sw6hM=; b=CW1ekyyE8fN5+d4JGp2M8r9k8qTAAKkquSERI1RnnydUABYDoCzE8Z41zjT8fKtpie RyNv6KkdZwksgwej8pbp9QTUlXIv+nrAFtJTWSxFsn0uaROHVo9kfqKh0obHqZhP+wlW VzMTtEbJd5wF2IIIlw2uNinY5oGBmR1FlIcXWcT7u+6i9gcDBRjCRIUbcjdQRjhdAugU hICYtqYjxhOtW6iQ2CIoSJ2QATKPgTGC06ZnfvtEe8sBi3UwlS2qhnjee1TGHkw3NtLP fi0jtl1IIwCI/x/2U3mdC8he/5Ifh66x44KDISK0S2jBqJKvOtwEPUIJHb2neQqmCx1n PQQg== X-Forwarded-Encrypted: i=1; AHgh+RrbDDGKE+Ln6J1TmtX2q/qwccJTIoVbvUPBjPoVhgOrxc/NPQ06sjQbItj9Lco+SEd6rfFafqjRSWssw+w=@vger.kernel.org X-Gm-Message-State: AFuF++noMt//NR3e4pVhwN6T2QOqU5Aro9v+fFMYjwr9mHsvXYjKFRET EkMrSJ7Nqsl8VIGVzcp+85XMbUOoVZQrweMNaYlnGj2R0SlEUZvAjnm7 X-Gm-Gg: AR+sD121Xet13J1oPUxCRlRLhr9Tj8kdE8c3gI1Pr5lSZ1T3k798p74Aj7ZN7PZH4Kg ugoqiZQqaX6/ERES4NPKBuiFZ53rwe8hu5ed3YiRhE86IR4e93BW06El5ndVr7nqCpvHUZ+GL7J x5r7wgyNGaV07Y2XdzbhJMpNfEE2Acq6sFgXh8u0RNtXeKu+Kanfb/xk/ggN7cBfQqHXujEa9nZ aueKrns45VDdMqnYCF/czg1E+i0OJo06raTYbJUNEDWt02/UK48HmryEf2OIeLU8G4+6ZiYiUsQ zmtwRxo1DPG0JLVw26HduKc0jrKPoH+IeNcdGo2Z6rnWBxzuMmAHqo6B2J/6bwuF9gOImgBuXvV xxPumOOciiRn/JlDd+efVFXDVyCSlSEBdPn3xkPXqhi7Ao3wDVdKOzuqhAgLyXckxJdeA1mgU9G UVqGuJgBiZqixIxPlC3/1d9co8QEm5liS0bHrBhHbLVvCMgYlh4ia9Xrhfs6WA0oH3jmI5WvFTf Lr5LoIdeC1AcRcbwn4UuP+57uJcB1XiX0hWDvuKeDYUY6UFEjQJcwhJknOK1+ex6ug1OYhiuJgy 4xQOWf4SIkS7E1+tdkedxSpyRleH82IrUwlSsiOz9Wuc/OE3o8LZzfOaCCzY+IyGd2DB X-Received: by 2002:a05:6402:21dc:b0:6a3:fee5:adcf with SMTP id 4fb4d7f45d1cf-6a42f14d952mr13251775a12.1.1787392443344; Sat, 22 Aug 2026 02:54:03 -0700 (PDT) Received: from localhost.localdomain (dynamic-2a02-3100-a0f5-8c01-3de3-cd62-aa6f-2fb0.310.pool.telefonica.de. [2a02:3100:a0f5:8c01:3de3:cd62:aa6f:2fb0]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6a3ff0c327asm11151586a12.8.2026.08.22.02.54.02 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 22 Aug 2026 02:54:02 -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 v3 4/5] KVM: arm64: selftests: Pass guest code to vm_gic_create_with_vcpus() Date: Sat, 22 Aug 2026 11:53:45 +0200 Message-Id: <20260822095346.53882-5-kmehltretter@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20260822095346.53882-1-kmehltretter@gmail.com> References: <20260822095346.53882-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 Tested-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 Mon Sep 28 11:39:39 2026 Received: from mail-ed1-f50.google.com (mail-ed1-f50.google.com [209.85.208.50]) (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 ECF963C4B93 for ; Sat, 22 Aug 2026 09:54:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787392450; cv=none; b=s3A2xrPrBE8ftlGnrsfnkw6rh3FX3gsJE4F+ljty8vCXuX2mxo9x+Fpc6B06AMc1CQ8Bj2maiaeZ/g9poHQ8o9UqoGWdVW+GS7tzt6yN7lXB9wBTUL0Iu+4rcZmztINXdw/6VqF/lCRMsVG2VP9RNlj5tcdd/5O11sNezqeme2A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787392450; c=relaxed/simple; bh=rv7xXdolg6NQjjtjnJt7VT86OJEL0RCm3VxCHe4ILRc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tEotdv4w26OPIdPWLLtaYePpYl6TIM4D0bnR2B/RxOTjaixnBlIiGCUeMN/ThEv6vftV8nRfIBnet/tDBrJCEfru2Uiu8nT3T1qH+wyBMxBgofnDZ5uukdAHnc9CHGdVwq9xUT5biV0rGnWynaJyKjZpe57wqTD3XxiTX5B7bCY= 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=qBZFXAV9; arc=none smtp.client-ip=209.85.208.50 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="qBZFXAV9" Received: by mail-ed1-f50.google.com with SMTP id 4fb4d7f45d1cf-6a36982a875so2909559a12.0 for ; Sat, 22 Aug 2026 02:54:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787392446; x=1787997246; 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=1GYqiFSBk6xbMl7ANfKl+0h07k1nsbqa00/KuNdgbGU=; b=qBZFXAV9HTSYCJnfWizpOD7rUT4nbCHbFnOCqe9sz4zMi9gBse8w41rh6F++cwKbZM 942PO/Vy0S+EdfGPB99CaL1yuzxv9zYee/NP5umuYlIBQU1HtrlyY//PEpiXQp3r/D8i PhkOuHdeVBMZFK8zoZZ3zVNQ0lthZ2XcgziKJGxwqw2mRrzZgDsm77a+GPyqGF44rsit oD27aFwhINFbZtWtSbaBCLrmSyPiGC+LILEP2DNakC30gP5qFDfcaBn7Yl/OG1CEiZyr m9YoiNUf8zSlOhWFyTBr6KZTBz+S4/DVPoRSPjHJecpT5NGeMagkPmCmBK4c5TZ6CjrC VX3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787392446; x=1787997246; 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=1GYqiFSBk6xbMl7ANfKl+0h07k1nsbqa00/KuNdgbGU=; b=bZ45tNFIgYypYxrw2B0ttTbsGSAA7EWkTYeOY338DvaSNskxPOriKMs2rkQZTF3zz1 oiYqj3OEvqyQgrpUe5FHAihZNq0nvoPJp9QrR98KaNf1lR2LfRwzCAthaceEfONBcnku 9TjCup9cyOiqq3teIEwGyg35tHj5ItoB6sggWezXbR/mgyI1v16Sv8kv5M5Gv21fW74f pqSfbJ7uW2CTnDG8ytNMQTbMGvwuqtQ9yL6GhVsZc/agX7M5tbMrJRV0J3n5t1MkSZ3/ EBs39SP+RRZcjtJbumkeO5138yDgnUnii358OCJTqUpDimC93tWP808tsYg4FnoLAeHp HMiw== X-Forwarded-Encrypted: i=1; AHgh+Ro3EXrV9U2++smDORWpsTsN8Sc0kM/nfwpU0etgd6YL2mRkJ7H7CMsdadgZY0aeohm/5FSlomgAVYb2XSI=@vger.kernel.org X-Gm-Message-State: AFuF++k3gIQJHrSeWe7JFzSeqfPO6m0MDcIPbWxlk+eD3FEPPEd2F+Ch wamI28PAUZbECaJA40RkBSjKy0VLCy3pOOE9K29wnLjTs7+hxBVgEYGLr3lKhk8E X-Gm-Gg: AR+sD13sxPgrLSYw2CsKe/OXqalkFyiuRIpHZydE6a6PCDD6c6qIf+kD8dGlY1RLvU5 6S0M53MkgFkcj3HR2yYoSFeSlngXGnFaDBg9wlh3JT0kx200hrlH8W/2VYvbEQvRFPooGKfiTF2 twvbKKwdQDZ/wp82K4uMRtvkMmIUQnRMKSTKXE8VHOiePm1EE+2yqkHicu/Fowz5ox08btbUkPm 2Y/YgQdtgG81J/nMF4YVoXBwTzmkYZWHp09aMCLTezpd6v96uvlsmlEHP8f23tiPNPFeGnngz15 xcDslIt56h80uzmpR7jocNjhXuTJbBT9KPeLkrI67RwVMHFooTSzDCEUZoDAeTLX9ZeBlI8Uxd4 kXtPREE7Ejuiogp9pBShOhsHkOuXdVBeWAA2XBIumKu1IZmvZn1QY42uR46dqIeEp0xaSTswmUJ tbgg12Zf2ObhKC4J/5tPAiTs3HU0mUQ6rtXRJeRtcHmZzQx5Qe3cefNi4lPle3Cd9OZbImQRSB9 VsGQuYatCTdx7BzVh79IJn26iVW5gsyUaX7PD8Mk3XKZo+A10UZSKNsz6P1fEzAqDtyZDT7goxY cJijTd6UCZledhFyD1msruAbDpdsruFhR1JrvIVW5ZUdARmifRyZVVL2+k3ZhGLFVXHb X-Received: by 2002:a05:6402:42c4:b0:6a3:e813:8457 with SMTP id 4fb4d7f45d1cf-6a42f1f9e90mr13698572a12.12.1787392446101; Sat, 22 Aug 2026 02:54:06 -0700 (PDT) Received: from localhost.localdomain (dynamic-2a02-3100-a0f5-8c01-3de3-cd62-aa6f-2fb0.310.pool.telefonica.de. [2a02:3100:a0f5:8c01:3de3:cd62:aa6f:2fb0]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6a3ff0c327asm11151586a12.8.2026.08.22.02.54.04 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 22 Aug 2026 02:54:05 -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 v3 5/5] KVM: arm64: selftests: Test VGICv3 redistributor region retry Date: Sat, 22 Aug 2026 11:53:46 +0200 Message-Id: <20260822095346.53882-6-kmehltretter@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20260822095346.53882-1-kmehltretter@gmail.com> References: <20260822095346.53882-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 Tested-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)