Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3530960pxf; Mon, 15 Mar 2021 11:37:28 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzwBCdBXwp4m1aN+2Xq3zXkcpEsBbsQlpkFEQRcjyGRB9zIn1l+fcFA1YvP6CFAgDsKtrRo X-Received: by 2002:a17:906:8308:: with SMTP id j8mr24571881ejx.339.1615833448003; Mon, 15 Mar 2021 11:37:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1615833447; cv=none; d=google.com; s=arc-20160816; b=Gp+hqoCvJ93G0Kfnm3rqD04Fe2JmebxRc92xvLg2AJ3Rw/i/OZGEzb5jCbcrEeo3+i vCZXYRT8Kjy7kjLDu1Yuojk2CPmuzc9DL3I23ic5HDMj5iSybD8PjTs2t9yNkU3PodtB +J58kimi9zAph2KCD8GixK7mdbT/ck+IX+2o6kpa84BRDh4wP8WF5tY2F1e3Kshp2OIg f2PWzeVZCfpINiH9y+u4/BIu76Shx+zoS/VCFpuSsjk7KGy8207z2o16ODtj13H9lKGB qkk1Cg4wfy9EwI/9vrVgSS5WYNm8ZGoSnep8z40JXcNgvidv/AQEEZMQ5oWAUyN3nWL9 cDIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:references:mime-version :message-id:in-reply-to:date:dkim-signature; bh=XmlXvszH/b/asNjtzAQpiqetpKnqM2IpsKRJDC1QZ6Q=; b=lgHtn5toKldsP0CIs8Ttt7SEQeiFbkr2L/idlWG/7VJY0xh0V+VrXTYwlUvmb2CMRe Ou6GsyZX//m94ww45ANmlBRFu2hpDkVba97KifAhEH4pIoHP6RmoEAkJC0nAL67H6sPr WchOrEmrtXmoHK+v2oZBJVcyAV9llOsWqzT4qBSu3amkO4gHMEMhsgqlF+/5DVNyUlp3 qGNC7DOPL4nbwbrLW9TjAwjqGPJbCcDkPy6+pS/kFiS1VAeDhU1/VlDq31fMWRkKqjIq O8/5SqFz4d9ZVXjWphKATkS2YGORM7Ps4Sj/kOjyZCuAy79x3n60qn+dm6PHuc0uQ+Q+ cH0A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=PLWGPtcP; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id z15si3425934edd.187.2021.03.15.11.37.05; Mon, 15 Mar 2021 11:37:27 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=PLWGPtcP; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240058AbhCOOwO (ORCPT + 99 others); Mon, 15 Mar 2021 10:52:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52430 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237226AbhCOOgt (ORCPT ); Mon, 15 Mar 2021 10:36:49 -0400 Received: from mail-qk1-x749.google.com (mail-qk1-x749.google.com [IPv6:2607:f8b0:4864:20::749]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C43BDC0613E7 for ; Mon, 15 Mar 2021 07:36:34 -0700 (PDT) Received: by mail-qk1-x749.google.com with SMTP id p133so917345qka.17 for ; Mon, 15 Mar 2021 07:36:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=XmlXvszH/b/asNjtzAQpiqetpKnqM2IpsKRJDC1QZ6Q=; b=PLWGPtcPO447N2pO6R95sG7rL4oGVx0r8DVGs09d8RPZ+UAk/bpKyLsvpYEO7Jr09W 7vEOA1LoSW6Vkbkkl04YI7eIQ4wLahgyU6ZvMQD2jorBU0h/hUzKifbMFLIt+3GiJgY8 epbInKMYcsNC4twnTe4fVnovvofLaYfBIw1i7LfW+snvn5MmVBLdV6JJnWtIo8MjwYma CcmiweMhEBu/HkjjmDOKMIU5C4XDBW9B0Ok0x0S4nOebQEBLt+JaZ7H+IZlKTwf/qZVS gpVWR87Eawg6/JYS5YCefIwizWgjMpbV7Jy1xpLuE7E6qI96JG1o98zxfOf7wporssQb lUhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=XmlXvszH/b/asNjtzAQpiqetpKnqM2IpsKRJDC1QZ6Q=; b=LNK2pkSrRVMrvhmcgEDawt6JYAZd9h2iKsxmtUFVKjIWMvuGhhLgpDjzv/FZvdsDAk PrQz5ToRCvIglUfa0UOYC/polN20Z+VQCofzR6UyO3djUbGN1gHL7OOPgrEL2jRZWtQ/ y5e3Sx8XETOutwotgMVm6IEnprhBLBnAyPKanYIVgsKXyFse+euKA/vEAemx3GisVtkQ Iy0q7hCIc420BC7wr6RJwwnhrS3CLNmOAInayInoW0hSG3rh4l1OQ9upJ+mb3oniy8DA rI+Ywo0GmI9bYCZbetA5bHlHlt8zxuph7ik7UKHSszK4qygn4jKOqsj6SaGd51Lk2Bhu uERQ== X-Gm-Message-State: AOAM533IAhwKB0wGMnvr9pJl30OjtCptKUf2SDNJ2IUwzLa4ZLaSaEos NywYT8dueh0a57+C8j86cv7knTZxCAYS X-Received: from r2d2-qp.c.googlers.com ([fda3:e722:ac3:10:28:9cb1:c0a8:1652]) (user=qperret job=sendgmr) by 2002:a0c:f946:: with SMTP id i6mr24752203qvo.40.1615818993951; Mon, 15 Mar 2021 07:36:33 -0700 (PDT) Date: Mon, 15 Mar 2021 14:35:26 +0000 In-Reply-To: <20210315143536.214621-1-qperret@google.com> Message-Id: <20210315143536.214621-27-qperret@google.com> Mime-Version: 1.0 References: <20210315143536.214621-1-qperret@google.com> X-Mailer: git-send-email 2.31.0.rc2.261.g7f71774620-goog Subject: [PATCH v5 26/36] KVM: arm64: Reserve memory for host stage 2 From: Quentin Perret To: catalin.marinas@arm.com, will@kernel.org, maz@kernel.org, james.morse@arm.com, julien.thierry.kdev@gmail.com, suzuki.poulose@arm.com Cc: android-kvm@google.com, seanjc@google.com, mate.toth-pal@arm.com, linux-kernel@vger.kernel.org, robh+dt@kernel.org, linux-arm-kernel@lists.infradead.org, kernel-team@android.com, kvmarm@lists.cs.columbia.edu, tabba@google.com, ardb@kernel.org, mark.rutland@arm.com, dbrazdil@google.com, qperret@google.com Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Extend the memory pool allocated for the hypervisor to include enough pages to map all of memory at page granularity for the host stage 2. While at it, also reserve some memory for device mappings. Acked-by: Will Deacon Signed-off-by: Quentin Perret --- arch/arm64/kvm/hyp/include/nvhe/mm.h | 27 ++++++++++++++++++++++++++- arch/arm64/kvm/hyp/nvhe/setup.c | 12 ++++++++++++ arch/arm64/kvm/hyp/reserved_mem.c | 2 ++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp/include/nvhe/mm.h b/arch/arm64/kvm/hyp/include/nvhe/mm.h index ac0f7fcffd08..0095f6289742 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/mm.h +++ b/arch/arm64/kvm/hyp/include/nvhe/mm.h @@ -53,7 +53,7 @@ static inline unsigned long __hyp_pgtable_max_pages(unsigned long nr_pages) return total; } -static inline unsigned long hyp_s1_pgtable_pages(void) +static inline unsigned long __hyp_pgtable_total_pages(void) { unsigned long res = 0, i; @@ -63,9 +63,34 @@ static inline unsigned long hyp_s1_pgtable_pages(void) res += __hyp_pgtable_max_pages(reg->size >> PAGE_SHIFT); } + return res; +} + +static inline unsigned long hyp_s1_pgtable_pages(void) +{ + unsigned long res; + + res = __hyp_pgtable_total_pages(); + /* Allow 1 GiB for private mappings */ res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT); return res; } + +static inline unsigned long host_s2_mem_pgtable_pages(void) +{ + /* + * Include an extra 16 pages to safely upper-bound the worst case of + * concatenated pgds. + */ + return __hyp_pgtable_total_pages() + 16; +} + +static inline unsigned long host_s2_dev_pgtable_pages(void) +{ + /* Allow 1 GiB for MMIO mappings */ + return __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT); +} + #endif /* __KVM_HYP_MM_H */ diff --git a/arch/arm64/kvm/hyp/nvhe/setup.c b/arch/arm64/kvm/hyp/nvhe/setup.c index 1e8bcd8b0299..c1a3e7e0ebbc 100644 --- a/arch/arm64/kvm/hyp/nvhe/setup.c +++ b/arch/arm64/kvm/hyp/nvhe/setup.c @@ -24,6 +24,8 @@ unsigned long hyp_nr_cpus; static void *vmemmap_base; static void *hyp_pgt_base; +static void *host_s2_mem_pgt_base; +static void *host_s2_dev_pgt_base; static int divide_memory_pool(void *virt, unsigned long size) { @@ -42,6 +44,16 @@ static int divide_memory_pool(void *virt, unsigned long size) if (!hyp_pgt_base) return -ENOMEM; + nr_pages = host_s2_mem_pgtable_pages(); + host_s2_mem_pgt_base = hyp_early_alloc_contig(nr_pages); + if (!host_s2_mem_pgt_base) + return -ENOMEM; + + nr_pages = host_s2_dev_pgtable_pages(); + host_s2_dev_pgt_base = hyp_early_alloc_contig(nr_pages); + if (!host_s2_dev_pgt_base) + return -ENOMEM; + return 0; } diff --git a/arch/arm64/kvm/hyp/reserved_mem.c b/arch/arm64/kvm/hyp/reserved_mem.c index 9bc6a6d27904..fd42705a3c26 100644 --- a/arch/arm64/kvm/hyp/reserved_mem.c +++ b/arch/arm64/kvm/hyp/reserved_mem.c @@ -52,6 +52,8 @@ void __init kvm_hyp_reserve(void) } hyp_mem_pages += hyp_s1_pgtable_pages(); + hyp_mem_pages += host_s2_mem_pgtable_pages(); + hyp_mem_pages += host_s2_dev_pgtable_pages(); /* * The hyp_vmemmap needs to be backed by pages, but these pages -- 2.31.0.rc2.261.g7f71774620-goog