Loading fs/fs-writeback.c +34 −1 Original line number Diff line number Diff line Loading @@ -775,12 +775,36 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) * Handle writeback of dirty data for the device backed by this bdi. Also * wakes up periodically and does kupdated style flushing. */ int bdi_writeback_task(struct bdi_writeback *wb) int bdi_writeback_thread(void *data) { struct bdi_writeback *wb = data; struct backing_dev_info *bdi = wb->bdi; unsigned long last_active = jiffies; unsigned long wait_jiffies = -1UL; long pages_written; /* * Add us to the active bdi_list */ spin_lock_bh(&bdi_lock); list_add_rcu(&bdi->bdi_list, &bdi_list); spin_unlock_bh(&bdi_lock); current->flags |= PF_FLUSHER | PF_SWAPWRITE; set_freezable(); /* * Our parent may run at a different priority, just set us to normal */ set_user_nice(current, 0); /* * Clear pending bit and wakeup anybody waiting to tear us down */ clear_bit(BDI_pending, &bdi->state); smp_mb__after_clear_bit(); wake_up_bit(&bdi->state, BDI_pending); while (!kthread_should_stop()) { pages_written = wb_do_writeback(wb, 0); Loading Loading @@ -813,9 +837,18 @@ int bdi_writeback_task(struct bdi_writeback *wb) try_to_freeze(); } wb->task = NULL; /* * Flush any work that raced with us exiting. No new work * will be added, since this bdi isn't discoverable anymore. */ if (!list_empty(&bdi->work_list)) wb_do_writeback(wb, 1); return 0; } /* * Start writeback of `nr_pages' pages. If `nr_pages' is zero, write back * the whole world. Loading include/linux/backing-dev.h +1 −1 Original line number Diff line number Diff line Loading @@ -102,7 +102,7 @@ void bdi_unregister(struct backing_dev_info *bdi); int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int); void bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages); void bdi_start_background_writeback(struct backing_dev_info *bdi); int bdi_writeback_task(struct bdi_writeback *wb); int bdi_writeback_thread(void *data); int bdi_has_dirty_io(struct backing_dev_info *bdi); void bdi_arm_supers_timer(void); Loading mm/backing-dev.c +1 −43 Original line number Diff line number Diff line Loading @@ -260,48 +260,6 @@ static void bdi_wb_init(struct bdi_writeback *wb, struct backing_dev_info *bdi) INIT_LIST_HEAD(&wb->b_more_io); } static int bdi_start_fn(void *ptr) { struct bdi_writeback *wb = ptr; struct backing_dev_info *bdi = wb->bdi; int ret; /* * Add us to the active bdi_list */ spin_lock_bh(&bdi_lock); list_add_rcu(&bdi->bdi_list, &bdi_list); spin_unlock_bh(&bdi_lock); current->flags |= PF_FLUSHER | PF_SWAPWRITE; set_freezable(); /* * Our parent may run at a different priority, just set us to normal */ set_user_nice(current, 0); /* * Clear pending bit and wakeup anybody waiting to tear us down */ clear_bit(BDI_pending, &bdi->state); smp_mb__after_clear_bit(); wake_up_bit(&bdi->state, BDI_pending); ret = bdi_writeback_task(wb); wb->task = NULL; /* * Flush any work that raced with us exiting. No new work * will be added, since this bdi isn't discoverable anymore. */ if (!list_empty(&bdi->work_list)) wb_do_writeback(wb, 1); return ret; } int bdi_has_dirty_io(struct backing_dev_info *bdi) { return wb_has_dirty_io(&bdi->wb); Loading Loading @@ -425,7 +383,7 @@ static int bdi_forker_task(void *ptr) spin_unlock_bh(&bdi_lock); wb = &bdi->wb; wb->task = kthread_run(bdi_start_fn, wb, "flush-%s", wb->task = kthread_run(bdi_writeback_thread, wb, "flush-%s", dev_name(bdi->dev)); /* * If task creation fails, then readd the bdi to Loading Loading
fs/fs-writeback.c +34 −1 Original line number Diff line number Diff line Loading @@ -775,12 +775,36 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) * Handle writeback of dirty data for the device backed by this bdi. Also * wakes up periodically and does kupdated style flushing. */ int bdi_writeback_task(struct bdi_writeback *wb) int bdi_writeback_thread(void *data) { struct bdi_writeback *wb = data; struct backing_dev_info *bdi = wb->bdi; unsigned long last_active = jiffies; unsigned long wait_jiffies = -1UL; long pages_written; /* * Add us to the active bdi_list */ spin_lock_bh(&bdi_lock); list_add_rcu(&bdi->bdi_list, &bdi_list); spin_unlock_bh(&bdi_lock); current->flags |= PF_FLUSHER | PF_SWAPWRITE; set_freezable(); /* * Our parent may run at a different priority, just set us to normal */ set_user_nice(current, 0); /* * Clear pending bit and wakeup anybody waiting to tear us down */ clear_bit(BDI_pending, &bdi->state); smp_mb__after_clear_bit(); wake_up_bit(&bdi->state, BDI_pending); while (!kthread_should_stop()) { pages_written = wb_do_writeback(wb, 0); Loading Loading @@ -813,9 +837,18 @@ int bdi_writeback_task(struct bdi_writeback *wb) try_to_freeze(); } wb->task = NULL; /* * Flush any work that raced with us exiting. No new work * will be added, since this bdi isn't discoverable anymore. */ if (!list_empty(&bdi->work_list)) wb_do_writeback(wb, 1); return 0; } /* * Start writeback of `nr_pages' pages. If `nr_pages' is zero, write back * the whole world. Loading
include/linux/backing-dev.h +1 −1 Original line number Diff line number Diff line Loading @@ -102,7 +102,7 @@ void bdi_unregister(struct backing_dev_info *bdi); int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int); void bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages); void bdi_start_background_writeback(struct backing_dev_info *bdi); int bdi_writeback_task(struct bdi_writeback *wb); int bdi_writeback_thread(void *data); int bdi_has_dirty_io(struct backing_dev_info *bdi); void bdi_arm_supers_timer(void); Loading
mm/backing-dev.c +1 −43 Original line number Diff line number Diff line Loading @@ -260,48 +260,6 @@ static void bdi_wb_init(struct bdi_writeback *wb, struct backing_dev_info *bdi) INIT_LIST_HEAD(&wb->b_more_io); } static int bdi_start_fn(void *ptr) { struct bdi_writeback *wb = ptr; struct backing_dev_info *bdi = wb->bdi; int ret; /* * Add us to the active bdi_list */ spin_lock_bh(&bdi_lock); list_add_rcu(&bdi->bdi_list, &bdi_list); spin_unlock_bh(&bdi_lock); current->flags |= PF_FLUSHER | PF_SWAPWRITE; set_freezable(); /* * Our parent may run at a different priority, just set us to normal */ set_user_nice(current, 0); /* * Clear pending bit and wakeup anybody waiting to tear us down */ clear_bit(BDI_pending, &bdi->state); smp_mb__after_clear_bit(); wake_up_bit(&bdi->state, BDI_pending); ret = bdi_writeback_task(wb); wb->task = NULL; /* * Flush any work that raced with us exiting. No new work * will be added, since this bdi isn't discoverable anymore. */ if (!list_empty(&bdi->work_list)) wb_do_writeback(wb, 1); return ret; } int bdi_has_dirty_io(struct backing_dev_info *bdi) { return wb_has_dirty_io(&bdi->wb); Loading Loading @@ -425,7 +383,7 @@ static int bdi_forker_task(void *ptr) spin_unlock_bh(&bdi_lock); wb = &bdi->wb; wb->task = kthread_run(bdi_start_fn, wb, "flush-%s", wb->task = kthread_run(bdi_writeback_thread, wb, "flush-%s", dev_name(bdi->dev)); /* * If task creation fails, then readd the bdi to Loading