lkml.org 
[lkml]   [2009]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 1/7] writeback: merely wakeup flusher thread if work allocation fails for WB_SYNC_NONE
    On Mon 14-09-09 11:36:28, Jens Axboe wrote:
    > From: Christoph Hellwig <hch@infradead.org>
    >
    > Since it's an opportunistic writeback and not a data integrity action,
    > don't punt to blocking writeback. Just wakeup the thread and it will
    > flush old data.
    >
    > Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
    Looks good. Acked-by: Jan Kara <jack@suse.cz>
    BTW, don't we miss Christoph's Signed-off-by?

    Honza

    > ---
    > fs/fs-writeback.c | 46 ++++++++++++++--------------------------------
    > 1 files changed, 14 insertions(+), 32 deletions(-)
    >
    > diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
    > index da86ef5..1873fd0 100644
    > --- a/fs/fs-writeback.c
    > +++ b/fs/fs-writeback.c
    > @@ -75,13 +75,6 @@ static inline void bdi_work_init(struct bdi_work *work,
    > work->state = WS_USED;
    > }
    >
    > -static inline void bdi_work_init_on_stack(struct bdi_work *work,
    > - struct writeback_control *wbc)
    > -{
    > - bdi_work_init(work, wbc);
    > - work->state |= WS_ONSTACK;
    > -}
    > -
    > /**
    > * writeback_in_progress - determine whether there is writeback in progress
    > * @bdi: the device's backing_dev_info structure.
    > @@ -207,34 +200,23 @@ static struct bdi_work *bdi_alloc_work(struct writeback_control *wbc)
    >
    > void bdi_start_writeback(struct writeback_control *wbc)
    > {
    > - const bool must_wait = wbc->sync_mode == WB_SYNC_ALL;
    > - struct bdi_work work_stack, *work = NULL;
    > -
    > - if (!must_wait)
    > - work = bdi_alloc_work(wbc);
    > + /*
    > + * WB_SYNC_NONE is opportunistic writeback. If this allocation fails,
    > + * bdi_queue_work() will wake up the thread and flush old data. This
    > + * should ensure some amount of progress in freeing memory.
    > + */
    > + if (wbc->sync_mode != WB_SYNC_ALL) {
    > + struct bdi_work *w = bdi_alloc_work(wbc);
    >
    > - if (!work) {
    > - work = &work_stack;
    > - bdi_work_init_on_stack(work, wbc);
    > - }
    > + bdi_queue_work(wbc->bdi, w);
    > + } else {
    > + struct bdi_work work;
    >
    > - bdi_queue_work(wbc->bdi, work);
    > + bdi_work_init(&work, wbc);
    > + work.state |= WS_ONSTACK;
    >
    > - /*
    > - * If the sync mode is WB_SYNC_ALL, block waiting for the work to
    > - * complete. If not, we only need to wait for the work to be started,
    > - * if we allocated it on-stack. We use the same mechanism, if the
    > - * wait bit is set in the bdi_work struct, then threads will not
    > - * clear pending until after they are done.
    > - *
    > - * Note that work == &work_stack if must_wait is true, so we don't
    > - * need to do call_rcu() here ever, since the completion path will
    > - * have done that for us.
    > - */
    > - if (must_wait || work == &work_stack) {
    > - bdi_wait_on_work_clear(work);
    > - if (work != &work_stack)
    > - call_rcu(&work->rcu_head, bdi_work_free);
    > + bdi_queue_work(wbc->bdi, &work);
    > + bdi_wait_on_work_clear(&work);
    > }
    > }
    >
    > --
    > 1.6.4.1.207.g68ea
    >
    --
    Jan Kara <jack@suse.cz>
    SUSE Labs, CR


    \
     
     \ /
      Last update: 2009-09-14 14:37    [W:0.029 / U:332.424 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site