lkml.org 
[lkml]   [2015]   [May]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 26/51] writeback: let balance_dirty_pages() work on the matching cgroup bdi_writeback
    Date
    Currently, balance_dirty_pages() always work on bdi->wb.  This patch
    updates it to work on the wb (bdi_writeback) matching memcg and blkcg
    of the current task as that's what the inode is being dirtied against.

    balance_dirty_pages_ratelimited() now pins the current wb and passes
    it to balance_dirty_pages().

    As no filesystem has FS_CGROUP_WRITEBACK yet, this doesn't lead to
    visible behavior differences.

    v2: Updated for per-inode wb association.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Jan Kara <jack@suse.cz>
    ---
    mm/page-writeback.c | 18 +++++++++++++-----
    1 file changed, 13 insertions(+), 5 deletions(-)

    diff --git a/mm/page-writeback.c b/mm/page-writeback.c
    index 4d0a9da..e31dea9 100644
    --- a/mm/page-writeback.c
    +++ b/mm/page-writeback.c
    @@ -1337,6 +1337,7 @@ static inline void wb_dirty_limits(struct bdi_writeback *wb,
    * perform some writeout.
    */
    static void balance_dirty_pages(struct address_space *mapping,
    + struct bdi_writeback *wb,
    unsigned long pages_dirtied)
    {
    unsigned long nr_reclaimable; /* = file_dirty + unstable_nfs */
    @@ -1352,8 +1353,7 @@ static void balance_dirty_pages(struct address_space *mapping,
    unsigned long task_ratelimit;
    unsigned long dirty_ratelimit;
    unsigned long pos_ratio;
    - struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
    - struct bdi_writeback *wb = &bdi->wb;
    + struct backing_dev_info *bdi = wb->bdi;
    bool strictlimit = bdi->capabilities & BDI_CAP_STRICTLIMIT;
    unsigned long start_time = jiffies;

    @@ -1575,14 +1575,20 @@ DEFINE_PER_CPU(int, dirty_throttle_leaks) = 0;
    */
    void balance_dirty_pages_ratelimited(struct address_space *mapping)
    {
    - struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
    - struct bdi_writeback *wb = &bdi->wb;
    + struct inode *inode = mapping->host;
    + struct backing_dev_info *bdi = inode_to_bdi(inode);
    + struct bdi_writeback *wb = NULL;
    int ratelimit;
    int *p;

    if (!bdi_cap_account_dirty(bdi))
    return;

    + if (inode_cgwb_enabled(inode))
    + wb = wb_get_create_current(bdi, GFP_KERNEL);
    + if (!wb)
    + wb = &bdi->wb;
    +
    ratelimit = current->nr_dirtied_pause;
    if (wb->dirty_exceeded)
    ratelimit = min(ratelimit, 32 >> (PAGE_SHIFT - 10));
    @@ -1616,7 +1622,9 @@ void balance_dirty_pages_ratelimited(struct address_space *mapping)
    preempt_enable();

    if (unlikely(current->nr_dirtied >= ratelimit))
    - balance_dirty_pages(mapping, current->nr_dirtied);
    + balance_dirty_pages(mapping, wb, current->nr_dirtied);
    +
    + wb_put(wb);
    }
    EXPORT_SYMBOL(balance_dirty_pages_ratelimited);

    --
    2.4.0


    \
     
     \ /
      Last update: 2015-05-23 00:01    [W:4.239 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site