From: Minchan Kim <minchan@kernel.org>
To: Christoph Hellwig <hch@lst.de>,
Andrew Morton <akpm@linux-foundation.org>
Cc: Juergen Gross <jgross@suse.com>,
Stefano Stabellini <sstabellini@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
intel-gfx@lists.freedesktop.org, x86@kernel.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
dri-devel@lists.freedesktop.org,
Rodrigo Vivi <rodrigo.vivi@intel.com>,
xen-devel@lists.xenproject.org,
Andrew Morton <akpm@linux-foundation.org>,
Boris Ostrovsky <boris.ostrovsky@oracle.com>,
Nitin Gupta <ngupta@vflare.org>
Subject: Re: [PATCH 1/6] zsmalloc: switch from alloc_vm_area to get_vm_area
Date: Mon, 21 Sep 2020 11:42:29 -0700 [thread overview]
Message-ID: <20200921184229.GA422329@google.com> (raw)
In-Reply-To: <20200921181708.GA2067@lst.de>
On Mon, Sep 21, 2020 at 08:17:08PM +0200, Christoph Hellwig wrote:
> On Mon, Sep 21, 2020 at 10:42:56AM -0700, Minchan Kim wrote:
> > IIRC, the problem was runtime pte popluating needs GFP_KERNEL but
> > zs_map_object API runs under non-preemtible section.
>
> Make sense.
>
> > > - area->vm = alloc_vm_area(PAGE_SIZE * 2, NULL);
> > > + area->vm = get_vm_area(PAGE_SIZE * 2, 0);
> > > if (!area->vm)
> > > return -ENOMEM;
> > > return 0;
> >
> > I think it shoud work.
> >
> > diff --git a/mm/memory.c b/mm/memory.c
> > index 05789aa4af12..6a1e4d854593 100644
> > --- a/mm/memory.c
> > +++ b/mm/memory.c
> > @@ -2232,7 +2232,7 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd,
> > arch_enter_lazy_mmu_mode();
> >
> > do {
> > - if (create || !pte_none(*pte)) {
> > + if ((create || !pte_none(*pte)) && fn) {
> > err = fn(pte++, addr, data);
> > if (err)
> > break;
> > diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
> > index 3e4fe3259612..9ef7daf3d279 100644
> > --- a/mm/zsmalloc.c
> > +++ b/mm/zsmalloc.c
> > @@ -1116,6 +1116,8 @@ static struct zspage *find_get_zspage(struct size_class *class)
> > #ifdef CONFIG_ZSMALLOC_PGTABLE_MAPPING
> > static inline int __zs_cpu_up(struct mapping_area *area)
> > {
> > + int ret;
> > +
> > /*
> > * Make sure we don't leak memory if a cpu UP notification
> > * and zs_init() race and both call zs_cpu_up() on the same cpu
> > @@ -1125,7 +1127,13 @@ static inline int __zs_cpu_up(struct mapping_area *area)
> > area->vm = get_vm_area(PAGE_SIZE * 2, 0);
> > if (!area->vm)
> > return -ENOMEM;
> > - return 0;
> > +
> > + /*
> > + * Populate ptes in advance to avoid pte allocation with GFP_KERNEL
> > + * in non-preemtible context of zs_map_object.
> > + */
> > + ret = apply_to_page_range(&init_mm, NULL, PAGE_SIZE * 2, NULL, NULL);
> > + return ret;
>
> I think this needs the addr from the vm area somewhere..
Yeah, let's assign the addres we got get_vm_area.
>
> We probaby want to add a trivial helper to prefault an area instead of
> the open coded variant.
It seems zsmalloc is only customer the function so let's have the helper
when we see another customer.
If we don't have objection, I'd like to ask to Andrew fold this up.
---
mm/memory.c | 2 +-
mm/zsmalloc.c | 8 +++++++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/mm/memory.c b/mm/memory.c
index 05789aa4af12..6a1e4d854593 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2232,7 +2232,7 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd,
arch_enter_lazy_mmu_mode();
do {
- if (create || !pte_none(*pte)) {
+ if ((create || !pte_none(*pte)) && fn) {
err = fn(pte++, addr, data);
if (err)
break;
diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
index 3e4fe3259612..918c7b019b3d 100644
--- a/mm/zsmalloc.c
+++ b/mm/zsmalloc.c
@@ -1125,7 +1125,13 @@ static inline int __zs_cpu_up(struct mapping_area *area)
area->vm = get_vm_area(PAGE_SIZE * 2, 0);
if (!area->vm)
return -ENOMEM;
- return 0;
+
+ /*
+ * Populate ptes in advance to avoid pte allocation with GFP_KERNEL
+ * in non-preemtible context of zs_map_object.
+ */
+ return apply_to_page_range(&init_mm, (unsigned long)area->vm->addr,
+ PAGE_SIZE * 2, NULL, NULL);
}
static inline void __zs_cpu_down(struct mapping_area *area)
--
2.28.0.681.g6f77f65b4e-goog
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2020-09-21 18:42 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20200918163724.2511-1-hch@lst.de>
[not found] ` <20200918163724.2511-2-hch@lst.de>
2020-09-21 17:42 ` [PATCH 1/6] zsmalloc: switch from alloc_vm_area to get_vm_area Minchan Kim
[not found] ` <20200921181708.GA2067@lst.de>
2020-09-21 18:42 ` Minchan Kim [this message]
[not found] ` <20200918163724.2511-4-hch@lst.de>
2020-09-21 19:11 ` [PATCH 3/6] drm/i915: use vmap in shmem_pin_map Matthew Wilcox
[not found] ` <20200922062249.GA30831@lst.de>
2020-09-22 8:23 ` [Intel-gfx] " Tvrtko Ursulin
[not found] ` <20200922143141.GA26637@lst.de>
2020-09-22 16:13 ` Tvrtko Ursulin
[not found] ` <20200922163346.GA1701@lst.de>
2020-09-22 17:04 ` Tvrtko Ursulin
2020-09-22 11:21 ` Matthew Wilcox
[not found] ` <20200922143906.GB26664@lst.de>
2020-09-22 14:53 ` Matthew Wilcox
[not found] ` <20200918163724.2511-7-hch@lst.de>
2020-09-21 20:44 ` [PATCH 6/6] x86/xen: open code alloc_vm_area in arch_gnttab_valloc boris.ostrovsky
[not found] ` <20200922145819.GA28420@lst.de>
2020-09-22 15:24 ` boris.ostrovsky
[not found] ` <20200922152706.GA30633@lst.de>
2020-09-22 15:34 ` boris.ostrovsky
[not found] ` <20200918163724.2511-5-hch@lst.de>
2020-09-23 9:52 ` [Intel-gfx] [PATCH 4/6] drm/i915: use vmap in i915_gem_object_map Tvrtko Ursulin
[not found] ` <20200923134117.GB9893@lst.de>
2020-09-23 13:58 ` Tvrtko Ursulin
[not found] ` <20200923144455.GA15036@lst.de>
2020-09-24 12:22 ` Tvrtko Ursulin
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=20200921184229.GA422329@google.com \
--to=minchan@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=boris.ostrovsky@oracle.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=hch@lst.de \
--cc=intel-gfx@lists.freedesktop.org \
--cc=jgross@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ngupta@vflare.org \
--cc=peterz@infradead.org \
--cc=rodrigo.vivi@intel.com \
--cc=sstabellini@kernel.org \
--cc=x86@kernel.org \
--cc=xen-devel@lists.xenproject.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox