Skip to content
  • Wu Fengguang's avatar
    writeback: update dirtied_when for synced inode to prevent livelock · 94c3dcbb
    Wu Fengguang authored
    Explicitly update .dirtied_when on synced inodes, so that they are no
    longer considered for writeback in the next round.
    
    It can prevent both of the following livelock schemes:
    
    - while true; do echo data >> f; done
    - while true; do touch f;        done (in theory)
    
    The exact livelock condition is, during sync(1):
    
    (1) no new inodes are dirtied
    (2) an inode being actively dirtied
    
    On (2), the inode will be tagged and synced with .nr_to_write=LONG_MAX.
    When finished, it will be redirty_tail()ed because it's still dirty
    and (.nr_to_write > 0). redirty_tail() won't update its ->dirtied_when
    on condition (1). The sync work will then revisit it on the next
    queue_io() and find it eligible again because its old ->dirtied_when
    predates the sync work start time.
    
    We'll do more aggressive "keep writeback as long as we wrote something"
    logic in wb_writeback(). The "use LONG_MAX .nr_to_write" trick in commit
    b9543dac
    
     ("writeback: avoid livelocking WB_SYNC_ALL writeback") will
    no longer be enough to stop sync livelock.
    
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarWu Fengguang <fengguang.wu@intel.com>
    94c3dcbb