writeback: merge bdi_writeback_task and bdi_start_fn
Move all code for the writeback thread into fs/fs-writeback.c instead of splitting it over two functions in two files. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
This commit is contained in:
parent
c1955ce32f
commit
082439004b
3 changed files with 36 additions and 45 deletions
|
@ -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
|
* Handle writeback of dirty data for the device backed by this bdi. Also
|
||||||
* wakes up periodically and does kupdated style flushing.
|
* 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 last_active = jiffies;
|
||||||
unsigned long wait_jiffies = -1UL;
|
unsigned long wait_jiffies = -1UL;
|
||||||
long pages_written;
|
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()) {
|
while (!kthread_should_stop()) {
|
||||||
pages_written = wb_do_writeback(wb, 0);
|
pages_written = wb_do_writeback(wb, 0);
|
||||||
|
|
||||||
|
@ -813,9 +837,18 @@ int bdi_writeback_task(struct bdi_writeback *wb)
|
||||||
try_to_freeze();
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start writeback of `nr_pages' pages. If `nr_pages' is zero, write back
|
* Start writeback of `nr_pages' pages. If `nr_pages' is zero, write back
|
||||||
* the whole world.
|
* the whole world.
|
||||||
|
|
|
@ -102,7 +102,7 @@ void bdi_unregister(struct backing_dev_info *bdi);
|
||||||
int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int);
|
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_writeback(struct backing_dev_info *bdi, long nr_pages);
|
||||||
void bdi_start_background_writeback(struct backing_dev_info *bdi);
|
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);
|
int bdi_has_dirty_io(struct backing_dev_info *bdi);
|
||||||
void bdi_arm_supers_timer(void);
|
void bdi_arm_supers_timer(void);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
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)
|
int bdi_has_dirty_io(struct backing_dev_info *bdi)
|
||||||
{
|
{
|
||||||
return wb_has_dirty_io(&bdi->wb);
|
return wb_has_dirty_io(&bdi->wb);
|
||||||
|
@ -425,7 +383,7 @@ static int bdi_forker_task(void *ptr)
|
||||||
spin_unlock_bh(&bdi_lock);
|
spin_unlock_bh(&bdi_lock);
|
||||||
|
|
||||||
wb = &bdi->wb;
|
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));
|
dev_name(bdi->dev));
|
||||||
/*
|
/*
|
||||||
* If task creation fails, then readd the bdi to
|
* If task creation fails, then readd the bdi to
|
||||||
|
|
Loading…
Reference in a new issue