Received: by 2002:ab2:7041:0:b0:1f4:bcc8:f211 with SMTP id x1csp11893lql; Fri, 12 Apr 2024 01:52:21 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCUZ2hvQb96nO4yWaeVsa29TqJZUYpH9tfb0yIWlbbJLzLk93hGfT8zHjTBC61cX0rcPeB2vWwqOUaS5dwsZiEjxwPnYoEyMlN/FHJzbgw== X-Google-Smtp-Source: AGHT+IFmGGw5gJ0XQmTpRzsjXJcyN/ZYLWodA2XDcR5Br3A5jrK2BxdV+JDxqF8BaAYtt3QcOFdt X-Received: by 2002:a05:6359:3915:b0:183:a47e:6284 with SMTP id xa21-20020a056359391500b00183a47e6284mr2054277rwb.5.1712911941471; Fri, 12 Apr 2024 01:52:21 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712911941; cv=pass; d=google.com; s=arc-20160816; b=iNIT4S/NppKAMUpPcF41MwSAeIRIycPkV+6AwnXhoxWOOjFD8Uo5/H5Z/kLSgccYN6 Mb8Y6ufFJZBGWUiTrKjyZc01yJkVep1cXmFn6nXXS9HGhOwFS2btFmPV5U9+qFn3HzsF y3MqBfPGHBFOEcUhQMR+67PDzrhenjjM5EPmsPCerQ+A5MiL71oY/gS2ERoevYJisnUU p1lta+LztWYvJSItRZ5eANqwoipPBb+Nxf6gsU7+H9YjBFE4AuUO/sgo7qQzjomegfCm MoWtSeARBMfGM93/67DMDLwJIgZEFwzn8poqjcHDPWRGQ4OX1n3ouBRfIOlHqHpmv25R ktPA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=xW5SwNwu+i5z8/yUHoBzcXfB/3OZdVIS2lAZr/fwdLM=; fh=NDCPdPn2hiqHaiIRDYQAzsW9PK20CTia4nECGof6enU=; b=NglI1G1iZOPBDuNsyI5DPSrGQUK45tYAOB1h0DJKW1ryhKQV+NPV68V0fhRfCdFYba PZvKznNsWdJwEmGiN1ci3yPkUfwPyv5/ZGLTXwc+5/5XSrzNogbs3NCtGrVsFZlyJFKW mzB9fQJhoKFJpWiqsuw43rLdYE76k0grqKvwA+JVWza15fVLFBy0WvsSzUlip45isWmU 5Z/LUZ0LszDJUfXNjXcZ/Z/6X6IkOexaQ5UmqNB9bmFPqnJbTiHcZDaohc+keJ/LLnmr AxHZ6Q9MwpImL3xoxPP6HK07w7W1+doTuX+IW2Y9w/YCwQl+oN8WMXOvHr62UstkXKG+ nCSA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=arm.com dmarc=pass fromdomain=arm.com); spf=pass (google.com: domain of linux-kernel+bounces-142282-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-142282-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id u25-20020a63a919000000b005e85aa17485si2830622pge.713.2024.04.12.01.52.21 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Apr 2024 01:52:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-142282-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=arm.com dmarc=pass fromdomain=arm.com); spf=pass (google.com: domain of linux-kernel+bounces-142282-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-142282-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 04563283F38 for ; Fri, 12 Apr 2024 08:52:06 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A0B2678C70; Fri, 12 Apr 2024 08:43:48 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C789976C76; Fri, 12 Apr 2024 08:43:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712911428; cv=none; b=C93ArHmPSqF/OByOVe24I4QcT5P5y4/MY1Bha2fKEJ1fZls2yy0kNE2unytLHxPUqEQojD3lRTtLrRBjx1UD+WpScwhb0HisE4YqOZ2k3oqH3SQyNrLKZST1emdA7yeEsg9YrOKIlVPoXIx6lu1ekuW4QH91JbAROwXT0YYUoRI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712911428; c=relaxed/simple; bh=eFci8/D3KfsTC/UJni2cC6b8pORcVfFzYuza+HLKhBA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=BjbamK5901Mlgi5Yhhx5uN8vQW4yHp4uvsGxrr83s+sJZQM3X/rSLB4QUKXxgfg8aiEq/UZ8cPmD9q94BT1bA/nfEq9jGrUIc5m6F6mf90Oro5n/X9PO/v86TjvueEVGsjSiW5csRPqDuYN55QexapJwnTWIk3k7Ufp7LS8ytH0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id B82B21576; Fri, 12 Apr 2024 01:44:15 -0700 (PDT) Received: from e112269-lin.cambridge.arm.com (e112269-lin.cambridge.arm.com [10.1.194.51]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5C5003F6C4; Fri, 12 Apr 2024 01:43:44 -0700 (PDT) From: Steven Price To: kvm@vger.kernel.org, kvmarm@lists.linux.dev Cc: Steven Price , Catalin Marinas , Marc Zyngier , Will Deacon , James Morse , Oliver Upton , Suzuki K Poulose , Zenghui Yu , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly , Alexandru Elisei , Christoffer Dall , Fuad Tabba , linux-coco@lists.linux.dev, Ganapatrao Kulkarni Subject: [PATCH v2 12/43] arm64: RME: Keep a spare page delegated to the RMM Date: Fri, 12 Apr 2024 09:42:38 +0100 Message-Id: <20240412084309.1733783-13-steven.price@arm.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240412084309.1733783-1-steven.price@arm.com> References: <20240412084056.1733704-1-steven.price@arm.com> <20240412084309.1733783-1-steven.price@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Pages can only be populated/destroyed on the RMM at the 4KB granule, this requires creating the full depth of RTTs. However if the pages are going to be combined into a 4MB huge page the last RTT is only temporarily needed. Similarly when freeing memory the huge page must be temporarily split requiring temporary usage of the full depth oF RTTs. To avoid needing to perform a temporary allocation and delegation of a page for this purpose we keep a spare delegated page around. In particular this avoids the need for memory allocation while destroying the realm guest. Signed-off-by: Steven Price --- arch/arm64/include/asm/kvm_rme.h | 5 +++++ arch/arm64/kvm/rme.c | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/arch/arm64/include/asm/kvm_rme.h b/arch/arm64/include/asm/kvm_rme.h index cf8cc4d30364..fba85e9ce3ae 100644 --- a/arch/arm64/include/asm/kvm_rme.h +++ b/arch/arm64/include/asm/kvm_rme.h @@ -50,6 +50,9 @@ enum realm_state { * @state: The lifetime state machine for the realm * @rd: Kernel mapping of the Realm Descriptor (RD) * @params: Parameters for the RMI_REALM_CREATE command + * @spare_page: A physical page that has been delegated to the Realm world but + * is otherwise free. Used to avoid temporary allocation during + * RTT operations. * @num_aux: The number of auxiliary pages required by the RMM * @vmid: VMID to be used by the RMM for the realm * @ia_bits: Number of valid Input Address bits in the IPA @@ -60,6 +63,8 @@ struct realm { void *rd; struct realm_params *params; + phys_addr_t spare_page; + unsigned long num_aux; unsigned int vmid; unsigned int ia_bits; diff --git a/arch/arm64/kvm/rme.c b/arch/arm64/kvm/rme.c index 658d14e8d87d..9652ec6ab2fd 100644 --- a/arch/arm64/kvm/rme.c +++ b/arch/arm64/kvm/rme.c @@ -103,6 +103,7 @@ static int realm_create_rd(struct kvm *kvm) } realm->rd = rd; + realm->spare_page = PHYS_ADDR_MAX; if (WARN_ON(rmi_rec_aux_count(rd_phys, &realm->num_aux))) { WARN_ON(rmi_realm_destroy(rd_phys)); @@ -283,6 +284,13 @@ void kvm_destroy_realm(struct kvm *kvm) rme_vmid_release(realm->vmid); + if (realm->spare_page != PHYS_ADDR_MAX) { + /* Leak the page if the undelegate fails */ + if (!WARN_ON(rmi_granule_undelegate(realm->spare_page))) + free_page((unsigned long)phys_to_virt(realm->spare_page)); + realm->spare_page = PHYS_ADDR_MAX; + } + for (i = 0; i < pgt->pgd_pages; i++) { phys_addr_t pgd_phys = kvm->arch.mmu.pgd_phys + i * PAGE_SIZE; -- 2.34.1