lkml.org 
[lkml]   [2007]   [Mar]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [patch 1/3] fix illogical behavior in balance_dirty_pages()
    From
    Date
    On Sun, 2007-03-25 at 13:34 +0200, Miklos Szeredi wrote:
    > > >
    > > > Please have a look at this:
    > > > http://lkml.org/lkml/2007/3/19/220
    > >
    > >
    > >
    > > > + if (bdi_nr_reclaimable + bdi_stat(bdi, BDI_WRITEBACK) <=
    > > > + bdi_thresh)
    > > > + break;
    > > >
    > >
    > > Yes, this will resolve the deadlock as well, where balance_dirty_pages()
    > > is currently looping forever with:
    >
    > Almost.
    >
    > This
    >
    > > - if (nr_reclaimable) {
    > > + if (bdi_nr_reclaimable) {
    > > writeback_inodes(&wbc);
    >
    > still makes it loop forever if bdi_nr_reclaimable == 0, since the exit
    > condition is not checked.
    >
    > Shouldn't it break out of the loop if bdi_stat(bdi, BDI_WRITEBACK) <=
    > bdi_thresh in this case?

    for (;;) {
    struct writeback_control wbc = {
    .bdi = bdi,
    .sync_mode = WB_SYNC_NONE,
    .older_than_this = NULL,
    .nr_to_write = write_chunk,
    .range_cyclic = 1,
    };

    get_dirty_limits(&background_thresh, &dirty_thresh,
    &bdi_thresh, bdi);
    bdi_nr_reclaimable = bdi_stat(bdi, BDI_DIRTY) +
    bdi_stat(bdi, BDI_UNSTABLE);
    (A) if (bdi_nr_reclaimable + bdi_stat(bdi, BDI_WRITEBACK) <=
    bdi_thresh)
    break;

    /* Note: nr_reclaimable denotes nr_dirty + nr_unstable.
    * Unstable writes are a feature of certain networked
    * filesystems (i.e. NFS) in which data may have been
    * written to the server's write cache, but has not yet
    * been flushed to permanent storage.
    */
    (B) if (bdi_nr_reclaimable) {
    writeback_inodes(&wbc);

    get_dirty_limits(&background_thresh, &dirty_thresh,
    &bdi_thresh, bdi);
    bdi_nr_reclaimable = bdi_stat(bdi, BDI_DIRTY) +
    bdi_stat(bdi, BDI_UNSTABLE);
    (C) if (bdi_nr_reclaimable + bdi_stat(bdi, BDI_WRITEBACK) <=
    bdi_thresh)
    break;

    pages_written += write_chunk - wbc.nr_to_write;
    if (pages_written >= write_chunk)
    break; /* We've done our duty */
    }
    congestion_wait(WRITE, HZ/10);
    }

    I'm thinking that if bdi_nr_reclaimable == 0, A reduces to
    bdi_stat(bdi, BDI_WRITEBACK) <= bdi_thresh and we're still out of the
    loop, no?

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-03-25 13:53    [W:0.025 / U:29.576 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site