All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: David Rientjes <rientjes@google.com>
Cc: John Stultz <john.stultz@linaro.org>,
	LKML <linux-kernel@vger.kernel.org>,
	KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
	Dave Hansen <dave@linux.vnet.ibm.com>,
	linux-mm@kvack.org
Subject: Re: [PATCH 3/3] comm: ext4: Protect task->comm access by using get_task_comm()
Date: Wed, 4 May 2011 16:36:57 -0700	[thread overview]
Message-ID: <20110504163657.52dca3fc.akpm@linux-foundation.org> (raw)
In-Reply-To: <alpine.DEB.2.00.1104281426210.21665@chino.kir.corp.google.com>

On Thu, 28 Apr 2011 14:35:32 -0700 (PDT)
David Rientjes <rientjes@google.com> wrote:

> On Wed, 27 Apr 2011, John Stultz wrote:
> 
> > diff --git a/fs/ext4/file.c b/fs/ext4/file.c
> > index 7b80d54..d37414e 100644
> > --- a/fs/ext4/file.c
> > +++ b/fs/ext4/file.c
> > @@ -124,11 +124,15 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov,
> >  		static unsigned long unaligned_warn_time;
> >  
> >  		/* Warn about this once per day */
> > -		if (printk_timed_ratelimit(&unaligned_warn_time, 60*60*24*HZ))
> > +		if (printk_timed_ratelimit(&unaligned_warn_time, 60*60*24*HZ)) {
> > +			char comm[TASK_COMM_LEN];
> > +
> > +			get_task_comm(comm, current);
> >  			ext4_msg(inode->i_sb, KERN_WARNING,
> >  				 "Unaligned AIO/DIO on inode %ld by %s; "
> >  				 "performance will be poor.",
> > -				 inode->i_ino, current->comm);
> > +				 inode->i_ino, comm);
> > +		}
> >  		mutex_lock(ext4_aio_mutex(inode));
> >  		ext4_aiodio_wait(inode);
> >  	}
> 
> Thanks very much for looking into concurrent readers of current->comm, 
> John!
> 
> This patch in the series demonstrates one of the problems with using 
> get_task_comm(), however: we must allocate a 16-byte buffer on the stack 
> and that could become risky if we don't know its current depth.  We may be 
> particularly deep in the stack and then cause an overflow because of the 
> 16 bytes.
> 
> I'm wondering if it would be better for ->comm to be protected by a 
> spinlock (or rwlock) other than ->alloc_lock and then just require readers 
> to take the lock prior to dereferencing it?  That's what is done in the 
> oom killer with task_lock().  Perhaps you could introduce new 
> task_comm_lock() and task_comm_unlock() to prevent the extra stack usage 
> in over 300 locations within the kernel?

16 bytes isn't all that much.  It's just two longs worth.

I'm suspecting that approximately 100% of the get_task_comm() callsites
are using it for a printk, so how about we add a %p thingy for it then
zap lots of code?

I read the changelogs and can't work out why a seqlock was added.  What
was wrong with the task_lock()?


WARNING: multiple messages have this Message-ID (diff)
From: Andrew Morton <akpm@linux-foundation.org>
To: David Rientjes <rientjes@google.com>
Cc: John Stultz <john.stultz@linaro.org>,
	LKML <linux-kernel@vger.kernel.org>,
	KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
	Dave Hansen <dave@linux.vnet.ibm.com>,
	linux-mm@kvack.org
Subject: Re: [PATCH 3/3] comm: ext4: Protect task->comm access by using get_task_comm()
Date: Wed, 4 May 2011 16:36:57 -0700	[thread overview]
Message-ID: <20110504163657.52dca3fc.akpm@linux-foundation.org> (raw)
In-Reply-To: <alpine.DEB.2.00.1104281426210.21665@chino.kir.corp.google.com>

On Thu, 28 Apr 2011 14:35:32 -0700 (PDT)
David Rientjes <rientjes@google.com> wrote:

> On Wed, 27 Apr 2011, John Stultz wrote:
> 
> > diff --git a/fs/ext4/file.c b/fs/ext4/file.c
> > index 7b80d54..d37414e 100644
> > --- a/fs/ext4/file.c
> > +++ b/fs/ext4/file.c
> > @@ -124,11 +124,15 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov,
> >  		static unsigned long unaligned_warn_time;
> >  
> >  		/* Warn about this once per day */
> > -		if (printk_timed_ratelimit(&unaligned_warn_time, 60*60*24*HZ))
> > +		if (printk_timed_ratelimit(&unaligned_warn_time, 60*60*24*HZ)) {
> > +			char comm[TASK_COMM_LEN];
> > +
> > +			get_task_comm(comm, current);
> >  			ext4_msg(inode->i_sb, KERN_WARNING,
> >  				 "Unaligned AIO/DIO on inode %ld by %s; "
> >  				 "performance will be poor.",
> > -				 inode->i_ino, current->comm);
> > +				 inode->i_ino, comm);
> > +		}
> >  		mutex_lock(ext4_aio_mutex(inode));
> >  		ext4_aiodio_wait(inode);
> >  	}
> 
> Thanks very much for looking into concurrent readers of current->comm, 
> John!
> 
> This patch in the series demonstrates one of the problems with using 
> get_task_comm(), however: we must allocate a 16-byte buffer on the stack 
> and that could become risky if we don't know its current depth.  We may be 
> particularly deep in the stack and then cause an overflow because of the 
> 16 bytes.
> 
> I'm wondering if it would be better for ->comm to be protected by a 
> spinlock (or rwlock) other than ->alloc_lock and then just require readers 
> to take the lock prior to dereferencing it?  That's what is done in the 
> oom killer with task_lock().  Perhaps you could introduce new 
> task_comm_lock() and task_comm_unlock() to prevent the extra stack usage 
> in over 300 locations within the kernel?

16 bytes isn't all that much.  It's just two longs worth.

I'm suspecting that approximately 100% of the get_task_comm() callsites
are using it for a printk, so how about we add a %p thingy for it then
zap lots of code?

I read the changelogs and can't work out why a seqlock was added.  What
was wrong with the task_lock()?

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2011-05-04 23:37 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-04-28  4:03 [RFC][PATCH 0/3] Improve task->comm locking situation John Stultz
2011-04-28  4:03 ` John Stultz
2011-04-28  4:03 ` [PATCH 1/3] comm: Introduce comm_lock seqlock to protect task->comm access John Stultz
2011-04-28  4:03   ` John Stultz
2011-04-28  4:03 ` [PATCH 2/3] comm: timerstats: Protect task->comm access by using get_task_comm() John Stultz
2011-04-28  4:03   ` John Stultz
2011-04-28  4:03 ` [PATCH 3/3] comm: ext4: " John Stultz
2011-04-28  4:03   ` John Stultz
2011-04-28 21:35   ` David Rientjes
2011-04-28 21:35     ` David Rientjes
2011-05-04 23:36     ` Andrew Morton [this message]
2011-05-04 23:36       ` Andrew Morton
2011-05-04 23:42       ` Andrew Morton
2011-05-04 23:42         ` Andrew Morton
2011-05-04 23:55       ` John Stultz
2011-05-04 23:55         ` John Stultz
2011-05-07 16:30         ` Ted Ts'o
2011-05-07 16:30           ` Ted Ts'o

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=20110504163657.52dca3fc.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=dave@linux.vnet.ibm.com \
    --cc=john.stultz@linaro.org \
    --cc=kosaki.motohiro@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=rientjes@google.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.