Commit 89f94b64 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Song Liu

raid5-cache: statically allocate the recovery ra bio

There is no need to preallocate the bio and reset it when use.  Just
allocate it on-stack and use a bvec places next to the pages used for
it.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarSong Liu <song@kernel.org>
parent 0dd00cba
...@@ -1623,10 +1623,10 @@ struct r5l_recovery_ctx { ...@@ -1623,10 +1623,10 @@ struct r5l_recovery_ctx {
* just copy data from the pool. * just copy data from the pool.
*/ */
struct page *ra_pool[R5L_RECOVERY_PAGE_POOL_SIZE]; struct page *ra_pool[R5L_RECOVERY_PAGE_POOL_SIZE];
struct bio_vec ra_bvec[R5L_RECOVERY_PAGE_POOL_SIZE];
sector_t pool_offset; /* offset of first page in the pool */ sector_t pool_offset; /* offset of first page in the pool */
int total_pages; /* total allocated pages */ int total_pages; /* total allocated pages */
int valid_pages; /* pages with valid data */ int valid_pages; /* pages with valid data */
struct bio *ra_bio; /* bio to do the read ahead */
}; };
static int r5l_recovery_allocate_ra_pool(struct r5l_log *log, static int r5l_recovery_allocate_ra_pool(struct r5l_log *log,
...@@ -1634,11 +1634,6 @@ static int r5l_recovery_allocate_ra_pool(struct r5l_log *log, ...@@ -1634,11 +1634,6 @@ static int r5l_recovery_allocate_ra_pool(struct r5l_log *log,
{ {
struct page *page; struct page *page;
ctx->ra_bio = bio_alloc_bioset(NULL, BIO_MAX_VECS, 0, GFP_KERNEL,
&log->bs);
if (!ctx->ra_bio)
return -ENOMEM;
ctx->valid_pages = 0; ctx->valid_pages = 0;
ctx->total_pages = 0; ctx->total_pages = 0;
while (ctx->total_pages < R5L_RECOVERY_PAGE_POOL_SIZE) { while (ctx->total_pages < R5L_RECOVERY_PAGE_POOL_SIZE) {
...@@ -1650,10 +1645,8 @@ static int r5l_recovery_allocate_ra_pool(struct r5l_log *log, ...@@ -1650,10 +1645,8 @@ static int r5l_recovery_allocate_ra_pool(struct r5l_log *log,
ctx->total_pages += 1; ctx->total_pages += 1;
} }
if (ctx->total_pages == 0) { if (ctx->total_pages == 0)
bio_put(ctx->ra_bio);
return -ENOMEM; return -ENOMEM;
}
ctx->pool_offset = 0; ctx->pool_offset = 0;
return 0; return 0;
...@@ -1666,7 +1659,6 @@ static void r5l_recovery_free_ra_pool(struct r5l_log *log, ...@@ -1666,7 +1659,6 @@ static void r5l_recovery_free_ra_pool(struct r5l_log *log,
for (i = 0; i < ctx->total_pages; ++i) for (i = 0; i < ctx->total_pages; ++i)
put_page(ctx->ra_pool[i]); put_page(ctx->ra_pool[i]);
bio_put(ctx->ra_bio);
} }
/* /*
...@@ -1679,15 +1671,19 @@ static int r5l_recovery_fetch_ra_pool(struct r5l_log *log, ...@@ -1679,15 +1671,19 @@ static int r5l_recovery_fetch_ra_pool(struct r5l_log *log,
struct r5l_recovery_ctx *ctx, struct r5l_recovery_ctx *ctx,
sector_t offset) sector_t offset)
{ {
bio_reset(ctx->ra_bio, log->rdev->bdev, REQ_OP_READ); struct bio bio;
ctx->ra_bio->bi_iter.bi_sector = log->rdev->data_offset + offset; int ret;
bio_init(&bio, log->rdev->bdev, ctx->ra_bvec,
R5L_RECOVERY_PAGE_POOL_SIZE, REQ_OP_READ);
bio.bi_iter.bi_sector = log->rdev->data_offset + offset;
ctx->valid_pages = 0; ctx->valid_pages = 0;
ctx->pool_offset = offset; ctx->pool_offset = offset;
while (ctx->valid_pages < ctx->total_pages) { while (ctx->valid_pages < ctx->total_pages) {
bio_add_page(ctx->ra_bio, __bio_add_page(&bio, ctx->ra_pool[ctx->valid_pages], PAGE_SIZE,
ctx->ra_pool[ctx->valid_pages], PAGE_SIZE, 0); 0);
ctx->valid_pages += 1; ctx->valid_pages += 1;
offset = r5l_ring_add(log, offset, BLOCK_SECTORS); offset = r5l_ring_add(log, offset, BLOCK_SECTORS);
...@@ -1696,7 +1692,9 @@ static int r5l_recovery_fetch_ra_pool(struct r5l_log *log, ...@@ -1696,7 +1692,9 @@ static int r5l_recovery_fetch_ra_pool(struct r5l_log *log,
break; break;
} }
return submit_bio_wait(ctx->ra_bio); ret = submit_bio_wait(&bio);
bio_uninit(&bio);
return ret;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment