All of lore.kernel.org
 help / color / mirror / Atom feed
From: Uladzislau Rezki <urezki@gmail.com>
To: Steven Rostedt <rostedt@goodmis.org>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	"Uladzislau Rezki (Sony)" <urezki@gmail.com>,
	Daniel Wagner <dwagner@suse.de>,
	Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	Thomas Gleixner <tglx@linutronix.de>,
	linux-mm@kvack.org, LKML <linux-kernel@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Hillf Danton <hdanton@sina.com>, Michal Hocko <mhocko@suse.com>,
	Matthew Wilcox <willy@infradead.org>,
	Oleksiy Avramchenko <oleksiy.avramchenko@sonymobile.com>
Subject: Re: [PATCH 1/1] mm/vmalloc: remove preempt_disable/enable when do preloading
Date: Thu, 10 Oct 2019 17:17:49 +0200	[thread overview]
Message-ID: <20191010151749.GA14740@pc636> (raw)
In-Reply-To: <20191009221725.0b83151e@oasis.local.home>

> > 
> > A few questions about the resulting alloc_vmap_area():
> > 
> > : static struct vmap_area *alloc_vmap_area(unsigned long size,
> > : 				unsigned long align,
> > : 				unsigned long vstart, unsigned long vend,
> > : 				int node, gfp_t gfp_mask)
> > : {
> > : 	struct vmap_area *va, *pva;
> > : 	unsigned long addr;
> > : 	int purged = 0;
> > : 
> > : 	BUG_ON(!size);
> > : 	BUG_ON(offset_in_page(size));
> > : 	BUG_ON(!is_power_of_2(align));
> > : 
> > : 	if (unlikely(!vmap_initialized))
> > : 		return ERR_PTR(-EBUSY);
> > : 
> > : 	might_sleep();
> > : 
> > : 	va = kmem_cache_alloc_node(vmap_area_cachep,
> > : 			gfp_mask & GFP_RECLAIM_MASK, node);
> > 
> > Why does this use GFP_RECLAIM_MASK?  Please add a comment explaining
> > this.
> > 
I need to think about it. Initially it was like that.

> > : 	if (unlikely(!va))
> > : 		return ERR_PTR(-ENOMEM);
> > : 
> > : 	/*
> > : 	 * Only scan the relevant parts containing pointers to other objects
> > : 	 * to avoid false negatives.
> > : 	 */
> > : 	kmemleak_scan_area(&va->rb_node, SIZE_MAX, gfp_mask & GFP_RECLAIM_MASK);
> > : 
> > : retry:
> > : 	/*
> > : 	 * Preload this CPU with one extra vmap_area object. It is used
> > : 	 * when fit type of free area is NE_FIT_TYPE. Please note, it
> > : 	 * does not guarantee that an allocation occurs on a CPU that
> > : 	 * is preloaded, instead we minimize the case when it is not.
> > : 	 * It can happen because of migration, because there is a race
> > : 	 * until the below spinlock is taken.
> > : 	 *
> > : 	 * The preload is done in non-atomic context, thus it allows us
> > : 	 * to use more permissive allocation masks to be more stable under
> > : 	 * low memory condition and high memory pressure.
> > : 	 *
> > : 	 * Even if it fails we do not really care about that. Just proceed
> > : 	 * as it is. "overflow" path will refill the cache we allocate from.
> > : 	 */
> > : 	if (!this_cpu_read(ne_fit_preload_node)) {
> > 
> > Readability nit: local `pva' should be defined here, rather than having
> > function-wide scope.
> > 
> > : 		pva = kmem_cache_alloc_node(vmap_area_cachep, GFP_KERNEL, node);
> > 
> > Why doesn't this honour gfp_mask?  If it's not a bug, please add
> > comment explaining this.
> > 
But there is a comment, if understand you correctly:

<snip>
* Even if it fails we do not really care about that. Just proceed
* as it is. "overflow" path will refill the cache we allocate from.
<snip>

> > The kmem_cache_alloc() in adjust_va_to_fit_type() omits the caller's
> > gfp_mask also.  If not a bug, please document the unexpected behaviour.
> > 
I will add a comment there.

> 
> These questions appear to be for the code that this patch touches, not
> for the patch itself.
> 
> > : 
> > : 		if (this_cpu_cmpxchg(ne_fit_preload_node, NULL,
> > pva)) { : 			if (pva)
> > : 				kmem_cache_free(vmap_area_cachep,
> > pva); : 		}
> > : 	}
> > : 
> > : 	spin_lock(&vmap_area_lock);
> > : 
> > : 	/*
> > : 	 * If an allocation fails, the "vend" address is
> > : 	 * returned. Therefore trigger the overflow path.
> > : 	 */
> > 
> > As for the intent of this patch, why not preallocate the vmap_area
> > outside the spinlock and use it within the spinlock?  Does spin_lock()
> > disable preemption on RT?  I forget, but it doesn't matter much anyway
> 
> spin_lock() does not disable preemption on RT. But it does disable
> migration (thus the task should remain on the current CPU).
> 
> > - doing this will make the code better in the regular kernel I think? 
> > Something like this:
> > 
> > 	struct vmap_area *pva = NULL;
> > 
> > 	...
> > 
> > 	if (!this_cpu_read(ne_fit_preload_node))
> > 		pva = kmem_cache_alloc_node(vmap_area_cachep, ...);
> > 
> > 	spin_lock(&vmap_area_lock);
> > 
> > 	if (pva && __this_cpu_cmpxchg(ne_fit_preload_node, NULL, pva))
> > 		kmem_cache_free(vmap_area_cachep, pva);
> > 
> 
> 
> This looks fine to me.
> 
Yes, i agree that is better. I was thinking about doing so, but decided
to keep as it is, because of low number of "corner cases" anyway.

I will upload the v2.

Thanks for the comments!

--
Vlad Rezki


  reply	other threads:[~2019-10-10 15:18 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-09 16:49 [PATCH 1/1] mm/vmalloc: remove preempt_disable/enable when do preloading Uladzislau Rezki (Sony)
2019-10-09 18:21 ` Steven Rostedt
2019-10-09 22:19 ` Andrew Morton
2019-10-10  2:17   ` Steven Rostedt
2019-10-10 15:17     ` Uladzislau Rezki [this message]
2019-10-11 23:55       ` Andrew Morton
2019-10-14 14:27         ` Uladzislau Rezki
2019-10-14 16:30           ` Michal Hocko
2019-10-15  9:54             ` Uladzislau Rezki

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=20191010151749.GA14740@pc636 \
    --to=urezki@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=bigeasy@linutronix.de \
    --cc=dwagner@suse.de \
    --cc=hdanton@sina.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@suse.com \
    --cc=oleksiy.avramchenko@sonymobile.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=willy@infradead.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 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.