Re: [PATCH] net: sched: dev_deactivate_many(): use msleep(1) instead of yield() to wait for outstanding qdisc_run callsb
From: Eric Dumazet <hidden>
Date: 2014-04-02 11:17:44
Also in:
linux-rt-users, lkml
From: Eric Dumazet <hidden>
Date: 2014-04-02 11:17:44
Also in:
linux-rt-users, lkml
On Wed, 2014-04-02 at 13:07 +0200, Peter Zijlstra wrote:
On Mon, Mar 31, 2014 at 11:49:16PM +0200, Thomas Gleixner wrote:quoted
quoted
quoted
quoted
The intent of a yield() call, like this one here, is unambiguously that the current thread cannot do anything until some other thread gets onto the cpu and makes forward progress.Yeah; like Thomas said; that's not what yield() does -- or can do. yield() only says 'I don't know what to do, you figure it out', but then fails to provide enough information to actually do something sensible. It cannot put the task to sleep; because it doesn't pair with a wakeup; and therefore the task stays an eligible/runnable task from a scheduler pov. The scheduler is therefore entirely in its right to pick this task again; and pretty much has to under many circumstances. yield() does not, and can not, guarantee forward progress - ever. Use wait_event() and assorted bits to wait for an actual event. That is a sleep paired with a wakeup and thus has progress guarantees.
Why wouldn't it be safe to redefine yield as msleep(1) ?
net/ipv4/tcp_output.c seems to also use yield().
/* Socket is locked, keep trying until memory is available. */
for (;;) {
skb = alloc_skb_fclone(MAX_TCP_HEADER,
sk->sk_allocation);
if (skb)
break;
yield();
}