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: > > > >> 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(); } -- To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html