All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vlastimil Babka <vbabka@suse.cz>
To: Sergei Trofimovich <slyfox@gentoo.org>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	Ingo Molnar <mingo@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Juri Lelli <juri.lelli@redhat.com>,
	Vincent Guittot <vincent.guittot@linaro.org>,
	Dietmar Eggemann <dietmar.eggemann@arm.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Ben Segall <bsegall@google.com>, Mel Gorman <mgorman@suse.de>,
	Daniel Bristot de Oliveira <bristot@redhat.com>
Subject: Re: [PATCH] mm: page_owner: detect page_owner recursion via task_struct
Date: Wed, 7 Apr 2021 14:25:41 +0200	[thread overview]
Message-ID: <876f8349-5b64-6be5-6a97-4cf17d7abfb1@suse.cz> (raw)
In-Reply-To: <20210402125039.671f1f40@sf>

On 4/2/21 1:50 PM, Sergei Trofimovich wrote:
> On Thu, 1 Apr 2021 17:05:19 -0700
> Andrew Morton <akpm@linux-foundation.org> wrote:
> 
>> On Thu,  1 Apr 2021 23:30:10 +0100 Sergei Trofimovich <slyfox@gentoo.org> wrote:
>> 
>> > Before the change page_owner recursion was detected via fetching
>> > backtrace and inspecting it for current instruction pointer.
>> > It has a few problems:
>> > - it is slightly slow as it requires extra backtrace and a linear
>> >   stack scan of the result
>> > - it is too late to check if backtrace fetching required memory
>> >   allocation itself (ia64's unwinder requires it).
>> > 
>> > To simplify recursion tracking let's use page_owner recursion depth
>> > as a counter in 'struct task_struct'.  
>> 
>> Seems like a better approach.
>> 
>> > The change make page_owner=on work on ia64 bu avoiding infinite
>> > recursion in:
>> >   kmalloc()  
>> >   -> __set_page_owner()
>> >   -> save_stack()
>> >   -> unwind() [ia64-specific]
>> >   -> build_script()
>> >   -> kmalloc()
>> >   -> __set_page_owner() [we short-circuit here]
>> >   -> save_stack()
>> >   -> unwind() [recursion]  
>> > 
>> > ...
>> >
>> > --- a/include/linux/sched.h
>> > +++ b/include/linux/sched.h
>> > @@ -1371,6 +1371,15 @@ struct task_struct {
>> >  	struct llist_head               kretprobe_instances;
>> >  #endif
>> >  
>> > +#ifdef CONFIG_PAGE_OWNER
>> > +	/*
>> > +	 * Used by page_owner=on to detect recursion in page tracking.
>> > +	 * Is it fine to have non-atomic ops here if we ever access
>> > +	 * this variable via current->page_owner_depth?  
>> 
>> Yes, it is fine.  This part of the comment can be removed.
> 
> Cool! Will do.
> 
>> > +	 */
>> > +	unsigned int page_owner_depth;
>> > +#endif  
>> 
>> Adding to the task_struct has a cost.  But I don't expect that
>> PAGE_OWNER is commonly used in prodction builds (correct?).
> 
> Yeah, PAGE_OWNER should not be enabled for production kernels.

Note that it was converted to use a static key exactly so that it can be always
built in production kernels, and simply enabled on boot when needed. Our kernels
have it enabled.

> Not having extra memory overhead (or layout disruption) is a nice
> benefit though. I'll switch to "Unserialized, strictly 'current'" bitfield.
> 
>> > --- a/init/init_task.c
>> > +++ b/init/init_task.c
>> > @@ -213,6 +213,9 @@ struct task_struct init_task
>> >  #ifdef CONFIG_SECCOMP
>> >  	.seccomp	= { .filter_count = ATOMIC_INIT(0) },
>> >  #endif
>> > +#ifdef CONFIG_PAGE_OWNER
>> > +	.page_owner_depth	= 0,
>> > +#endif
>> >  };
>> >  EXPORT_SYMBOL(init_task);  
>> 
>> It will be initialized to zero by the compiler.  We can omit this hunk
>> entirely.
>> 
>> > --- a/mm/page_owner.c
>> > +++ b/mm/page_owner.c
>> > @@ -20,6 +20,16 @@
>> >   */
>> >  #define PAGE_OWNER_STACK_DEPTH (16)
>> >  
>> > +/*
>> > + * How many reenters we allow to page_owner.
>> > + *
>> > + * Sometimes metadata allocation tracking requires more memory to be allocated:
>> > + * - when new stack trace is saved to stack depot
>> > + * - when backtrace itself is calculated (ia64)
>> > + * Instead of falling to infinite recursion give it a chance to recover.
>> > + */
>> > +#define PAGE_OWNER_MAX_RECURSION_DEPTH (1)  
>> 
>> So this is presently a boolean.  Is there any expectation that
>> PAGE_OWNER_MAX_RECURSION_DEPTH will ever be greater than 1?  If not, we
>> could use a single bit in the task_struct.  Add it to the
>> "Unserialized, strictly 'current'" bitfields.  Could make it a 2-bit field if we want
>> to permit PAGE_OWNER_MAX_RECURSION_DEPTH=larger.
> 
> Let's settle on depth=1. depth>1 is not trivial for other reasons I don't
> completely understand.

That's fine, I don't think depth>1 would bring us much benefit anyway.

> Follow-up patch incoming.
> 


      parent reply	other threads:[~2021-04-07 12:25 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-01 22:30 [PATCH] mm: page_owner: detect page_owner recursion via task_struct Sergei Trofimovich
2021-04-02  0:05 ` Andrew Morton
2021-04-02 11:50   ` Sergei Trofimovich
2021-04-02 11:53     ` [PATCH v2] " Sergei Trofimovich
2021-04-07 12:32       ` Vlastimil Babka
2021-04-07 12:25     ` Vlastimil Babka [this message]

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=876f8349-5b64-6be5-6a97-4cf17d7abfb1@suse.cz \
    --to=vbabka@suse.cz \
    --cc=akpm@linux-foundation.org \
    --cc=bristot@redhat.com \
    --cc=bsegall@google.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=juri.lelli@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@suse.de \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=slyfox@gentoo.org \
    --cc=vincent.guittot@linaro.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.