Received: by 2002:a05:6a10:5594:0:0:0:0 with SMTP id ee20csp573373pxb; Mon, 25 Apr 2022 16:59:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyJxnBhpJYLa+3byMIjXCwD0Qtd9zEq6mBTeakNBbHms9SzFHP04XnZCqBetNVF9BBkPQ8n X-Received: by 2002:a17:907:96a8:b0:6f3:9e66:80c5 with SMTP id hd40-20020a17090796a800b006f39e6680c5mr5025435ejc.662.1650931180409; Mon, 25 Apr 2022 16:59:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650931180; cv=none; d=google.com; s=arc-20160816; b=ee4Mpg6wz0CxwZWsnxwOajzagih2ggJO8MtgSrzuIibae8se9X962SJii22hzVPGGJ ExWQ5oJr8Q4S5qCtU01f9JPHRMxLoUny65mAsntQ5VqIQvXATeylZ9iY1RvZYYsENtAz Ua0YqjEVPwpdPusgvfWGmWOvXJRo7/iWy7BA0S7C/nsWONBVA5ytp4hnnaTQa+Tb/ssB pDcJvqzvXSH+Jkxvmtcrounp/nsIO9/AgSm0HrTF3Dl39BT7VeXDNkhUYNNTr7DAhX6Q NE5QsVxpcpX5duWak4bpXyuFZbqwu0k2TyBPly54NwFLCMCIuXuvrBHhwUSaN/RZzhGz bPuA== 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-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=Bp8fxefthRzVDQjep0TKk8hJ3I3+XO3lD7hMCuOJejc=; b=AZfJrsAI3C1TT7LsuMz1c0VDdiNFZLElo0AwokaUvIRkYq+da28V113YYquJuxIdeq avwA17BI8dJazNytcEPXLs8mA1yONrhqplZ1Sa0JM5MK90x96YLAFMEv0ciYgjINBM8U EucDE79CHrViug6qQOXlrBg81MfTLamBIOaPK4RN8wdCxPJpq0Da0shh/DkEFXGwdb7g g/gwe59cuChOf/PknPjAVJkQdhI3F4UKtGsd9ray7Ikcqma438O7yv4z6chCK8eQdWsR FtPQSKQS1We7ycjs6evyjfba2sdNR7zMFnaOLJNjAc2dAI2cWMhN1CrOFvAKOsqpIQoR mbPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="mDk/QCs5"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d17-20020a170906305100b006dfad24c60csi14538613ejd.249.2022.04.25.16.59.16; Mon, 25 Apr 2022 16:59:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="mDk/QCs5"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243613AbiDYQyT (ORCPT + 99 others); Mon, 25 Apr 2022 12:54:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51890 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243606AbiDYQyR (ORCPT ); Mon, 25 Apr 2022 12:54:17 -0400 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BE08A1A042; Mon, 25 Apr 2022 09:51:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1650905472; x=1682441472; h=date:from:to:cc:subject:message-id:references: mime-version:content-transfer-encoding:in-reply-to; bh=sNT4x+GZpx5jtw0CJ7/oLIIw/S8KoYk0ZT6jquEq14Q=; b=mDk/QCs5kOr4Sub3BlOs4mfbxZfxivm+6grZykV9yrF4vAz99y/Q6nlR xvaaNqVyforYioxCh3BWDdW2vWSWQg1KuwC5DG3WXmZm6U5zFgffnYVnw 70C8MP2c0Uw5ZBas0lMewUJ4RK8ENbCIHDAsrihAqnxh61Jk5m6f48gpG nd/Gyuder5n+YYIBo02cxUONsD+dugJ9b6l8gzjI5/88wNcjs+Xsdyj2Z 3FOivgVTgojdMMi/7S6OFGV6h2GrKMI9puCYfUkm4i178Sd48cW6NKGcE v6Al50rOExGg37br6TE5V5hSlrJuWY9bdI3yRLklaffbl/58sZkw5b/bA g==; X-IronPort-AV: E=McAfee;i="6400,9594,10328"; a="351749907" X-IronPort-AV: E=Sophos;i="5.90,289,1643702400"; d="scan'208";a="351749907" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Apr 2022 09:51:12 -0700 X-IronPort-AV: E=Sophos;i="5.90,289,1643702400"; d="scan'208";a="579375156" Received: from kruparel-mobl1.amr.corp.intel.com (HELO localhost) ([10.213.188.223]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Apr 2022 09:51:11 -0700 Date: Mon, 25 Apr 2022 09:51:10 -0700 From: Ira Weiny To: "Fabio M. De Francesco" Cc: Andrew Morton , Catalin Marinas , "Matthew Wilcox (Oracle)" , Will Deacon , Peter Collingbourne , Vlastimil Babka , Sebastian Andrzej Siewior , linux-kernel@vger.kernel.org, Jonathan Corbet , linux-doc@vger.kernel.org, outreachy@lists.linux.dev, Thomas Gleixner , Peter Zijlstra Subject: Re: [PATCH 4/4] Documentation/vm: Rework "Temporary Virtual Mappings" Message-ID: References: <20220421180200.16901-1-fmdefrancesco@gmail.com> <20220421180200.16901-5-fmdefrancesco@gmail.com> <1894872.PYKUYFuaPT@leap> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1894872.PYKUYFuaPT@leap> X-Spam-Status: No, score=-5.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Apr 25, 2022 at 03:42:46AM +0200, Fabio M. De Francesco wrote: > On luned? 25 aprile 2022 02:59:48 CEST Ira Weiny wrote: > > On Thu, Apr 21, 2022 at 08:02:00PM +0200, Fabio M. De Francesco wrote: > > > Extend and rework the "Temporary Virtual Mappings" section of the > highmem.rst > > > documentation. > > > > > > Despite the local kmaps were introduced by Thomas Gleixner in October > 2020, > > > documentation was still missing information about them. These additions > rely > > > largely on Gleixner's patches, Jonathan Corbet's LWN articles, comments > by > > > Ira Weiny and Matthew Wilcox, and in-code comments from > > > ./include/linux/highmem.h. > > > > > > 1) Add a paragraph to document kmap_local_page(). > > > 2) Reorder the list of functions by decreasing order of preference of > > > use. > > > 3) Rework part of the kmap() entry in list. > > > > > > Cc: Jonathan Corbet > > > Cc: Thomas Gleixner > > > Cc: Ira Weiny > > > Cc: Matthew Wilcox > > > Cc: Peter Zijlstra > > > Signed-off-by: Fabio M. De Francesco > > > --- > > > Documentation/vm/highmem.rst | 71 ++++++++++++++++++++++++++++++------ > > > 1 file changed, 60 insertions(+), 11 deletions(-) > > > > > > diff --git a/Documentation/vm/highmem.rst b/Documentation/vm/ > highmem.rst > > > index e05bf5524174..960f61e7a552 100644 > > > --- a/Documentation/vm/highmem.rst > > > +++ b/Documentation/vm/highmem.rst > > > @@ -50,26 +50,75 @@ space when they use mm context tags. > > > Temporary Virtual Mappings > > > ========================== > > > > > > -The kernel contains several ways of creating temporary mappings: > > > +The kernel contains several ways of creating temporary mappings. The > following > > > +list shows them in order of preference of use. > > > > > > -* vmap(). This can be used to make a long duration mapping of > multiple > > > - physical pages into a contiguous virtual space. It needs global > > > - synchronization to unmap. > > > +* kmap_local_page(). This function is used to require short term > mappings. > > > + It can be invoked from any context (including interrupts) but the > mappings > > > + can only be used in the context which acquired them. > > > + > > > + This function should be preferred, where feasible, over all the > others. > > > > > > -* kmap(). This permits a short duration mapping of a single page. It > needs > > > - global synchronization, but is amortized somewhat. It is also prone > to > > > - deadlocks when using in a nested fashion, and so it is not > recommended for > > > - new code. > > > + These mappings are per thread, CPU local (i.e., migration from one > CPU to > > > + another is disabled - this is why they are called "local"), but they > don't > > > + disable preemption. It's valid to take pagefaults in a local kmap > region, > > > + unless the context in which the local mapping is acquired does not > allow > > > + it for other reasons. > > > + > > > + It is assumed that kmap_local_page() always returns the virtual > address > > > > kmap_local_page() does return a kernel virtual address. Why 'assume' > this? > > > > Do you mean it returns an address in the direct map? > > > > > + of the mapping, therefore they won't ever fail. > > > > I don't think that returning a virtual address has anything to do with > the > > assumption they will not fail. > > > > Why do you say this? > > Oh, sorry! I didn't mean to say this. What I wrote is _not_ what I meant. > My intention was to say the same that you may read below about > k[un]map_atomic(). > > This sentence should have been: > > + It always returns a valid virtual address. It is assumed that > + k[un]map_local() won't ever fail. > > Is this rewording correct? > > It's not my first time I make these kinds of silly mistakes when copy- > pasting lines and then rework or merge with other text that was already > there. Recently I've made a couple of these kinds of mistakes. > > I'd better read twice (maybe thrice) what I write before sending :( NP That is part of the reason we have reviews. > > > > > > + > > > + If a task holding local kmaps is preempted, the maps are removed on > context > > > + switch and restored when the task comes back on the CPU. As the maps > are > > > + strictly CPU local, it is guaranteed that the task stays on the CPU > and > > > + that the CPU cannot be unplugged until the local kmaps are released. > > > + > > > + Nesting kmap_local_page() and kmap_atomic() mappings is allowed to a > certain > > > + extent (up to KMAP_TYPE_NR) but their invocations have to be > strictly ordered > > > + because the map implementation is stack based. > > > > I think I would reference the kmap_local_page() > > I suppose you are talking about the kdocs comments in code. If so, please > remember that the kmap_local_page() kdocs have already been included in > highmem.rst. Yes exactly. > > Am I misunderstanding what you write? I was just suggesting that the above could add. 'See kmal_local_page() kdoc for ordering details.' To make sure that people understand those details and you don't have to rewrite the kdoc stuff here. > > > for more details on the > > ordering because there have been some conversions I've done which were > > complicated by this. > > > > > > > > * kmap_atomic(). This permits a very short duration mapping of a > single > > > page. Since the mapping is restricted to the CPU that issued it, it > > > performs well, but the issuing task is therefore required to stay on > that > > > CPU until it has finished, lest some other task displace its > mappings. > > > > > > - kmap_atomic() may also be used by interrupt contexts, since it is > does not > > > - sleep and the caller may not sleep until after kunmap_atomic() is > called. > > > + kmap_atomic() may also be used by interrupt contexts, since it does > not > > > + sleep and the callers too may not sleep until after kunmap_atomic() > is > > > + called. > > > + > > > + Each call of kmap_atomic() in the kernel creates a non-preemptible > section > > > + and disable pagefaults. This could be a source of unwanted latency, > so it > > > + should be only used if it is absolutely required, otherwise > kmap_local_page() > > > + should be used where it is feasible. > > > > > > - It may be assumed that k[un]map_atomic() won't fail. > > > + It is assumed that k[un]map_atomic() won't fail. > > > + > > > +* kmap(). This should be used to make short duration mapping of a > single > > > + page with no restrictions on preemption or migration. It comes with > an > > > + overhead as mapping space is restricted and protected by a global > lock > > > + for synchronization. When mapping is no more needed, the address > that > > ^^^^^^^^ > > no longer > > Yes, correct. I'll fix it. > > > > + the page was mapped to must be released with kunmap(). > > > + > > > + Mapping changes must be propagated across all the CPUs. kmap() also > > > + requires global TLB invalidation when the kmap's pool wraps and it > might > > > + block when the mapping space is fully utilized until a slot becomes > > > + available. Therefore, kmap() is only callable from preemptible > context. > > > + > > > + All the above work is necessary if a mapping must last for a > relatively > > > + long time but the bulk of high-memory mappings in the kernel are > > > + short-lived and only used in one place. This means that the cost of > > > + kmap() is mostly wasted in such cases. kmap() was not intended for > long > > > + term mappings but it has morphed in that direction and its use is > > > + strongly discouraged in newer code and the set of the preceding > functions > > > + should be preferred. > > > > Nice! > > Now that I have your reviews for all the four patches of this series I'll > send next version on Monday. > > Thanks you so much, Thank you! Ira > > Fabio > > > > > Ira > > > > > + > > > + On 64-bit systems, calls to kmap_local_page(), kmap_atomic() and > kmap() have > > > + no real work to do because a 64-bit address space is more than > sufficient to > > > + address all the physical memory whose pages are permanently mapped. > > > + > > > +* vmap(). This can be used to make a long duration mapping of > multiple > > > + physical pages into a contiguous virtual space. It needs global > > > + synchronization to unmap. > > > > > > > > > Cost of Temporary Mappings > > > -- > > > 2.34.1 > > > > > > > > >