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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 9A386C41535 for ; Tue, 19 Dec 2023 11:46:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=yNF2MLsu8THSuS3eB8EBmDz3oxFlNWVMi1Kk6BxNKXA=; b=oU4wOuHMP/Bndv Lr5mOYs8+tTkz6Z+i8QjMLKqUCWIqGvbergPA0QbdhLr5QLmjZUeR41d8cVBYqKI4s/e5HfOuQtTI 4eCPn/L6hd5j9x7NkCIprnS5i53raN3REaeNTWRyxtxpbuqv/H7/q0qVN/ZxYqkckpHK97FU/QyzG +bPu8uhYFnPlgfeCdoCRHDQV6adoCG8ZZkRO+PYvbrc6YUHQPquWSwdSi0T5iBxzbkevjpvofPN7I UiN5DC3sClIJoM2cbg/3kyz4ghl8FX995tiPEhMxS+iaDNXMVcbPjWSdYU9J1+/7gBvIpf/2/9hXu h2xPXzozTLiKxw3duicQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rFYY0-00DtZr-0V; Tue, 19 Dec 2023 11:46:04 +0000 Received: from mail-wm1-x32d.google.com ([2a00:1450:4864:20::32d]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rFYXw-00DtZ8-3B for linux-arm-kernel@lists.infradead.org; Tue, 19 Dec 2023 11:46:02 +0000 Received: by mail-wm1-x32d.google.com with SMTP id 5b1f17b1804b1-40c3963f9fcso35105e9.1 for ; Tue, 19 Dec 2023 03:45:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1702986358; x=1703591158; darn=lists.infradead.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=YcdYvkUdUc07HVNjkVvPG6bswzAfzCrn7zyTgGe/v8M=; b=PJ8edpfU2K5NJmiSHuVUcjb4VIzKfyk47L+Bvf3x2W/PSSV0yukhMt9ys2T1SzgLan 5f9v1FOebPAniuHpJbCZMTrzEA2GAdw5gpgcqkKqtvCjvaYn8WoJK/Id0yD0U1hpZqJb mvwOSVCqM+0EkC6ZENU3x7vTDsWdwRc/PAG+zX9X4l8w4Sy+jrADpYkmQEHZuTKp6603 Lv7tIRNWwLOmx063G8tFxREBgk+15WLYxyIzuoJWQ6xkcKrQnB7h8FAEsgBAETHwEWeC P3DMz/OA4V4n3bsFAoCwm6fXOK+XqEdk5zBrxt3hg83bkZJ46rIMuWKDtty/Oe/gnmMT iljw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702986358; x=1703591158; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=YcdYvkUdUc07HVNjkVvPG6bswzAfzCrn7zyTgGe/v8M=; b=Y9oAdnwg2aJ3HMoPwyJxFfJXVB7OC4x5x8JTWIJ4n6juMC1K7jJ8+n8p125gidIZzM cEoYRJ7oYUqzXSUyBhUt1g6pDFOU0IiFoTLyUXgzukClzvsYpX4m1TnscrTQWjogSRYC MYDyXUeuhhIcA+TcYa1GIDw+N+8dKAZO8gJWiw7k1nzj2oB2hAnt8YZiqK4q0uvZC6sF aHFJTINoI7osAPll0BaJxpdmC1pawxTQNOpp6bxn4rH9sGshfC80/6rEXKEH2Mbtpgv7 JCgzmZfzf3m2ruhiwgvFnHZELUddpF2j815gFRuRXvcmtaMNMVzM8GiQV+rVfYr2Z7y7 3S1w== X-Gm-Message-State: AOJu0YzRWKvG7QnpZN31xVfFGVGHegHoSUBuXbGGrcC80Dbw83c9Wt7t LYcOpuRsH0OynykFoN8oQGgJlyyuCQw0Oe+lMd/vHKRXqcyw/He+oQ== X-Google-Smtp-Source: AGHT+IGWXS5SsQDP3A5fto770wDgm/oet6UOw1Nk2k0AW7Z+DvOY9nLEuzR8ykz7oVqRs2hWFVf+lQ== X-Received: by 2002:a7b:ce10:0:b0:40d:1976:426 with SMTP id m16-20020a7bce10000000b0040d19760426mr100528wmc.5.1702986357754; Tue, 19 Dec 2023 03:45:57 -0800 (PST) Received: from google.com (185.83.140.34.bc.googleusercontent.com. [34.140.83.185]) by smtp.gmail.com with ESMTPSA id v17-20020a5d6111000000b0033660f75d08sm7987367wrt.116.2023.12.19.03.45.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Dec 2023 03:45:57 -0800 (PST) Date: Tue, 19 Dec 2023 11:45:55 +0000 From: Sebastian Ene To: will@kernel.org, Oliver Upton , James Morse , Suzuki K Poulose , Zenghui Yu , catalin.marinas@arm.com, mark.rutland@arm.com, akpm@linux-foundation.org, maz@kernel.org Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com, vdonnefort@google.com, qperret@google.com, smostafa@google.com Subject: Re: [PATCH v4 03/10] KVM: arm64: Invoke the snapshot interface for the host stage-2 pagetable Message-ID: References: <20231218135859.2513568-2-sebastianene@google.com> <20231218135859.2513568-5-sebastianene@google.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20231218135859.2513568-5-sebastianene@google.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231219_034601_026646_AE12129B X-CRM114-Status: GOOD ( 28.78 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Mon, Dec 18, 2023 at 01:58:53PM +0000, Sebastian Ene wrote: > Allocate memory for the snapshot by creating a memory cache with empty > pages that will be used by the hypervisor during the page table copy. > Get the required size of the PGD and allocate physically contiguous > memory for it. Allocate contiguous memory for an array that is used to > keep track of the pages used from the memcache. Call the snapshot > interface and release the memory for the snapshot. > > Signed-off-by: Sebastian Ene > --- > arch/arm64/kvm/ptdump.c | 107 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 107 insertions(+) > > diff --git a/arch/arm64/kvm/ptdump.c b/arch/arm64/kvm/ptdump.c > index 5816fc632..e99bab427 100644 > --- a/arch/arm64/kvm/ptdump.c > +++ b/arch/arm64/kvm/ptdump.c > @@ -25,6 +25,9 @@ static int kvm_ptdump_open(struct inode *inode, struct file *file); > static int kvm_ptdump_release(struct inode *inode, struct file *file); > static int kvm_ptdump_show(struct seq_file *m, void *); > > +static phys_addr_t get_host_pa(void *addr); > +static void *get_host_va(phys_addr_t pa); > + > static const struct file_operations kvm_ptdump_fops = { > .open = kvm_ptdump_open, > .read = seq_read, > @@ -32,6 +35,11 @@ static const struct file_operations kvm_ptdump_fops = { > .release = kvm_ptdump_release, > }; > > +static struct kvm_pgtable_mm_ops ptdump_host_mmops = { > + .phys_to_virt = get_host_va, > + .virt_to_phys = get_host_pa, > +}; > + > static int kvm_ptdump_open(struct inode *inode, struct file *file) > { > struct kvm_ptdump_register *reg = inode->i_private; > @@ -78,11 +86,110 @@ static void kvm_ptdump_debugfs_register(struct kvm_ptdump_register *reg, > > static struct kvm_ptdump_register host_reg; > > +static size_t host_stage2_get_pgd_len(void) > +{ > + u32 phys_shift = get_kvm_ipa_limit(); > + u64 vtcr = kvm_get_vtcr(read_sanitised_ftr_reg(SYS_ID_AA64MMFR0_EL1), > + read_sanitised_ftr_reg(SYS_ID_AA64MMFR1_EL1), > + phys_shift); > + return (kvm_pgtable_stage2_pgd_size(vtcr) >> PAGE_SHIFT); > +} > + > +static phys_addr_t get_host_pa(void *addr) > +{ > + return __pa(addr); > +} > + > +static void *get_host_va(phys_addr_t pa) > +{ > + return __va(pa); > +} > + > +static void kvm_host_put_ptdump_info(void *snap) > +{ > + void *mc_page; > + size_t i; > + struct kvm_pgtable_snapshot *snapshot; > + > + if (!snap) > + return; > + > + snapshot = snap; > + while ((mc_page = pop_hyp_memcache(&snapshot->mc, get_host_va)) != NULL) > + free_page((unsigned long)mc_page); > + > + if (snapshot->pgd_hva) > + free_pages_exact(snapshot->pgd_hva, snapshot->pgd_pages); > + > + if (snapshot->used_pages_hva) { > + for (i = 0; i < snapshot->used_pages_indx; i++) { > + mc_page = get_host_va(snapshot->used_pages_hva[i]); > + free_page((unsigned long)mc_page); > + } > + > + free_pages_exact(snapshot->used_pages_hva, snapshot->num_used_pages); > + } > + > + free_page((unsigned long)snapshot); > +} > + > +static void *kvm_host_get_ptdump_info(struct kvm_ptdump_register *reg) > +{ > + int i, ret; > + void *mc_page; > + struct kvm_pgtable_snapshot *snapshot; > + size_t memcache_len; > + > + snapshot = (void *)__get_free_page(GFP_KERNEL_ACCOUNT); > + if (!snapshot) > + return NULL; > + > + memset(snapshot, 0, sizeof(struct kvm_pgtable_snapshot)); > + > + snapshot->pgd_pages = host_stage2_get_pgd_len(); > + snapshot->pgd_hva = alloc_pages_exact(snapshot->pgd_pages, GFP_KERNEL_ACCOUNT); The allocation should be specified in the number of bytes here. > + if (!snapshot->pgd_hva) > + goto err; > + > + memcache_len = (size_t)reg->priv; > + for (i = 0; i < memcache_len; i++) { > + mc_page = (void *)__get_free_page(GFP_KERNEL_ACCOUNT); > + if (!mc_page) > + goto err; > + > + push_hyp_memcache(&snapshot->mc, mc_page, get_host_pa); > + } > + > + snapshot->num_used_pages = DIV_ROUND_UP(sizeof(phys_addr_t) * memcache_len, > + PAGE_SIZE); > + snapshot->used_pages_hva = alloc_pages_exact(snapshot->num_used_pages, > + GFP_KERNEL_ACCOUNT); the same as previous comment. > + if (!snapshot->used_pages_hva) > + goto err; > + > + ret = kvm_call_hyp_nvhe(__pkvm_host_stage2_snapshot, snapshot); > + if (ret) { > + pr_err("ERROR %d snapshot host pagetables\n", ret); > + goto err; > + } > + > + snapshot->pgtable.pgd = get_host_va((phys_addr_t)snapshot->pgtable.pgd); > + snapshot->pgtable.mm_ops = &ptdump_host_mmops; > + > + return snapshot; > +err: > + kvm_host_put_ptdump_info(snapshot); > + return NULL; > +} > + > void kvm_ptdump_register_host(void) > { > if (!is_protected_kvm_enabled()) > return; > > + host_reg.get_ptdump_info = kvm_host_get_ptdump_info; > + host_reg.put_ptdump_info = kvm_host_put_ptdump_info; > + > kvm_ptdump_debugfs_register(&host_reg, "host_page_tables", > kvm_debugfs_dir); > } > -- > 2.43.0.472.g3155946c3a-goog > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel