From nobody Wed May  7 20:06:27 2025
Received: from us-smtp-delivery-124.mimecast.com
 (us-smtp-delivery-124.mimecast.com [170.10.133.124])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id BEFCC2222AD
	for <linux-kernel@vger.kernel.org>; Tue,  1 Apr 2025 16:12:13 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=170.10.133.124
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1743523935; cv=none;
 b=kqWvIj23lXWCOdJtHGjvxckaIs6i4GKEfeU8T+BvWoYGrZAnvxCaUXYEjurqOVd3IRNgXjdYG4dm91nF+91dpRu9MKbB/9ONPfFD86yHSiIjc9M1zjVNLsMb3AmnFitQXbxzLHQUwMSlJQPXWf1iHTuxKgNpbEeGT0zgKSJAWF0=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1743523935; c=relaxed/simple;
	bh=kQoni2s9+27EXmP2XI2+CYoemw/pJEF7XDPIcFmDe2g=;
	h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:
	 MIME-Version;
 b=DsTFHp5Y5NyPXR9a6JSLB6UR9s5Wsig3sEv5WSgDDffIBIXwcLuK9aHo6GtM9EYZVLwOZWupRgEO3NOJWutLsrh40+qSGd7PI5opfzuck0n06uGEp6iL7A3qLfJrkTvkjlwmfu/sXFKFQLIUP++lAty7kEs2/O891CL5SeK0r0s=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dmarc=pass (p=quarantine dis=none) header.from=redhat.com;
 spf=pass smtp.mailfrom=redhat.com;
 dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com
 header.b=CIgVf/80; arc=none smtp.client-ip=170.10.133.124
Authentication-Results: smtp.subspace.kernel.org;
 dmarc=pass (p=quarantine dis=none) header.from=redhat.com
