lkml.org 
[lkml]   [2010]   [Jul]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Subject[RFC][PATCH 00/16] kill unnecessary bdi wakeups + cleanups
    Date
    Hi,

    here is a series of patches which lessens amount of unnecessary wake-ups in
    the linux kernel.

    THE PROBLEM
    ~~~~~~~~~~~

    Each block device has corresponding "flusher" thread, which are usually seen
    as "flusher-x:y" in your 'ps' output. Flusher threads are responsible to do
    background write-back for different kernel code paths like memory reclamation
    as well as the periodic background writeout.

    The flusher threads wake up every 5 seconds and check whether they have to
    write anything back or not. In idle systems with good dynamic power-management
    this means that they force it to wake up from deep sleep, find out that there
    is nothing to do, and waste power. This hurts small battery-powered devices,
    e.g., linux-based phones.

    But idle wake-ups do not last forever, the bdi threads kill themselves if
    nothing useful has been done for 5 minutes.

    Also, there is the bdi forker thread, seen as 'bdi-default' in your 'ps'
    output. This thread also wakes up every 5 seconds and checks whether it has to
    fork a bid flusher thread, in case there is dirt to write-back, but the thread
    was killed. This is also bad for battery-powered embedded devices.

    SOLUTION
    ~~~~~~~~

    This patch set makes bdi threads and the forker thread wake-up only if there is
    job to do, otherwise they will sleep. The main idea is to wake-up the needed
    thread when adding dirty data to the bdi.

    To implement this:

    1. I address various rare race conditions in the current code.
    2. Then I move the killing logic from bdi threads to the forker thread, so that
    we would have one central place where we make decisions about killing inactive
    bdi threads. The reason I do this is because otherwise it is difficult to make
    sure that a bdi thread does not decide to exit while you are waking it up.
    3. I add a small piece of code to '__mark_inode_dirt()' which wakes up the bdi
    thread when dirty inodes arrive
    4. There are also clean-up patches and nicification patches which I found to be
    good for better code readability.
    5. Some patches are just preparations which make the following real patches
    simpler and easier to review.
    6. Some patches are just simplifications of current code.

    With this patchset bdi threads wake up considerably less.

    This is RFC so far, because:
    1. I'm new to this area
    2. patches really need review
    3. patches need more testing and polishing

    Side note, there is another set of patches which are solving a similar problem
    waiting for comments/acceptance:
    http://thread.gmane.org/gmane.linux.file-systems/42834

    Artem.


    \
     
     \ /
      Last update: 2010-07-16 14:55    [W:0.022 / U:0.644 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site