From: Glauber Costa <glommer@parallels.com>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Joe Perches <joe@perches.com>,
Andrew Morton <akpm@linux-foundation.org>,
Mel Gorman <mgorman@suse.de>, Miao Xie <miaox@cn.fujitsu.com>,
Christoph Lameter <cl@linux.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Theodore Ts'o <tytso@mit.edu>
Subject: Re: [RFC PATCH] checkpatch: Warn on use of yield()
Date: Tue, 6 Mar 2012 17:14:16 +0400 [thread overview]
Message-ID: <4F560DA8.5040302@parallels.com> (raw)
In-Reply-To: <1331037942.11248.307.camel@twins>
On 03/06/2012 04:45 PM, Peter Zijlstra wrote:
> On Mon, 2012-03-05 at 18:01 -0800, Joe Perches wrote:
>
>> +# check for use of yield()
>> + if ($line =~ /\byield\s*\(\s*\)/ {
>> + WARN("YIELD",
>> + "yield() is deprecated, consider cpu_relax()\n" . $herecurr);
>> + }
>
> Its not deprecated as such, its just a very dangerous and ill considered
> API.
>
> cpu_relax() is not a good substitute suggestion in that its still a busy
> wait and prone to much of the same problems.
>
> The case at hand was a life-lock due to expecting that yield() would run
> another process which it needed in order to complete. Yield() does not
> provide that guarantee.
>
> Looking at fs/ext4/mballoc.c, we have this gem:
>
>
> /*
> * Yield the CPU here so that we don't get soft lockup
> * in non preempt case.
> */
> yield();
>
> This is of course complete crap as well.. I suspect they want
> cond_resched() there. And:
>
> /* let others to free the space */
> yield();
>
> Like said, yield() doesn't guarantee anything like running anybody else,
> does it rely on that? Or is it optimistic?
>
> Another fun user:
>
> void tasklet_kill(struct tasklet_struct *t)
> {
> if (in_interrupt())
> printk("Attempt to kill tasklet from interrupt\n");
>
> while (test_and_set_bit(TASKLET_STATE_SCHED,&t->state)) {
> do {
> yield();
> } while (test_bit(TASKLET_STATE_SCHED,&t->state));
> }
> tasklet_unlock_wait(t);
> clear_bit(TASKLET_STATE_SCHED,&t->state);
> }
>
> The only reason that doesn't explode is because running tasklets is
> non-preemptible, However since they're non-preemptible they shouldn't
> run long and you might as well busy spin. If they can run long, yield()
> isn't your biggest problem.
>
> mm/memory_hotplug.c has two yield() calls in offline_pages() and I've no
> idea what they're trying to achieve.
>
> But really, yield() is basically _always_ the wrong thing. The right
> thing can be:
>
> cond_resched(); wait_event(); or something entirely different.
>
> So instead of suggesting an alternative, I would suggest thinking about
> the actual problem in order to avoid the non-thinking solutions the
> checkpatch brigade is so overly fond of :/
>
> Maybe something like:
>
> "yield() is dangerous and wrong, rework your code to not use it."
>
> That at least requires some sort of thinking and doesn't suggest blind
> substitution.
>
Can't we point people to some Documentation file that explains the
alternatives?
--
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>
WARNING: multiple messages have this Message-ID (diff)
From: Glauber Costa <glommer@parallels.com>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Joe Perches <joe@perches.com>,
Andrew Morton <akpm@linux-foundation.org>,
Mel Gorman <mgorman@suse.de>, Miao Xie <miaox@cn.fujitsu.com>,
Christoph Lameter <cl@linux.com>, <linux-mm@kvack.org>,
<linux-kernel@vger.kernel.org>, "Theodore Ts'o" <tytso@mit.edu>
Subject: Re: [RFC PATCH] checkpatch: Warn on use of yield()
Date: Tue, 6 Mar 2012 17:14:16 +0400 [thread overview]
Message-ID: <4F560DA8.5040302@parallels.com> (raw)
In-Reply-To: <1331037942.11248.307.camel@twins>
On 03/06/2012 04:45 PM, Peter Zijlstra wrote:
> On Mon, 2012-03-05 at 18:01 -0800, Joe Perches wrote:
>
>> +# check for use of yield()
>> + if ($line =~ /\byield\s*\(\s*\)/ {
>> + WARN("YIELD",
>> + "yield() is deprecated, consider cpu_relax()\n" . $herecurr);
>> + }
>
> Its not deprecated as such, its just a very dangerous and ill considered
> API.
>
> cpu_relax() is not a good substitute suggestion in that its still a busy
> wait and prone to much of the same problems.
>
> The case at hand was a life-lock due to expecting that yield() would run
> another process which it needed in order to complete. Yield() does not
> provide that guarantee.
>
> Looking at fs/ext4/mballoc.c, we have this gem:
>
>
> /*
> * Yield the CPU here so that we don't get soft lockup
> * in non preempt case.
> */
> yield();
>
> This is of course complete crap as well.. I suspect they want
> cond_resched() there. And:
>
> /* let others to free the space */
> yield();
>
> Like said, yield() doesn't guarantee anything like running anybody else,
> does it rely on that? Or is it optimistic?
>
> Another fun user:
>
> void tasklet_kill(struct tasklet_struct *t)
> {
> if (in_interrupt())
> printk("Attempt to kill tasklet from interrupt\n");
>
> while (test_and_set_bit(TASKLET_STATE_SCHED,&t->state)) {
> do {
> yield();
> } while (test_bit(TASKLET_STATE_SCHED,&t->state));
> }
> tasklet_unlock_wait(t);
> clear_bit(TASKLET_STATE_SCHED,&t->state);
> }
>
> The only reason that doesn't explode is because running tasklets is
> non-preemptible, However since they're non-preemptible they shouldn't
> run long and you might as well busy spin. If they can run long, yield()
> isn't your biggest problem.
>
> mm/memory_hotplug.c has two yield() calls in offline_pages() and I've no
> idea what they're trying to achieve.
>
> But really, yield() is basically _always_ the wrong thing. The right
> thing can be:
>
> cond_resched(); wait_event(); or something entirely different.
>
> So instead of suggesting an alternative, I would suggest thinking about
> the actual problem in order to avoid the non-thinking solutions the
> checkpatch brigade is so overly fond of :/
>
> Maybe something like:
>
> "yield() is dangerous and wrong, rework your code to not use it."
>
> That at least requires some sort of thinking and doesn't suggest blind
> substitution.
>
Can't we point people to some Documentation file that explains the
alternatives?
next prev parent reply other threads:[~2012-03-06 13:15 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-02 11:23 [PATCH] cpuset: mm: Remove memory barrier damage from the page allocator Mel Gorman
2012-03-02 11:23 ` Mel Gorman
2012-03-02 16:19 ` Christoph Lameter
2012-03-02 16:19 ` Christoph Lameter
2012-03-02 17:43 ` Mel Gorman
2012-03-02 17:43 ` Mel Gorman
2012-03-02 19:53 ` Christoph Lameter
2012-03-02 19:53 ` Christoph Lameter
2012-03-02 21:25 ` Peter Zijlstra
2012-03-02 21:25 ` Peter Zijlstra
2012-03-02 23:47 ` David Rientjes
2012-03-02 23:47 ` David Rientjes
2012-03-05 9:44 ` Mel Gorman
2012-03-05 9:44 ` Mel Gorman
2012-03-06 23:31 ` David Rientjes
2012-03-06 23:31 ` David Rientjes
2012-03-05 9:35 ` Mel Gorman
2012-03-05 9:35 ` Mel Gorman
2012-03-02 21:21 ` Peter Zijlstra
2012-03-02 21:21 ` Peter Zijlstra
2012-03-05 20:18 ` Andrew Morton
2012-03-05 20:18 ` Andrew Morton
2012-03-06 2:01 ` [RFC PATCH] checkpatch: Warn on use of yield() Joe Perches
2012-03-06 2:01 ` Joe Perches
2012-03-06 12:45 ` Peter Zijlstra
2012-03-06 12:45 ` Peter Zijlstra
2012-03-06 13:14 ` Glauber Costa [this message]
2012-03-06 13:14 ` Glauber Costa
2012-03-06 13:25 ` Peter Zijlstra
2012-03-06 13:25 ` Peter Zijlstra
2012-03-06 13:27 ` Glauber Costa
2012-03-06 13:27 ` Glauber Costa
2012-03-06 17:41 ` Joe Perches
2012-03-06 17:41 ` Joe Perches
2012-03-06 17:54 ` Peter Zijlstra
2012-03-06 17:54 ` Peter Zijlstra
2012-03-06 18:00 ` Joe Perches
2012-03-06 18:00 ` Joe Perches
2012-03-06 18:17 ` Joe Perches
2012-03-06 18:17 ` Joe Perches
2012-03-06 19:31 ` [PATCH 1/2] " Joe Perches
2012-03-06 19:31 ` [PATCH 2/2] checkpatch: whitespace - add/remove blank lines Joe Perches
2012-03-08 15:56 ` [PATCH 1/2 V2] checkpatch: Warn on use of yield() Joe Perches
2012-03-13 4:47 ` [tip:sched/core] sched: Update yield() docs tip-bot for Peter Zijlstra
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=4F560DA8.5040302@parallels.com \
--to=glommer@parallels.com \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=cl@linux.com \
--cc=joe@perches.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mgorman@suse.de \
--cc=miaox@cn.fujitsu.com \
--cc=tytso@mit.edu \
/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.