Authentication-Results: smtp.subspace.kernel.org;
 spf=pass smtp.mailfrom=redhat.com
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com
 header.b="CIgVf/80"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;
	s=mimecast20190719; t=1743523932;
	h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
	 to:to:cc:cc:mime-version:mime-version:
	 content-transfer-encoding:content-transfer-encoding:
	 in-reply-to:in-reply-to:references:references;
	bh=ChySLp6+UIK2NHqTKpsGQPiliMxZce6mgamUWnpoK/k=;
	b=CIgVf/80JkAVEyct9qC1txCqW5Y4H4e6r7CJROF1qibDV5TJFRdkugl+wNKrR7IgAGAJHF
	fwUm7BiulzOG/DQog8b2j/k1pDQYdQdJu968YipdLXhBMiv2fvj2Mr22789/2QK5UpAQg4
	aSSgYozVEbFLtEtudSV+NCqg46EfnsE=
Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com
 [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS
 (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id
 us-mta-610-06pVHRwPMzmXxrz1ItmeAQ-1; Tue, 01 Apr 2025 12:12:12 -0400
X-MC-Unique: 06pVHRwPMzmXxrz1ItmeAQ-1
X-Mimecast-MFC-AGG-ID: 06pVHRwPMzmXxrz1ItmeAQ_1743523931
Received: by mail-wm1-f71.google.com with SMTP id
 5b1f17b1804b1-43bd0586a73so44997205e9.2
        for <linux-kernel@vger.kernel.org>;
 Tue, 01 Apr 2025 09:12:11 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20230601; t=1743523930; x=1744128730;
        h=content-transfer-encoding:mime-version:references:in-reply-to
         :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc
         :subject:date:message-id:reply-to;
        bh=ChySLp6+UIK2NHqTKpsGQPiliMxZce6mgamUWnpoK/k=;
        b=SZUzF2+cGrwWBLM7RfeRFcx8rMXj8fy0JM7H22jN6dRUxjZYWESLcMt8VI6LfkBtAt
         FZUSO+r0oVBBj5EMKHZa8zFFmsT3wgrfNLWx2mhvSoimFuZEwhyFtg2Dos/p8NPvBwOR
         fTiuQDV3mNtgPjn+9lnCYGH9adZ2G4ZWc3AwiN+PKzxyRKsWLXYJ9JwQrf2bOTUMmVB/
         xnd6/r6OaSJA2ZsgD4zhHK1ljOuUMok3FQiSFNP5pC0qiM5DgSDG7vMIT39ZiuIILgNT
         e6zCO13aGd0uONycvOymR9AqMguOsvrh9enKueXhTm+r0z2ikkQr1QkDfOnreSyy4iaS
         f7JQ==
X-Gm-Message-State: AOJu0YzFxvvMrP5MIOFoBJxxM6p7ctW5aQf140DW1VYK89qJT638gOCQ
	9thM3xQh4do1F5p4quwAr9QQB49hlCSTQ13VoVh8Ivq71LfumD/AI/9LIAMlFOy+1ByhxOj2G/m
	2OR7ftTu2ZLU2LVh//mleHucnIlxfMoUpty7Blq7RJYke4JzeH9x45Q3cHY2eIqKDdgKc2HXE74
	bgl7PnNNxld9VLa/UNA+Lkh16i2qhIPBglfLrv6+CJnr2uxg==
X-Gm-Gg: ASbGncuFN0Q7Lf4Tml5LCP5QSZYhSubawJtTYiBHzDi/MiToPrKH4RC/m5E89ZRH5jU
	tdyZAeebkg1s2NLCsOjAHIvQeDfIPhSkSI2owohXsN5DKeTYiyr01kNBjUcKPvWSo7uY3iS/c+n
	XxZ1BngQKjkypP61QtPYFwMmCdQiUavIGzJjcoZqDpwtKY5PTqHRSa4gVq/qQKGkJU6apVxVAqT
	/vcXaMQbhVFtAybcYXDc5XA6RylEDxRrXAQs3Aq5h44F63bvgj3JuoJQcvtdt8ZZc1pHKDVlK7G
	cyrP5BdT2PG4G/75YTb43w==
X-Received: by 2002:a05:600c:6b6c:b0:43d:fa59:be39 with SMTP id
 5b1f17b1804b1-43dfa59bf9fmr83046245e9.33.1743523930234;
        Tue, 01 Apr 2025 09:12:10 -0700 (PDT)
X-Google-Smtp-Source: 
 AGHT+IEZXiJ8c1MKAD59oM+jxw4s6wIAOa62pt3LsarDDoqS1UAAl1mtYiWot9iqnkG352qXMDvHFg==
X-Received: by 2002:a05:600c:6b6c:b0:43d:fa59:be39 with SMTP id
 5b1f17b1804b1-43dfa59bf9fmr83045935e9.33.1743523929800;
        Tue, 01 Apr 2025 09:12:09 -0700 (PDT)
Received: from [192.168.10.48] ([176.206.111.201])
        by smtp.gmail.com with ESMTPSA id
 5b1f17b1804b1-43d8fbbfef2sm160662985e9.11.2025.04.01.09.12.07
        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
        Tue, 01 Apr 2025 09:12:08 -0700 (PDT)
From: Paolo Bonzini <pbonzini@redhat.com>
To: linux-kernel@vger.kernel.org,
	kvm@vger.kernel.org
Cc: roy.hopkins@suse.com,
	seanjc@google.com,
	thomas.lendacky@amd.com,
	ashish.kalra@amd.com,
	michael.roth@amd.com,
	jroedel@suse.de,
	nsaenz@amazon.com,
	anelkz@amazon.de,
	James.Bottomley@HansenPartnership.com
Subject: [PATCH 22/29] KVM: x86: implement initial plane support
Date: Tue,  1 Apr 2025 18:10:59 +0200
Message-ID: <20250401161106.790710-23-pbonzini@redhat.com>
X-Mailer: git-send-email 2.49.0
In-Reply-To: <20250401161106.790710-1-pbonzini@redhat.com>
References: <20250401161106.790710-1-pbonzini@redhat.com>
Precedence: bulk
X-Mailing-List: linux-kernel@vger.kernel.org
List-Id: <linux-kernel.vger.kernel.org>
List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org>
List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

Implement more of the shared state, namely the PIO emulation area
and ioctl(KVM_RUN).

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 arch/x86/kvm/x86.c | 45 +++++++++++++++++++++++++++++++++++----------
 1 file changed, 35 insertions(+), 10 deletions(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index ebdbd08a840b..d2b43d9b6543 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -11567,7 +11567,7 @@ static void kvm_put_guest_fpu(struct kvm_vcpu *vcpu)
 	trace_kvm_fpu(0);
 }
=20
-int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
+static int kvm_vcpu_ioctl_run_plane(struct kvm_vcpu *vcpu)
 {
 	struct kvm_queued_exception *ex =3D &vcpu->arch.exception;
 	struct kvm_run *kvm_run =3D vcpu->run;
@@ -11585,7 +11585,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
=20
 	kvm_vcpu_srcu_read_lock(vcpu);
 	if (unlikely(vcpu->arch.mp_state =3D=3D KVM_MP_STATE_UNINITIALIZED)) {
-		if (!vcpu->wants_to_run) {
+		if (!vcpu->plane0->wants_to_run) {
 			r =3D -EINTR;
 			goto out;
 		}
@@ -11664,7 +11664,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
 		WARN_ON_ONCE(vcpu->mmio_needed);
 	}
=20
-	if (!vcpu->wants_to_run) {
+	if (!vcpu->plane0->wants_to_run) {
 		r =3D -EINTR;
 		goto out;
 	}
@@ -11687,6 +11687,25 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
 	return r;
 }
=20
+int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
+{
+	int plane_id =3D READ_ONCE(vcpu->run->plane);
+	struct kvm_plane *plane =3D vcpu->kvm->planes[plane_id];
+	int r;
+
+	if (plane_id) {
+		vcpu =3D kvm_get_plane_vcpu(plane, vcpu->vcpu_id);
+		mutex_lock_nested(&vcpu->mutex, 1);
+	}
+
+	r =3D kvm_vcpu_ioctl_run_plane(vcpu);
+
+	if (plane_id)
+		mutex_unlock(&vcpu->mutex);
+
+	return r;
+}
+
 static void __get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
 {
 	if (vcpu->arch.emulate_regs_need_sync_to_vcpu) {
@@ -12366,7 +12385,7 @@ static int kvm_init_guest_fpstate(struct kvm_vcpu *=
vcpu, struct kvm_vcpu *plane0
=20
 int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu, struct kvm_plane *plane)
 {
-	struct page *page;
+	struct page *page =3D NULL;
 	int r;
=20
 	vcpu->arch.last_vmentry_cpu =3D -1;
@@ -12390,10 +12409,15 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu, s=
truct kvm_plane *plane)
=20
 	r =3D -ENOMEM;
=20
-	page =3D alloc_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO);
-	if (!page)
-		goto fail_free_lapic;
-	vcpu->arch.pio_data =3D page_address(page);
+	if (plane->plane) {
+		page =3D NULL;
+		vcpu->arch.pio_data =3D vcpu->plane0->arch.pio_data;
+	} else {
+		page =3D alloc_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO);
+		if (!page)
+			goto fail_free_lapic;
+		vcpu->arch.pio_data =3D page_address(page);
+	}
=20
 	vcpu->arch.mce_banks =3D kcalloc(KVM_MAX_MCE_BANKS * 4, sizeof(u64),
 				       GFP_KERNEL_ACCOUNT);
@@ -12451,7 +12475,7 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu, str=
uct kvm_plane *plane)
 fail_free_mce_banks:
 	kfree(vcpu->arch.mce_banks);
 	kfree(vcpu->arch.mci_ctl2_banks);
-	free_page((unsigned long)vcpu->arch.pio_data);
+	__free_page(page);
 fail_free_lapic:
 	kvm_free_lapic(vcpu);
 fail_mmu_destroy:
@@ -12500,7 +12524,8 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
 	idx =3D srcu_read_lock(&vcpu->kvm->srcu);
 	kvm_mmu_destroy(vcpu);
 	srcu_read_unlock(&vcpu->kvm->srcu, idx);
-	free_page((unsigned long)vcpu->arch.pio_data);
+	if (!vcpu->plane)
+		free_page((unsigned long)vcpu->arch.pio_data);
 	kvfree(vcpu->arch.cpuid_entries);
 }
=20
--=20
2.49.0