From: Ira Weiny <ira.weiny@intel.com>
To: "Fabio M. De Francesco" <fmdefrancesco@gmail.com>
Cc: "K . Y . Srinivasan" <kys@microsoft.com>,
Haiyang Zhang <haiyangz@microsoft.com>,
Stephen Hemminger <sthemmin@microsoft.com>,
Wei Liu <wei.liu@kernel.org>, Dexuan Cui <decui@microsoft.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>, <x86@kernel.org>,
"H . Peter Anvin" <hpa@zytor.com>, <linux-hyperv@vger.kernel.org>,
<linux-kernel@vger.kernel.org>,
Zhao Liu <zhao1.liu@linux.intel.com>,
"Zhenyu Wang" <zhenyu.z.wang@intel.com>,
Zhao Liu <zhao1.liu@intel.com>,
Dave Hansen <dave.hansen@intel.com>
Subject: Re: [PATCH] x86/hyperv: Replace kmap() with kmap_local_page()
Date: Mon, 3 Oct 2022 13:24:51 -0700 [thread overview]
Message-ID: <YztFEyUA48et0yTt@iweiny-mobl> (raw)
In-Reply-To: <21632541.EfDdHjke4D@localhost.localdomain>
On Mon, Oct 03, 2022 at 07:43:49PM +0200, Fabio M. De Francesco wrote:
> On Wednesday, September 28, 2022 11:56:40 AM CEST Zhao Liu wrote:
> > From: Zhao Liu <zhao1.liu@intel.com>
> >
> > kmap() is being deprecated in favor of kmap_local_page()[1].
> >
> > There are two main problems with kmap(): (1) It comes with an overhead as
> > mapping space is restricted and protected by a global lock for
> > synchronization and (2) it 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.
> >
> > With kmap_local_page() the mappings are per thread, CPU local, can take
> > page faults, and can be called from any context (including interrupts).
> > It is faster than kmap() in kernels with HIGHMEM enabled. Furthermore,
> > the tasks can be preempted and, when they are scheduled to run again, the
> > kernel virtual addresses are restored and are still valid.
> >
> > In the fuction hyperv_init() of hyperv/hv_init.c, the mapping is used in a
> > single thread and is short live. So, in this case, it's safe to simply use
> > kmap_local_page() to create mapping, and this avoids the wasted cost of
> > kmap() for global synchronization.
> >
> > In addtion, the fuction hyperv_init() checks if kmap() fails by BUG_ON().
> > From the original discussion[2], the BUG_ON() here is just used to
> > explicitly panic NULL pointer. So still keep the BUG_ON() in place to check
> > if kmap_local_page() fails.
>
> How might kmap_local_page() return invalid kernel addresses?
>
> I think that, if this function returns, the pointer is always a valid kernel
> address. Am I missing something?
I think this is my mistake. I did not realize what Zhao was asking me the
other day and generally said to leave BUG_ON's alone and not change things.
In this case kmap_local_page() will not return NULL. It will BUG on its own if
it fails.
>
> > Based on this consideration, memcpy_to_page()
> > is not selected here but only kmap_local_page() is used.
>
> I can't agree with you, if the premises are that kmap_local_page() might
> provide invalid addresses.
I'm ok with the patch as is. But Fabio is correct and it may be worth removing
the check in a follow on patch.
Ira
> Thanks,
>
> Fabio
>
> > Therefore, replace kmap() with kmap_local_page() in hyperv/hv_init.c.
> >
> > [1]: https://lore.kernel.org/all/20220813220034.806698-1-ira.weiny@intel.com
> > [2]: https://lore.kernel.org/lkml/20200915103710.cqmdvzh5lys4wsqo@liuwe-devbox-debian-v2/
> >
> > Suggested-by: Dave Hansen <dave.hansen@intel.com>
> > Suggested-by: Ira Weiny <ira.weiny@intel.com>
> > Suggested-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
> > Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> >
> > ---
> > Suggested by credits.
> > Dave: Referred to his comments about whether kmap() can fail and
> the
> > suggestion to keep BUG_ON() in place.
> > Ira: Referred to his task documentation and review comments about
> > keeping BUG_ON() for kmap_local_page().
> > Fabio: Stole some of his boiler plate commit message.
> > ---
> > arch/x86/hyperv/hv_init.c | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
>
>
>
next prev parent reply other threads:[~2022-10-03 20:25 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-28 9:56 [PATCH] x86/hyperv: Replace kmap() with kmap_local_page() Zhao Liu
2022-09-28 14:08 ` Wei Liu
2022-10-03 8:50 ` Wei Liu
2022-10-06 14:21 ` Zhao Liu
2022-10-09 20:46 ` Wei Liu
2022-10-10 12:06 ` Zhao Liu
2022-10-03 17:43 ` Fabio M. De Francesco
2022-10-03 20:24 ` Ira Weiny [this message]
2022-10-06 14:13 ` Zhao Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YztFEyUA48et0yTt@iweiny-mobl \
--to=ira.weiny@intel.com \
--cc=bp@alien8.de \
--cc=dave.hansen@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=decui@microsoft.com \
--cc=fmdefrancesco@gmail.com \
--cc=haiyangz@microsoft.com \
--cc=hpa@zytor.com \
--cc=kys@microsoft.com \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=sthemmin@microsoft.com \
--cc=tglx@linutronix.de \
--cc=wei.liu@kernel.org \
--cc=x86@kernel.org \
--cc=zhao1.liu@intel.com \
--cc=zhao1.liu@linux.intel.com \
--cc=zhenyu.z.wang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.