From patchwork Tue Jan 9 19:38:02 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elliot Berman X-Patchwork-Id: 13515291 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 B0553C47258 for ; Tue, 9 Jan 2024 19:39:13 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 717C18D0014; Tue, 9 Jan 2024 14:38:17 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 6A5738D0010; Tue, 9 Jan 2024 14:38:17 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4F1158D0014; Tue, 9 Jan 2024 14:38:17 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 3B6508D0010 for ; Tue, 9 Jan 2024 14:38:17 -0500 (EST) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 186E71609D9 for ; Tue, 9 Jan 2024 19:38:17 +0000 (UTC) X-FDA: 81660783834.13.8410B90 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) by imf12.hostedemail.com (Postfix) with ESMTP id CB4874001C for ; Tue, 9 Jan 2024 19:38:13 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=quicinc.com header.s=qcppdkim1 header.b=JsCn3DAO; spf=pass (imf12.hostedemail.com: domain of quic_eberman@quicinc.com designates 205.220.180.131 as permitted sender) smtp.mailfrom=quic_eberman@quicinc.com; dmarc=pass (policy=none) header.from=quicinc.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1704829093; 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=+Qmhckol3LBZQwJot12EAf5bVy2Rf/uHyT+4To7C3J0=; b=ZAX3VyDJN0d8c2kc4ZKr7ZsMpF40tiySSzPmH1vCU4pnuSdoJNaL4x8Umu6S/e2Zt1DJrm e4m9rEJ5Qyj4KATpjxLi0H/DHVERJESTIafozZ5QcITThL6qr96X6+p+AKvKPYdUGxTPLr IlZFoT4hw2LtQVfmr2HK00t7CFq1+t0= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=quicinc.com header.s=qcppdkim1 header.b=JsCn3DAO; spf=pass (imf12.hostedemail.com: domain of quic_eberman@quicinc.com designates 205.220.180.131 as permitted sender) smtp.mailfrom=quic_eberman@quicinc.com; dmarc=pass (policy=none) header.from=quicinc.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1704829093; a=rsa-sha256; cv=none; b=q4omihOiRDE2BlQA8D9YbzkcGMGYDKBJdU2zDGA2P+kqJQtyuS67hVaIA1MBxYSLim8VPT DGQFYWSx3QsWNHxDWII2nkSv717DDPV+oVT2v2ddZvUem7/JpFUvQ/U6H1JHXcwliHdyzA nEGcBaOkBVa1hbrOfqSXML7FtaaCFzQ= Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.24/8.17.1.24) with ESMTP id 409Gxr33016339; Tue, 9 Jan 2024 19:38:06 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h= from:date:subject:mime-version:content-type :content-transfer-encoding:message-id:references:in-reply-to:to :cc; s=qcppdkim1; bh=+Qmhckol3LBZQwJot12EAf5bVy2Rf/uHyT+4To7C3J0 =; b=JsCn3DAOL5dGuQbg9AbPFtybTs8AbU3IU2fM3psZaVJd0bp4eXfrdU2bh5F lxw5tC2mrLFKnWXpebotu98uqHEyO28xAVT9DcwzD1HByxVeCsTcn158gnjTsqPI fO/kAuTTIY0qLBYlspE2V740EKQb8L9O4Z+Ln1iP35goGy0SAPdXxBc3a+Zgkndi 8Nd1mk0nUBzI0bpD4aZ2OFndYd5KgxMeV0Q/orT+c35hx31z/eYBDxi3Sp0kejxy lWsY9Xcr5DXWB39cvJg+5T91iDLwf9SSTcV1SWGNUrdb9Si5PYM2xfgRt+GOeoLW 32vY+VLeVYgS3dzO5Z0vR5rmJNA== Received: from nasanppmta04.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3vh85t0pnu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 09 Jan 2024 19:38:06 +0000 (GMT) Received: from nasanex01b.na.qualcomm.com (nasanex01b.na.qualcomm.com [10.46.141.250]) by NASANPPMTA04.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 409Jc5Co030549 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 9 Jan 2024 19:38:05 GMT Received: from hu-eberman-lv.qualcomm.com (10.49.16.6) by nasanex01b.na.qualcomm.com (10.46.141.250) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.40; Tue, 9 Jan 2024 11:38:04 -0800 From: Elliot Berman Date: Tue, 9 Jan 2024 11:38:02 -0800 Subject: [PATCH v16 24/34] virt: gunyah: Share guest VM dtb configuration to Gunyah MIME-Version: 1.0 Message-ID: <20240109-gunyah-v16-24-634904bf4ce9@quicinc.com> References: <20240109-gunyah-v16-0-634904bf4ce9@quicinc.com> In-Reply-To: <20240109-gunyah-v16-0-634904bf4ce9@quicinc.com> To: Alex Elder , Srinivas Kandagatla , Murali Nalajal , Trilok Soni , Srivatsa Vaddagiri , Carl van Schaik , Philip Derrin , Prakruthi Deepak Heragu , Jonathan Corbet , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Catalin Marinas , Will Deacon , Konrad Dybcio , Bjorn Andersson , Dmitry Baryshkov , "Fuad Tabba" , Sean Christopherson , "Andrew Morton" CC: , , , , , , Elliot Berman X-Mailer: b4 0.13-dev X-Originating-IP: [10.49.16.6] X-ClientProxiedBy: nalasex01c.na.qualcomm.com (10.47.97.35) To nasanex01b.na.qualcomm.com (10.46.141.250) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: vUg_t-T6NwaXapDllJE2l2cgFSriSpBt X-Proofpoint-GUID: vUg_t-T6NwaXapDllJE2l2cgFSriSpBt X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.997,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-12-09_01,2023-12-07_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 bulkscore=0 malwarescore=0 suspectscore=0 mlxlogscore=999 clxscore=1015 priorityscore=1501 adultscore=0 impostorscore=0 phishscore=0 spamscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2311290000 definitions=main-2401090158 X-Rspamd-Queue-Id: CB4874001C X-Rspam-User: X-Stat-Signature: yqhh8rwqc3kbjjw767a38m6h4y489n4e X-Rspamd-Server: rspam01 X-HE-Tag: 1704829093-447074 X-HE-Meta: U2FsdGVkX19Ghx3T+HbGOaLANYW6i8u6f+BEJ+m+r0jXVEzdL4DCAknjysQ+peAC9O7W700QX7xaJzSWirfGWDFtziynNZ1mnso8j4TRHAMeQCa+axJSS+FUMO9DLZBuDS5blS1bOAgADyXiPEgSvjNEbbx4USkCj7T4SWwO49fd0ktnfWZkHSMnMboog/jCwMTb8z740xIrRuGF4Rhp21rdMuWnJB2pctCPX4ykta8LJy5+YCEI+/JOx9DEJnKpBw3BqcwGKXdddLwIHuq4STMgeaegmTMy/tZwFn/c+Bur83HfL8C/L+7d9lbpfGdiW+NpBH+PH2axvT8qFWDO5EKcrjmhQVKI8HxVlHu1Aq6TvE3drV02xGQ5Ialso8OR4ZOPzTeB/N4Vvhe6nH6L3aC5JzJMdhsC7AwPMqGgKqVMgyzHqk2TRp3Av/YDl5tF7m7JGXNCtaI1bHvkJcpLdnlS0smyGfhtkKq0l4b2D97TTee+lQ6/J0GcWyOoNBfLDLi4millc1r53hb0NT4KR4nuGV21o8VW+clgYYgKsqs3mRN2hsOmHHhhHEaahqd04RPDpqHu9czeUxL2oMxaKJnWxbO1WMaZMaCdUDHvdusJ5JbGNS550244pWFMrAX+MSJb+OBmqgQERHNqdnZGlYLJEFpe92bNYMvTrbti1slUurn/bJYekf7c14uHIKXmLmV83OGOAny6fO3sldeAViu9tU+eURiEro2tMXsBMOpl01dMk99lZtFGIbTJzI9WvKidEEOSCo6kDtFbsiB3gs5did/c0fN/3Fv5LW8PhWKoQmcC3HlUaFw5QR7XJhY4qK7nJ2SDwuknN7EHx5CyLyqYw93Nv3yzXM58qj3BKKRWlH4MRzfQrJuvLyk5nVquaKDF0xnvNU5BrRYr6IhDyhjOKMjWFsTFqctPBBj22MW1s704euXrdW3uN1rGo3rX5Ree9LbjAKrZ1vjY4M+ hiJf3nLn 2WbiUtQAP+d/Wqd+0JyxjKakcCaVAuAt+R2VHJc4g+CXirxwVMK+nBkBlsZfnQd3FqbxOBZiZBMOcY2e1jbDssC41GCf4XWAxnnjiVFub0MdnUMJERqH29zifeduVEE+M3tirb4NvLCczYG8T9WrgKttJP+VXgUXbdpe5jtBRRKPT+qmko91MMLOU4aogdS2jNvITOsGaxDyrvWBC/K4fJoL23V222LPS9ahGoK06QfqtNs+bul+EK+wndj4CCycOp4BdfdPBj+NF+qpOEfAqL9Sx+TyzsiHf3Pd3Rahbnlx0dLTe0GalWSWGMvcaBeQzSjJ7wbkyAxzbp9mEm2FQlzm2XiG3Tz4hkVFDXLxzjxqRUbyeuyWhiFEIwDvZWhqo+4dU 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: List-Subscribe: List-Unsubscribe: Gunyah Resource Manager sets up a virtual machine based on a device tree which lives in guest memory. Resource manager requires this memory to be provided as a memory parcel for it to read and manipulate. Construct a memory parcel, lend it to the virtual machine, and inform resource manager about the device tree location (the memory parcel ID and offset into the memory parcel). Signed-off-by: Elliot Berman --- drivers/virt/gunyah/vm_mgr.c | 49 ++++++++++++++++++++++++++++++++++++++++++-- drivers/virt/gunyah/vm_mgr.h | 13 +++++++++++- include/uapi/linux/gunyah.h | 14 +++++++++++++ 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/drivers/virt/gunyah/vm_mgr.c b/drivers/virt/gunyah/vm_mgr.c index be2061aa0a06..4379b5ba151e 100644 --- a/drivers/virt/gunyah/vm_mgr.c +++ b/drivers/virt/gunyah/vm_mgr.c @@ -445,8 +445,27 @@ static int gunyah_vm_start(struct gunyah_vm *ghvm) ghvm->vmid = ret; ghvm->vm_status = GUNYAH_RM_VM_STATUS_LOAD; - ret = gunyah_rm_vm_configure(ghvm->rm, ghvm->vmid, ghvm->auth, 0, 0, 0, - 0, 0); + ghvm->dtb.parcel_start = ghvm->dtb.config.guest_phys_addr >> PAGE_SHIFT; + ghvm->dtb.parcel_pages = ghvm->dtb.config.size >> PAGE_SHIFT; + /* RM requires the DTB parcel to be lent to guard against malicious + * modifications while starting VM. Force it so. + */ + ghvm->dtb.parcel.n_acl_entries = 1; + ret = gunyah_gmem_share_parcel(ghvm, &ghvm->dtb.parcel, + &ghvm->dtb.parcel_start, + &ghvm->dtb.parcel_pages); + if (ret) { + dev_warn(ghvm->parent, + "Failed to allocate parcel for DTB: %d\n", ret); + goto err; + } + + ret = gunyah_rm_vm_configure(ghvm->rm, ghvm->vmid, ghvm->auth, + ghvm->dtb.parcel.mem_handle, 0, 0, + ghvm->dtb.config.guest_phys_addr - + (ghvm->dtb.parcel_start + << PAGE_SHIFT), + ghvm->dtb.config.size); if (ret) { dev_warn(ghvm->parent, "Failed to configure VM: %d\n", ret); goto err; @@ -485,6 +504,8 @@ static int gunyah_vm_start(struct gunyah_vm *ghvm) goto err; } + WARN_ON(gunyah_vm_parcel_to_paged(ghvm, &ghvm->dtb.parcel, ghvm->dtb.parcel_start, ghvm->dtb.parcel_pages)); + ghvm->vm_status = GUNYAH_RM_VM_STATUS_RUNNING; up_write(&ghvm->status_lock); return ret; @@ -531,6 +552,21 @@ static long gunyah_vm_ioctl(struct file *filp, unsigned int cmd, long r; switch (cmd) { + case GUNYAH_VM_SET_DTB_CONFIG: { + struct gunyah_vm_dtb_config dtb_config; + + if (copy_from_user(&dtb_config, argp, sizeof(dtb_config))) + return -EFAULT; + + if (overflows_type(dtb_config.guest_phys_addr + dtb_config.size, + u64)) + return -EOVERFLOW; + + ghvm->dtb.config = dtb_config; + + r = 0; + break; + } case GUNYAH_VM_START: { r = gunyah_vm_ensure_started(ghvm); break; @@ -589,6 +625,15 @@ static void _gunyah_vm_put(struct kref *kref) if (ghvm->vm_status == GUNYAH_RM_VM_STATUS_RUNNING) gunyah_vm_stop(ghvm); + if (ghvm->vm_status == GUNYAH_RM_VM_STATUS_LOAD) { + ret = gunyah_gmem_reclaim_parcel(ghvm, &ghvm->dtb.parcel, + ghvm->dtb.parcel_start, + ghvm->dtb.parcel_pages); + if (ret) + dev_err(ghvm->parent, + "Failed to reclaim DTB parcel: %d\n", ret); + } + gunyah_vm_remove_functions(ghvm); down_write(&ghvm->bindings_lock); diff --git a/drivers/virt/gunyah/vm_mgr.h b/drivers/virt/gunyah/vm_mgr.h index a79c11f1c3a5..b2ab2f1bda3a 100644 --- a/drivers/virt/gunyah/vm_mgr.h +++ b/drivers/virt/gunyah/vm_mgr.h @@ -72,6 +72,13 @@ long gunyah_dev_vm_mgr_ioctl(struct gunyah_rm *rm, unsigned int cmd, * @resource_tickets: List of &struct gunyah_vm_resource_ticket * @auth: Authentication mechanism to be used by resource manager when * launching the VM + * @dtb: For tracking dtb configuration when launching the VM + * @dtb.config: Location of the DTB in the guest memory + * @dtb.parcel_start: Guest frame number where the memory parcel that we lent to + * VM (DTB could start in middle of folio; we lend entire + * folio; parcel_start is start of the folio) + * @dtb.parcel_pages: Number of pages lent for the memory parcel + * @dtb.parcel: Data for resource manager to lend the parcel * * Members are grouped by hot path. */ @@ -101,7 +108,11 @@ struct gunyah_vm { struct device *parent; enum gunyah_rm_vm_auth_mechanism auth; - + struct { + struct gunyah_vm_dtb_config config; + u64 parcel_start, parcel_pages; + struct gunyah_rm_mem_parcel parcel; + } dtb; }; int gunyah_vm_parcel_to_paged(struct gunyah_vm *ghvm, diff --git a/include/uapi/linux/gunyah.h b/include/uapi/linux/gunyah.h index 1af4c5ae6bc3..a89d9bedf3e5 100644 --- a/include/uapi/linux/gunyah.h +++ b/include/uapi/linux/gunyah.h @@ -42,6 +42,20 @@ struct gunyah_create_mem_args { /* * ioctls for gunyah-vm fds (returned by GUNYAH_CREATE_VM) */ + +/** + * struct gunyah_vm_dtb_config - Set the location of the VM's devicetree blob + * @guest_phys_addr: Address of the VM's devicetree in guest memory. + * @size: Maximum size of the devicetree including space for overlays. + * Resource manager applies an overlay to the DTB and dtb_size should + * include room for the overlay. A page of memory is typicaly plenty. + */ +struct gunyah_vm_dtb_config { + __u64 guest_phys_addr; + __u64 size; +}; +#define GUNYAH_VM_SET_DTB_CONFIG _IOW(GUNYAH_IOCTL_TYPE, 0x2, struct gunyah_vm_dtb_config) + #define GUNYAH_VM_START _IO(GUNYAH_IOCTL_TYPE, 0x3) /**