Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp162553pxb; Tue, 2 Feb 2021 01:50:16 -0800 (PST) X-Google-Smtp-Source: ABdhPJxraOY7pmE390+gH1jiVbzVYoCgB0Fe7sr9LYOainfW//CXg9HdF+nGDh6zqWOIV8oYD+uh X-Received: by 2002:a17:906:a20e:: with SMTP id r14mr21249326ejy.404.1612259416040; Tue, 02 Feb 2021 01:50:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612259416; cv=none; d=google.com; s=arc-20160816; b=rFg9GT487zfs7vHccRikmQuU0XeHcsYEy7CMgNHyddTbwlQN63h8e83pHG/kisnEZM VfYtmqBxUGM3TvpMMjIDYNQVgOs6nV0B0NrMU9wH7lMjCcCMrB1HdLvrBH3OrO0zgTLS LPU1FQeqdiFv15HK4ILVYWWaYOP1HVjSdBjbgYOs72++4l0NtKYpkwhP7QcKdG11a9Sv eQzdePlUDlHD6+KUnK4LbJBN6IFS61p84/xqE5JkTD9sgKK5Vovn5C2kLg6CUT1dQ15n JaFnvnUljJdyeiFnVriERFq58g78denYRaCYiZBmyFJ2mMMvAXOKWz06zxyqisyLXzWY Gy7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=VSSaPfRwvDGbQxdeByNUZ9wyHZguwKJIHB4orZkRX1U=; b=Hd47B9dvVvGu0OsY1nb7XepmFWI75o52WDz+rqtaYNr2wZfvNGtF92WeCqbq+7qOnc DdZJT14l2Pd4ffBUKI143OtPJYKsIo3+KD8NIH1IOlnxpKLys3fGqGgpljrRD0YK+Gpg scV9n+s1pJelqfS3YjlRRS8J3pseFTpA5/mmt3JBVgoPmHagQWtSChv/mgOLfiy5seAB jt1xPTghVnIJuMhkoErt4A53KyDcaQHPuRrzwsagkaE+ytE+zpO5LxVZHWj5BVNQukaM nPLXwDarE1gyb6YIGGs/erHSA5JztfkGt0vmnhBn6X79RjmglTeuyEsJTfKBTXDwHfdk Fxmw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=icnf8IsQ; 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 v8si2282349ejq.163.2021.02.02.01.49.51; Tue, 02 Feb 2021 01:50:16 -0800 (PST) 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=icnf8IsQ; 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 S230098AbhBBJqC (ORCPT + 99 others); Tue, 2 Feb 2021 04:46:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51084 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230365AbhBBJpT (ORCPT ); Tue, 2 Feb 2021 04:45:19 -0500 Received: from mail-wm1-x32f.google.com (mail-wm1-x32f.google.com [IPv6:2a00:1450:4864:20::32f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 50C4DC061573 for ; Tue, 2 Feb 2021 01:44:38 -0800 (PST) Received: by mail-wm1-x32f.google.com with SMTP id w4so462663wmi.4 for ; Tue, 02 Feb 2021 01:44:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=VSSaPfRwvDGbQxdeByNUZ9wyHZguwKJIHB4orZkRX1U=; b=icnf8IsQd9Q4RXyrczWdoSkwbyXLaEO6875Us6xORHCs9Jiwot3EFoxuqn8jHAGlqJ WC9WKxlkoKRuzYW5lQfPyf4X37E2NgGZDBulxh+ddu/9JSwp7kTe2nPHMnMwFxfB+YhR 7c1qWY/YfsE22reCcr1x+CsicRskIT1cq/Bh9JrQ3TPma5wZyf9A53G78pmr9m62vImQ 6gIsG+A2mm3O1Ic7fDPm1buPDEDNp0MEFD3zZx1FYOsCutARFZKGY4yA1Umv41CoszTH /FUg8mWpEJuh2GWVvmFLwAv7tvSIGUo4oSD0BvbjJXwUDW/SYj1Q2/JACFpZ/hiIf/u8 SkfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=VSSaPfRwvDGbQxdeByNUZ9wyHZguwKJIHB4orZkRX1U=; b=Wg8pCAell45PcwfXIrbH+G6HTQAFYFqlVeh1ENe9gE+amVl7kDf6Yks5hqZu4tSGeG rkx+sVlxsk/SGKkC6ayPGDrFtF+qd6VyRKMD6nwau6uXHs9FB7qORcDZM0923Qx+fVvC 1mThA3/s4AisSKbaEtJ+l0JOZOckJfUrffwuKQ8GqCj3BOtdC+es5K8AfYajKnXq2Pkn IUM8CGOZXiZV4fw2zYpuMmv7e/XPo6z27kWr/486SCF3/1nBW2VWixk/Nx9+Avb6RokG UMh4i+iXZ3bYcvpoEnC9MCnLnkh0XXN1OMqq5liMvroT37bxEVEOjqLy9vgcDOhjPpyF OQGQ== X-Gm-Message-State: AOAM5312Ui727dvLW5wW3n+ltj97lpmIyJ/ir/ipz1v15Kcqi309q41u jy07JoANNltYshKo73yyajuExw== X-Received: by 2002:a05:600c:24e:: with SMTP id 14mr2705390wmj.87.1612259076914; Tue, 02 Feb 2021 01:44:36 -0800 (PST) Received: from google.com (230.69.233.35.bc.googleusercontent.com. [35.233.69.230]) by smtp.gmail.com with ESMTPSA id u1sm2169128wml.11.2021.02.02.01.44.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Feb 2021 01:44:36 -0800 (PST) Date: Tue, 2 Feb 2021 09:44:33 +0000 From: Quentin Perret To: Will Deacon Cc: Catalin Marinas , Marc Zyngier , James Morse , Julien Thierry , Suzuki K Poulose , Rob Herring , Frank Rowand , devicetree@vger.kernel.org, android-kvm@google.com, linux-kernel@vger.kernel.org, kernel-team@android.com, kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org, Fuad Tabba , Mark Rutland , David Brazdil Subject: Re: [RFC PATCH v2 10/26] KVM: arm64: Introduce an early Hyp page allocator Message-ID: References: <20210108121524.656872-1-qperret@google.com> <20210108121524.656872-11-qperret@google.com> <20210201190008.GI15632@willie-the-truck> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210201190008.GI15632@willie-the-truck> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Monday 01 Feb 2021 at 19:00:08 (+0000), Will Deacon wrote: > On Fri, Jan 08, 2021 at 12:15:08PM +0000, Quentin Perret wrote: > > diff --git a/arch/arm64/kvm/hyp/nvhe/early_alloc.c b/arch/arm64/kvm/hyp/nvhe/early_alloc.c > > new file mode 100644 > > index 000000000000..de4c45662970 > > --- /dev/null > > +++ b/arch/arm64/kvm/hyp/nvhe/early_alloc.c > > @@ -0,0 +1,60 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * Copyright (C) 2020 Google LLC > > + * Author: Quentin Perret > > + */ > > + > > +#include > > + > > +#include > > + > > +struct kvm_pgtable_mm_ops hyp_early_alloc_mm_ops; > > +s64 __ro_after_init hyp_physvirt_offset; > > + > > +static unsigned long base; > > +static unsigned long end; > > +static unsigned long cur; > > + > > +unsigned long hyp_early_alloc_nr_pages(void) > > +{ > > + return (cur - base) >> PAGE_SHIFT; > > +} > > nit: but I find this function name confusing (it's returning the number of > _allocated_ pages, not the number of _free_ pages!). How about something > like hyp_early_alloc_size() to match hyp_s1_pgtable_size() which you add > later? [and move the shift out to the caller]? Works for me. > > +extern void clear_page(void *to); > > Stick this in a header? Right, that, or perhaps just use asm/page.h directly -- I _think_ that should work fine assuming with have the correct symbol aliasing in place. > > + > > +void *hyp_early_alloc_contig(unsigned int nr_pages) > > I think order might make more sense, or do you need to allocate > non-power-of-2 batches of pages? Indeed, I allocate page-aligned blobs of arbitrary size (e.g. divide_memory_pool() in patch 16), so I prefer it that way. > > +{ > > + unsigned long ret = cur, i, p; > > + > > + if (!nr_pages) > > + return NULL; > > + > > + cur += nr_pages << PAGE_SHIFT; > > + if (cur > end) { > > This would mean that concurrent hyp_early_alloc_nr_pages() would transiently > give the wrong answer. Might be worth sticking the locking expectations with > the function prototypes. This is only called from a single CPU from a non-preemptible section, so that is not a problem. But yes, I'll stick a comment. > That said, maybe it would be better to write this check as: > > if (end - cur < (nr_pages << PAGE_SHIFT)) > > as that also removes the need to worry about overflow if nr_pages is huge > (which would be a bug in the hypervisor, which we would then catch here). Sounds good. > > + cur = ret; > > + return NULL; > > + } > > + > > + for (i = 0; i < nr_pages; i++) { > > + p = ret + (i << PAGE_SHIFT); > > + clear_page((void *)(p)); > > + } > > + > > + return (void *)ret; > > +} > > + > > +void *hyp_early_alloc_page(void *arg) > > +{ > > + return hyp_early_alloc_contig(1); > > +} > > + > > +void hyp_early_alloc_init(unsigned long virt, unsigned long size) > > +{ > > + base = virt; > > + end = virt + size; > > + cur = virt; > > nit: base = cur = virt; Ack. Thanks for the review, Quentin