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

Commit ff3bafc6 authored by Jaegeuk Kim's avatar Jaegeuk Kim Committed by Jaegeuk Kim
Browse files

f2fs: wake up discard_thread iff there is a candidate



commit 01983c715ad0e78842a885f361ad927a3a985994 upstream.

This patch fixes to avoid needless wake ups.

Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 68842d7d
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -1574,8 +1574,7 @@ skip:
		kmem_cache_free(discard_entry_slab, entry);
	}

	dcc->discard_wake = 1;
	wake_up_interruptible_all(&dcc->discard_wait_queue);
	wake_up_discard_thread(sbi, false);
}

static int create_discard_cmd_control(struct f2fs_sb_info *sbi)
+25 −0
Original line number Diff line number Diff line
@@ -796,3 +796,28 @@ static inline long nr_pages_to_write(struct f2fs_sb_info *sbi, int type,
	wbc->nr_to_write = desired;
	return desired - nr_to_write;
}

static inline void wake_up_discard_thread(struct f2fs_sb_info *sbi, bool force)
{
	struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
	bool wakeup = false;
	int i;

	if (force)
		goto wake_up;

	mutex_lock(&dcc->cmd_lock);
	for (i = MAX_PLIST_NUM - 1;
			i >= 0 && plist_issue(dcc->pend_list_tag[i]); i--) {
		if (!list_empty(&dcc->pend_list[i])) {
			wakeup = true;
			break;
		}
	}
	mutex_unlock(&dcc->cmd_lock);
	if (!wakeup)
		return;
wake_up:
	dcc->discard_wake = 1;
	wake_up_interruptible_all(&dcc->discard_wait_queue);
}
+1 −5
Original line number Diff line number Diff line
@@ -178,13 +178,9 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a,
	if (!strcmp(a->attr.name, "iostat_enable") && *ui == 0)
		f2fs_reset_iostat(sbi);
	if (!strcmp(a->attr.name, "gc_urgent") && t == 1 && sbi->gc_thread) {
		struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;

		sbi->gc_thread->gc_wake = 1;
		wake_up_interruptible_all(&sbi->gc_thread->gc_wait_queue_head);

		dcc->discard_wake = 1;
		wake_up_interruptible_all(&dcc->discard_wait_queue);
		wake_up_discard_thread(sbi, true);
	}

	return count;