Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 208338
b: refs/heads/master
c: 78c40cb
h: refs/heads/master
v: v3
  • Loading branch information
Artem Bityutskiy authored and Jens Axboe committed Aug 7, 2010
1 parent 8d52e25 commit d492a71
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 29 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 080dcec41709be72613133f695be75b98dd43e88
refs/heads/master: 78c40cb6581a74adc48821f3de6b864a54d4c34d
7 changes: 0 additions & 7 deletions trunk/fs/fs-writeback.c
Original file line number Diff line number Diff line change
Expand Up @@ -804,13 +804,6 @@ int bdi_writeback_thread(void *data)
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();

Expand Down
31 changes: 10 additions & 21 deletions trunk/mm/backing-dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ static int bdi_forker_thread(void *ptr)
for (;;) {
bool fork = false;
struct task_struct *task;
struct backing_dev_info *bdi, *tmp;
struct backing_dev_info *bdi;

/*
* Temporary measure, we want to make sure we don't see
Expand All @@ -347,7 +347,7 @@ static int bdi_forker_thread(void *ptr)
* Check if any existing bdi's have dirty data without
* a thread registered. If so, set that up.
*/
list_for_each_entry_safe(bdi, tmp, &bdi_list, bdi_list) {
list_for_each_entry(bdi, &bdi_list, bdi_list) {
if (!bdi_cap_writeback_dirty(bdi))
continue;
if (bdi->wb.task)
Expand All @@ -359,8 +359,13 @@ static int bdi_forker_thread(void *ptr)
WARN(!test_bit(BDI_registered, &bdi->state),
"bdi %p/%s is not registered!\n", bdi, bdi->name);

list_del_rcu(&bdi->bdi_list);
fork = true;

/*
* Set the pending bit - if someone will try to
* unregister this bdi - it'll wait on this bit.
*/
set_bit(BDI_pending, &bdi->state);
break;
}
spin_unlock_bh(&bdi_lock);
Expand All @@ -383,29 +388,13 @@ static int bdi_forker_thread(void *ptr)

__set_current_state(TASK_RUNNING);

/*
* Set the pending bit - if someone will try to unregister this
* bdi - it'll wait on this bit.
*/
set_bit(BDI_pending, &bdi->state);

/* Make sure no one uses the picked bdi */
synchronize_rcu();

task = kthread_run(bdi_writeback_thread, &bdi->wb, "flush-%s",
dev_name(bdi->dev));
if (IS_ERR(task)) {
/*
* If thread creation fails, then readd the bdi back to
* the list and force writeout of the bdi from this
* forker thread. That will free some memory and we can
* try again. Add it to the tail so we get a chance to
* flush other bdi's to free memory.
* If thread creation fails, force writeout of the bdi
* from the thread.
*/
spin_lock_bh(&bdi_lock);
list_add_tail_rcu(&bdi->bdi_list, &bdi_list);
spin_unlock_bh(&bdi_lock);

bdi_flush_io(bdi);
} else
bdi->wb.task = task;
Expand Down

0 comments on commit d492a71

Please sign in to comment.