Skip to content

Commit

Permalink
reiserfs: use per-fs commit workqueues
Browse files Browse the repository at this point in the history
The reiserfs write lock hasn't been the BKL for some time. There's no
need to have different file systems queued up on the same workqueue.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: Jan Kara <jack@suse.cz>
  • Loading branch information
Jeff Mahoney authored and Jan Kara committed May 6, 2014
1 parent 38583f0 commit 797d901
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 25 deletions.
22 changes: 3 additions & 19 deletions fs/reiserfs/journal.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,6 @@
#define JOURNAL_WORK_ENTRY(h) (list_entry((h), struct reiserfs_journal_list, \
j_working_list))

/* the number of mounted filesystems. This is used to decide when to
** start and kill the commit workqueue
*/
static int reiserfs_mounted_fs_count;

static struct workqueue_struct *commit_wq;

#define JOURNAL_TRANS_HALF 1018 /* must be correct to keep the desc and commit
structs at 4k */
#define BUFNR 64 /*read ahead */
Expand Down Expand Up @@ -1882,7 +1875,6 @@ static int do_journal_release(struct reiserfs_transaction_handle *th,
}
}

reiserfs_mounted_fs_count--;
/* wait for all commits to finish */
cancel_delayed_work(&SB_JOURNAL(sb)->j_work);

Expand All @@ -1893,12 +1885,7 @@ static int do_journal_release(struct reiserfs_transaction_handle *th,
reiserfs_write_unlock(sb);

cancel_delayed_work_sync(&REISERFS_SB(sb)->old_work);
flush_workqueue(commit_wq);

if (!reiserfs_mounted_fs_count) {
destroy_workqueue(commit_wq);
commit_wq = NULL;
}
flush_workqueue(REISERFS_SB(sb)->commit_wq);

free_journal_ram(sb);

Expand Down Expand Up @@ -2807,10 +2794,6 @@ int journal_init(struct super_block *sb, const char *j_dev_name,
goto free_and_return;
}

reiserfs_mounted_fs_count++;
if (reiserfs_mounted_fs_count <= 1)
commit_wq = alloc_workqueue("reiserfs", WQ_MEM_RECLAIM, 0);

INIT_DELAYED_WORK(&journal->j_work, flush_async_commits);
journal->j_work_sb = sb;
return 0;
Expand Down Expand Up @@ -4134,7 +4117,8 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
flush_commit_list(sb, jl, 1);
flush_journal_list(sb, jl, 1);
} else if (!(jl->j_state & LIST_COMMIT_PENDING))
queue_delayed_work(commit_wq, &journal->j_work, HZ / 10);
queue_delayed_work(REISERFS_SB(sb)->commit_wq,
&journal->j_work, HZ / 10);

/* if the next transaction has any chance of wrapping, flush
** transactions that might get overwritten. If any journal lists are very
Expand Down
2 changes: 2 additions & 0 deletions fs/reiserfs/reiserfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,8 @@ struct reiserfs_sb_info {
/* Depth of the lock, start from -1 like the bkl */
int lock_depth;

struct workqueue_struct *commit_wq;

/* Comment? -Hans */
void (*end_io_handler) (struct buffer_head *, int);
hashf_t s_hash_function; /* pointer to function which is used
Expand Down
21 changes: 15 additions & 6 deletions fs/reiserfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,7 @@ static void reiserfs_put_super(struct super_block *s)

reiserfs_write_unlock(s);
mutex_destroy(&REISERFS_SB(s)->lock);
destroy_workqueue(REISERFS_SB(s)->commit_wq);
kfree(s->s_fs_info);
s->s_fs_info = NULL;
}
Expand Down Expand Up @@ -1796,6 +1797,14 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
mutex_init(&sbi->lock);
sbi->lock_depth = -1;

sbi->commit_wq = alloc_workqueue("reiserfs/%s", WQ_MEM_RECLAIM, 0,
s->s_id);
if (!sbi->commit_wq) {
SWARN(silent, s, "", "Cannot allocate commit workqueue");
errval = -ENOMEM;
goto error_unlocked;
}

jdev_name = NULL;
if (reiserfs_parse_options
(s, (char *)data, &(sbi->s_mount_opt), &blocks, &jdev_name,
Expand Down Expand Up @@ -2402,18 +2411,18 @@ static int __init init_reiserfs_fs(void)
{
int ret;

if ((ret = init_inodecache())) {
ret = init_inodecache();
if (ret)
return ret;
}

reiserfs_proc_info_global_init();

ret = register_filesystem(&reiserfs_fs_type);
if (ret)
goto out;

if (ret == 0) {
return 0;
}

return 0;
out:
reiserfs_proc_info_global_done();
destroy_inodecache();

Expand Down

0 comments on commit 797d901

Please sign in to comment.