Skip to content
  • Linus Torvalds's avatar
    tty: fix endless work loop when the buffer fills up · a5660b41
    Linus Torvalds authored
    Commit f23eb2b2 ('tty: stop using "delayed_work" in the tty layer')
    ended up causing hung machines on UP with no preemption, because the
    work routine to flip the buffer data to the ldisc would endlessly re-arm
    itself if the destination buffer had filled up.
    
    With the delayed work, that only caused a timer-driving polling of the
    tty state every timer tick, but without the delay we just ended up with
    basically a busy loop instead.
    
    Stop the insane polling, and instead make the code that opens up the
    receive room re-schedule the buffer flip work.  That's what we should
    have been doing anyway.
    
    This same "poll for tty room" issue is almost certainly also the cause
    of excessive kworker activity when idle reported by Dave Jones, who also
    reported "flush_to_ldisc executing 2500 times a second" back in Nov 2010:
    
      http://lkml.org/lkml/2010/11/30/592
    
    
    
    which is that silly flushing done every timer tick.  Wasting both power
    and CPU for no good reason.
    
    Reported-and-tested-by: default avatarAlexander Beregalov <a.beregalov@gmail.com>
    Reported-and-tested-by: default avatarSitsofe Wheeler <sitsofe@yahoo.com>
    Cc: Greg KH <gregkh@suse.de>
    Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
    Cc: Dave Jones <davej@redhat.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a5660b41