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

Commit 8a01a6af authored by Joe Thornber's avatar Joe Thornber Committed by Mike Snitzer
Browse files

dm thin: prefetch missing metadata pages



Prefetch metadata at the start of the worker thread and then again every
128th bio processed from the deferred list.

Signed-off-by: default avatarJoe Thornber <ejt@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 4646015d
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1809,3 +1809,8 @@ bool dm_pool_metadata_needs_check(struct dm_pool_metadata *pmd)

	return needs_check;
}

void dm_pool_issue_prefetches(struct dm_pool_metadata *pmd)
{
	dm_tm_issue_prefetches(pmd->tm);
}
+5 −0
Original line number Diff line number Diff line
@@ -213,6 +213,11 @@ int dm_pool_register_metadata_threshold(struct dm_pool_metadata *pmd,
int dm_pool_metadata_set_needs_check(struct dm_pool_metadata *pmd);
bool dm_pool_metadata_needs_check(struct dm_pool_metadata *pmd);

/*
 * Issue any prefetches that may be useful.
 */
void dm_pool_issue_prefetches(struct dm_pool_metadata *pmd);

/*----------------------------------------------------------------*/

#endif
+6 −4
Original line number Diff line number Diff line
@@ -1526,6 +1526,7 @@ static void process_thin_deferred_bios(struct thin_c *tc)
	struct bio *bio;
	struct bio_list bios;
	struct blk_plug plug;
	unsigned count = 0;

	if (tc->requeue_mode) {
		requeue_bio_list(tc, &tc->deferred_bio_list);
@@ -1567,6 +1568,10 @@ static void process_thin_deferred_bios(struct thin_c *tc)
			pool->process_discard(tc, bio);
		else
			pool->process_bio(tc, bio);

		if ((count++ & 127) == 0) {
			dm_pool_issue_prefetches(pool->pmd);
		}
	}
	blk_finish_plug(&plug);
}
@@ -1652,6 +1657,7 @@ static void do_worker(struct work_struct *ws)
{
	struct pool *pool = container_of(ws, struct pool, worker);

	dm_pool_issue_prefetches(pool->pmd);
	process_prepared(pool, &pool->prepared_mappings, &pool->process_prepared_mapping);
	process_prepared(pool, &pool->prepared_discards, &pool->process_prepared_discard);
	process_deferred_bios(pool);
@@ -1996,10 +2002,6 @@ static int thin_bio_map(struct dm_target *ti, struct bio *bio)
		/* fall through */

	case -EWOULDBLOCK:
		/*
		 * In future, the failed dm_thin_find_block above could
		 * provide the hint to load the metadata into cache.
		 */
		thin_defer_bio(tc, bio);
		cell_defer_no_holder_no_free(tc, &cell1);
		return DM_MAPIO_SUBMITTED;