Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1953bce authored by Josef Bacik's avatar Josef Bacik Committed by Chris Mason
Browse files

Btrfs: make shrink_delalloc a little friendlier



Xfstests 224 will just sit there and spin for ever until eventually we give up
flushing delalloc and exit.  On my box this took several hours.  I could not
interrupt this process either, even though we use INTERRUPTIBLE.  So do 2 things

1) Keep us from looping over and over again without reclaiming anything
2) If we get interrupted exit the loop

I tested this and the test now exits in a reasonable amount of time, and can be
interrupted with ctrl+c.  Thanks,

Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 7adf5dfb
Loading
Loading
Loading
Loading
+14 −3
Original line number Original line Diff line number Diff line
@@ -3345,8 +3345,10 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans,
	u64 reserved;
	u64 reserved;
	u64 max_reclaim;
	u64 max_reclaim;
	u64 reclaimed = 0;
	u64 reclaimed = 0;
	long time_left;
	int pause = 1;
	int pause = 1;
	int nr_pages = (2 * 1024 * 1024) >> PAGE_CACHE_SHIFT;
	int nr_pages = (2 * 1024 * 1024) >> PAGE_CACHE_SHIFT;
	int loops = 0;


	block_rsv = &root->fs_info->delalloc_block_rsv;
	block_rsv = &root->fs_info->delalloc_block_rsv;
	space_info = block_rsv->space_info;
	space_info = block_rsv->space_info;
@@ -3359,7 +3361,7 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans,


	max_reclaim = min(reserved, to_reclaim);
	max_reclaim = min(reserved, to_reclaim);


	while (1) {
	while (loops < 1024) {
		/* have the flusher threads jump in and do some IO */
		/* have the flusher threads jump in and do some IO */
		smp_mb();
		smp_mb();
		nr_pages = min_t(unsigned long, nr_pages,
		nr_pages = min_t(unsigned long, nr_pages,
@@ -3367,8 +3369,12 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans,
		writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages);
		writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages);


		spin_lock(&space_info->lock);
		spin_lock(&space_info->lock);
		if (reserved > space_info->bytes_reserved)
		if (reserved > space_info->bytes_reserved) {
			loops = 0;
			reclaimed += reserved - space_info->bytes_reserved;
			reclaimed += reserved - space_info->bytes_reserved;
		} else {
			loops++;
		}
		reserved = space_info->bytes_reserved;
		reserved = space_info->bytes_reserved;
		spin_unlock(&space_info->lock);
		spin_unlock(&space_info->lock);


@@ -3379,7 +3385,12 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans,
			return -EAGAIN;
			return -EAGAIN;


		__set_current_state(TASK_INTERRUPTIBLE);
		__set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout(pause);
		time_left = schedule_timeout(pause);

		/* We were interrupted, exit */
		if (time_left)
			break;

		pause <<= 1;
		pause <<= 1;
		if (pause > HZ / 10)
		if (pause > HZ / 10)
			pause = HZ / 10;
			pause = HZ / 10;