From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8211CC61DA3 for ; Fri, 24 Feb 2023 15:12:54 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 0DE496B0071; Fri, 24 Feb 2023 10:12:54 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 08E176B0073; Fri, 24 Feb 2023 10:12:54 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E71AA6B0074; Fri, 24 Feb 2023 10:12:53 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id D58056B0071 for ; Fri, 24 Feb 2023 10:12:53 -0500 (EST) Received: from smtpin19.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 98793160480 for ; Fri, 24 Feb 2023 15:12:53 +0000 (UTC) X-FDA: 80502527826.19.387837F Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) by imf15.hostedemail.com (Postfix) with ESMTP id 978C7A0009 for ; Fri, 24 Feb 2023 15:12:51 +0000 (UTC) Authentication-Results: imf15.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=C1Gl8NWE; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf15.hostedemail.com: domain of zhi.wang.linux@gmail.com designates 209.85.208.47 as permitted sender) smtp.mailfrom=zhi.wang.linux@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1677251571; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=r3QZB4TfMdCwmEYdbGrhQi/oX08bvtvcvl8M28Xvs1g=; b=A6ZfmPHOKH+z2qbsuilKLx9VbqoXTG9Zb051VAAelE0s9bBIANAT175PpegyA8x3kLtOrZ De/xgBGuvEsp/dtoOC+1sUar03w/N6XNGlSgBa+lcVQli622UM0KKJ4TF8sHsDGrCJdJGl SiBZznrCL0Ue7zv0+nsVd7EZ272oviE= ARC-Authentication-Results: i=1; imf15.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=C1Gl8NWE; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf15.hostedemail.com: domain of zhi.wang.linux@gmail.com designates 209.85.208.47 as permitted sender) smtp.mailfrom=zhi.wang.linux@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1677251571; a=rsa-sha256; cv=none; b=sP5xcA5BKg12MrZrEqDT+ZqXOASACCWV83DR74/LNbBQnJ8lF/1y0xfKTRCNPNCXk6Y9yk Ii8PeTmPcAmzh7zfi5uiGf/8Sy9Qkpzp0sdqAY9d3Zzx9DLxX+oxM53h3Qm+wqO/ptxacf Eu/hJfX2//aKUxwDj5tfIbDriRHm04A= Received: by mail-ed1-f47.google.com with SMTP id ee7so40872418edb.2 for ; Fri, 24 Feb 2023 07:12:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:subject:cc:to:from:date:from:to:cc:subject:date :message-id:reply-to; bh=r3QZB4TfMdCwmEYdbGrhQi/oX08bvtvcvl8M28Xvs1g=; b=C1Gl8NWEYK3WMxfju4xsAu9HaKmq8aXEd7DJYgqK6k94bdTiWaCBwCm3WADAIPy67s Ea/TP3czgCcAgvWk0Xe7Dp56xBZ45Hj8tFRnF2T0kKu5JyA7D0D/UvkLbSnVm/M1keE0 Gi3Q2sOiSLEgV8XZRXZ1eB9d3jdOeRxW2k2K3UY9O/oBGLew0FEorv9babK8B+4Iq+G7 OYtt0Cgumic0hQ0Vt7eoTbWh0+raaiee8xAs7yVZczQJH1shkFo+++BqzLjbnqFAf/Um Z99cG9NIXVRMEWoqsQuOmRLugAuZS9r5ShZZ1xMnlr1l41BYy9qp5G8dLK2u3D0ePDcz emrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:subject:cc:to:from:date:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=r3QZB4TfMdCwmEYdbGrhQi/oX08bvtvcvl8M28Xvs1g=; b=Q3Gy5ohb5NMilzvKklglrP+eYGr4iZUmBkNxEnpPmlFonSyEO0qn2/APrbkH6/B0NX mx0+iadAKiUYUJIU1oxIWeoQNTqWYM7TX0b/GAkYm8rHlvuE2ucCLU5gn4CH+2o2yyYg pqYtTB5mYIv7SoE5iq90IRe7Jg+7wt4qirhRmSFYFIqSsi950yeijcp5YdR+D0Us4ZNC mnQ9rfE6QOM8t9Bu0lszcKk6IoqDciUnRkptSAAFfP/Xtqq8lgmpS3sLCHVi3zsPE5pV 3gKXFJOusagEaXhLyMfLgHIwngy+8cTAtkanRAsuM6z6w2Kcztf4iLk0pWughY3Ccq/E 1Azw== X-Gm-Message-State: AO0yUKVJ0RZ66eh/F9EzfLTT65jrmu7GHBuYwmHWVT+WQFyftlJ3Lahh GnTsSK4DJts6wIQn6gRDP2Bus3YOXXK7ng== X-Google-Smtp-Source: AK7set+vcOPNv5TrtvcImV1tnxleSzTn9w+ohnJhraUXj9D7VsufdJnfvxHEIBXmp//BnkJdKCHRqA== X-Received: by 2002:a05:651c:554:b0:293:2c7e:bf53 with SMTP id q20-20020a05651c055400b002932c7ebf53mr8216266ljp.0.1677251193686; Fri, 24 Feb 2023 07:06:33 -0800 (PST) Received: from localhost (88-115-161-74.elisa-laajakaista.fi. [88.115.161.74]) by smtp.gmail.com with ESMTPSA id p25-20020a2ea4d9000000b00295a32db4e1sm346142ljm.91.2023.02.24.07.06.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Feb 2023 07:06:33 -0800 (PST) Date: Fri, 24 Feb 2023 17:06:31 +0200 From: Zhi Wang To: Michael Roth Cc: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Brijesh Singh Subject: Re: [PATCH RFC v8 41/56] KVM: SVM: Add support to handle MSR based Page State Change VMGEXIT Message-ID: <20230224170631.000016f1@gmail.com> In-Reply-To: <20230220183847.59159-42-michael.roth@amd.com> References: <20230220183847.59159-1-michael.roth@amd.com> <20230220183847.59159-42-michael.roth@amd.com> X-Mailer: Claws Mail 4.1.0 (GTK 3.24.33; x86_64-w64-mingw32) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: 978C7A0009 X-Rspamd-Server: rspam09 X-Rspam-User: X-Stat-Signature: g1tp1gd6xwiotzz5eziqcy9zahuddweo X-HE-Tag: 1677251571-848200 X-HE-Meta: U2FsdGVkX19HnMff5Ww2OaWPHZlOvMQZsKTmbna0fejwmUO2aRzQgmoDaiDBuzarGqRTtilVLdkOfmUocCGP4zG/cGQ8y/457Auv7JKvq0tPk8eRp7tsmvUNBQKhephb2f74Qgv3jKvNPLDl59KMNe9H66f9yBbsxIayBXZp1ePaDnF7G3mBGR6Qd8h5UAVn4GuqIqdkN4e6uyFt7Erql7lUaum5+KA9W04zY+XTso7YF5hU8o3uE/lhgEx/XBq3SX1NHjTX1dny9rLUdx39EVeqUSDvkcO5V3OO4tCAH7KF/SLuiLcBWhh4Hftq5rDJwDIIcpUJ30gU6WvqgjAc0jyOv00n+14E9bn9ChlK1LHNPpNPBD74/wq1Jcx2CjizSTNtW6i1/KHWntta8LNpaZfIamSP+Q4H+e+4xe2bU7Y7m/pNtzIZnXqWsrbogPtRrbGBodN0y295u7mL/7ibGh1o9gH2bPYUbulpx0GIsZuhusKbZEtaAIdBDJJdbUHXebxFkFFwE12nvwym1pcRwR/r4vogDWJ92a1gdqNc/KU4hzsohfDYopj4EGIrGoRKNhBYwmH7F/KqXxGbxiObvzmJCd8Z3F8JgylZjefUH7TQlJYhajtwUcXX1QH2Ja+3TjLi/hwB2VuJD+Pi0kw5ngBD//9oHpmj2sJMKlRmOWmDxvWdf/A00TG2PlPEztNTXYjSkf8sJVnlfbMmEqkjfejjKuSJ6D9kh7oO5JOdyV3efbs7DJ9tY7s4abuLqAWuG3vFpynS8k2BduGiBOuAHgPAUDZnprWjOTjHimwaNNbZYUwgXoIdCjQ2SXndTiYRhYujREHZXq8l7Zvh+MlG3zdzbLOWVegpWPIJ1Qbb+Rzmm+99zQOvM3xFFeh55FhxDoQg+ZoPmLz9yMgbaixpqVVwet/Pg1meXUuVhd+0prW7FxGcPh7AM6PQl41zPucykilD51iX6o2IcXV5/py A3RMrsGY KbyRpSi40OrKguhnIn9za15pmgxhM7Qcu83exACwgfB9bDpFZ+ohafMmaGXm0vLql6zOqFzD+/fQk2Hh5kN4w8zVKhsf60tT6tsYwYGB82MnrPjOJB2xaNlvxFi3/pJtTHv4edgc+XcuSZR4HtvSRGDcuO2Y7pw061HoNon2FYZYR6XAK6e7uLzLlsElIdC4NTUhXN8Ogs9LCF8jwJQVlSKmrN7kuSdP1Yw1eKUQroYsT5bdDg1jq79azOTwAnUAx1mvD2uf25QfaLvCaPmwYoabdjWjHAm0xSbF9Xh5TYSl+Ma7rwDZSIQTPMOmWue1+/6H+XXIZkJqFg7aaGLrJoh0DC+tX+ffCWSOmwsLSBNbzAkQFctpd29DD7fe3kQQETC63DX+aH4sFCAuRVZUivec99eLbozzl+ienWsXm0xA2Brt5wEtwDPhTYoDLgcQhtIQeg6Ad+Qr+kAHCS4BfBVRe2qh3X+g+ET/gB+QSRA374Cqgh9aK0dlDtEns+jkSNNCb X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Mon, 20 Feb 2023 12:38:32 -0600 Michael Roth wrote: > From: Brijesh Singh > > SEV-SNP VMs can ask the hypervisor to change the page state in the RMP > table to be private or shared using the Page State Change MSR protocol > as defined in the GHCB specification. > > Forward these requests to userspace via KVM_EXIT_VMGEXIT so the VMM can > issue the KVM ioctls to update the page state accordingly. > It would be better to describe the design purpose. Like, why should the page state change VMGEIXT be forwarded to the userspace instead of being handled in the kernel. > Co-developed-by: Michael Roth > Signed-off-by: Michael Roth > Signed-off-by: Brijesh Singh > Signed-off-by: Ashish Kalra > --- > arch/x86/include/asm/sev-common.h | 9 ++++++++ > arch/x86/kvm/svm/sev.c | 25 +++++++++++++++++++++++ > arch/x86/kvm/trace.h | 34 +++++++++++++++++++++++++++++++ > arch/x86/kvm/x86.c | 1 + > 4 files changed, 69 insertions(+) > > diff --git a/arch/x86/include/asm/sev-common.h b/arch/x86/include/asm/sev-common.h > index 0a9055cdfae2..ee38f7408470 100644 > --- a/arch/x86/include/asm/sev-common.h > +++ b/arch/x86/include/asm/sev-common.h > @@ -93,6 +93,10 @@ enum psc_op { > }; > > #define GHCB_MSR_PSC_REQ 0x014 > +#define GHCB_MSR_PSC_GFN_POS 12 > +#define GHCB_MSR_PSC_GFN_MASK GENMASK_ULL(39, 0) > +#define GHCB_MSR_PSC_OP_POS 52 > +#define GHCB_MSR_PSC_OP_MASK 0xf > #define GHCB_MSR_PSC_REQ_GFN(gfn, op) \ > /* GHCBData[55:52] */ \ > (((u64)((op) & 0xf) << 52) | \ > @@ -102,6 +106,11 @@ enum psc_op { > GHCB_MSR_PSC_REQ) > > #define GHCB_MSR_PSC_RESP 0x015 > +#define GHCB_MSR_PSC_ERROR_POS 32 > +#define GHCB_MSR_PSC_ERROR_MASK GENMASK_ULL(31, 0) > +#define GHCB_MSR_PSC_ERROR GENMASK_ULL(31, 0) > +#define GHCB_MSR_PSC_RSVD_POS 12 > +#define GHCB_MSR_PSC_RSVD_MASK GENMASK_ULL(19, 0) > #define GHCB_MSR_PSC_RESP_VAL(val) \ > /* GHCBData[63:32] */ \ > (((u64)(val) & GENMASK_ULL(63, 32)) >> 32) > diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c > index 2613311f4fcc..a1a2686dde7b 100644 > --- a/arch/x86/kvm/svm/sev.c > +++ b/arch/x86/kvm/svm/sev.c > @@ -30,6 +30,7 @@ > #include "svm_ops.h" > #include "cpuid.h" > #include "trace.h" > +#include "mmu.h" > > #ifndef CONFIG_KVM_AMD_SEV > /* > @@ -3345,6 +3346,23 @@ static void set_ghcb_msr(struct vcpu_svm *svm, u64 value) > svm->vmcb->control.ghcb_gpa = value; > } > > +/* > + * TODO: need to get the value set by userspace in vcpu->run->vmgexit.ghcb_msr > + * and process that here accordingly. > + */ > +static int snp_complete_psc_msr_protocol(struct kvm_vcpu *vcpu) > +{ > + struct vcpu_svm *svm = to_svm(vcpu); > + > + set_ghcb_msr_bits(svm, 0, > + GHCB_MSR_PSC_ERROR_MASK, GHCB_MSR_PSC_ERROR_POS); > + > + set_ghcb_msr_bits(svm, 0, GHCB_MSR_PSC_RSVD_MASK, GHCB_MSR_PSC_RSVD_POS); > + set_ghcb_msr_bits(svm, GHCB_MSR_PSC_RESP, GHCB_MSR_INFO_MASK, GHCB_MSR_INFO_POS); > + > + return 1; /* resume */ > +} > + > static int sev_handle_vmgexit_msr_protocol(struct vcpu_svm *svm) > { > struct vmcb_control_area *control = &svm->vmcb->control; > @@ -3445,6 +3463,13 @@ static int sev_handle_vmgexit_msr_protocol(struct vcpu_svm *svm) > GHCB_MSR_INFO_POS); > break; > } > + case GHCB_MSR_PSC_REQ: > + vcpu->run->exit_reason = KVM_EXIT_VMGEXIT; > + vcpu->run->vmgexit.ghcb_msr = control->ghcb_gpa; > + vcpu->arch.complete_userspace_io = snp_complete_psc_msr_protocol; > + > + ret = -1; > + break; > case GHCB_MSR_TERM_REQ: { > u64 reason_set, reason_code; > > diff --git a/arch/x86/kvm/trace.h b/arch/x86/kvm/trace.h > index 83843379813e..65861d2d086c 100644 > --- a/arch/x86/kvm/trace.h > +++ b/arch/x86/kvm/trace.h > @@ -7,6 +7,7 @@ > #include > #include > #include > +#include > > #undef TRACE_SYSTEM > #define TRACE_SYSTEM kvm > @@ -1831,6 +1832,39 @@ TRACE_EVENT(kvm_vmgexit_msr_protocol_exit, > __entry->vcpu_id, __entry->ghcb_gpa, __entry->result) > ); > > +/* > + * Tracepoint for the SEV-SNP page state change processing > + */ > +#define psc_operation \ > + {SNP_PAGE_STATE_PRIVATE, "private"}, \ > + {SNP_PAGE_STATE_SHARED, "shared"} \ > + > +TRACE_EVENT(kvm_snp_psc, > + TP_PROTO(unsigned int vcpu_id, u64 pfn, u64 gpa, u8 op, int level), > + TP_ARGS(vcpu_id, pfn, gpa, op, level), > + > + TP_STRUCT__entry( > + __field(int, vcpu_id) > + __field(u64, pfn) > + __field(u64, gpa) > + __field(u8, op) > + __field(int, level) > + ), > + > + TP_fast_assign( > + __entry->vcpu_id = vcpu_id; > + __entry->pfn = pfn; > + __entry->gpa = gpa; > + __entry->op = op; > + __entry->level = level; > + ), > + > + TP_printk("vcpu %u, pfn %llx, gpa %llx, op %s, level %d", > + __entry->vcpu_id, __entry->pfn, __entry->gpa, > + __print_symbolic(__entry->op, psc_operation), > + __entry->level) > +); > + > #endif /* _TRACE_KVM_H */ > > #undef TRACE_INCLUDE_PATH > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 268c3d16894d..0154fc7a28c1 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -13515,6 +13515,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_vmgexit_enter); > EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_vmgexit_exit); > EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_vmgexit_msr_protocol_enter); > EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_vmgexit_msr_protocol_exit); > +EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_snp_psc); > > static int __init kvm_x86_init(void) > {