All of lore.kernel.org
 help / color / mirror / Atom feed
From: Catalin Marinas <catalin.marinas@arm.com>
To: Yanfei Xu <yanfei.xu@windriver.com>
Cc: akpm@linux-foundation.org, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] mm/kmemleak: use READ_ONCE() for accessing jiffies_scan_wait
Date: Fri, 11 Jun 2021 09:59:13 +0100	[thread overview]
Message-ID: <20210611085913.GA8132@arm.com> (raw)
In-Reply-To: <20210609155657.26972-1-yanfei.xu@windriver.com>

On Wed, Jun 09, 2021 at 11:56:57PM +0800, Yanfei Xu wrote:
> The stop_scan_thread() and start_scan_thread() cannot really solve
> the problem of concurrent accessing the global jiffies_scan_wait.
> 
> kmemleak_write              kmemleak_scan_thread
>                               while (!kthread_should_stop())
>   stop_scan_thread
>   jiffies_scan_wait = xxx       timeout = jiffies_scan_wait
>   start_scan_thread
> 
> We could replace these with a READ_ONCE() when reading
> jiffies_scan_wait. It also can prevent compiler from reordering the
> jiffies_scan_wait which is in while loop.

I'm ok with READ_ONCE but your patch introduces functional changes.

> diff --git a/mm/kmemleak.c b/mm/kmemleak.c
> index 92a2d4885808..5ccf3969b7fe 100644
> --- a/mm/kmemleak.c
> +++ b/mm/kmemleak.c
> @@ -1567,7 +1567,7 @@ static int kmemleak_scan_thread(void *arg)
>  	}
>  
>  	while (!kthread_should_stop()) {
> -		signed long timeout = jiffies_scan_wait;
> +		signed long timeout = READ_ONCE(jiffies_scan_wait);
>  
>  		mutex_lock(&scan_mutex);
>  		kmemleak_scan();
> @@ -1812,11 +1812,8 @@ static ssize_t kmemleak_write(struct file *file, const char __user *user_buf,
>  		ret = kstrtoul(buf + 5, 0, &secs);
>  		if (ret < 0)
>  			goto out;
> -		stop_scan_thread();
> -		if (secs) {
> +		if (secs)
>  			jiffies_scan_wait = msecs_to_jiffies(secs * 1000);

For symmetry, I'd add a WRITE_ONCE here as well.

> -			start_scan_thread();
> -		}

The reason for stop/start_scan_thread() wasn't to protect against
jiffies_scan_wait access but rather to force a new delay. Let's say you
start by default with a 10min delay between scans (default) but you want
to lower it to 1min. With the above removal of stop/start, you'd still
have to wait for 10min until the scanning thread will notice the change.
Also, with secs=0, the expectations is that the thread won't be
restarted but this is removed by your patch.

-- 
Catalin

  reply	other threads:[~2021-06-11  8:59 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-09 15:56 [PATCH] mm/kmemleak: use READ_ONCE() for accessing jiffies_scan_wait Yanfei Xu
2021-06-11  8:59 ` Catalin Marinas [this message]
2021-06-11 11:17   ` Xu, Yanfei
2021-06-13 17:49     ` Xu, Yanfei

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=20210611085913.GA8132@arm.com \
    --to=catalin.marinas@arm.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=yanfei.xu@windriver.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.