1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

[device/bcache] Add bcache_max_prefetches()

Ignore prefetches if max io is in flight.
This commit is contained in:
Joe Thornber 2018-02-02 12:06:14 +00:00 committed by David Teigland
parent c4c4acfd42
commit 1563b93691
2 changed files with 16 additions and 8 deletions

View File

@ -216,17 +216,18 @@ static bool _engine_issue(struct io_engine *e, enum dir d, int fd,
return true; return true;
} }
#define MAX_IO 64 #define MAX_IO 1024
#define MAX_EVENT 64
typedef void complete_fn(void *context, int io_error); typedef void complete_fn(void *context, int io_error);
static bool _engine_wait(struct io_engine *e, complete_fn fn) static bool _engine_wait(struct io_engine *e, complete_fn fn)
{ {
int i, r; int i, r;
struct io_event event[MAX_IO]; struct io_event event[MAX_EVENT];
struct control_block *cb; struct control_block *cb;
memset(&event, 0, sizeof(event)); memset(&event, 0, sizeof(event));
r = io_getevents(e->aio_context, 1, MAX_IO, event, NULL); r = io_getevents(e->aio_context, 1, MAX_EVENT, event, NULL);
if (r < 0) { if (r < 0) {
log_sys_warn("io_getevents"); log_sys_warn("io_getevents");
return false; return false;
@ -300,6 +301,7 @@ struct bcache {
sector_t block_sectors; sector_t block_sectors;
uint64_t nr_data_blocks; uint64_t nr_data_blocks;
uint64_t nr_cache_blocks; uint64_t nr_cache_blocks;
unsigned max_io;
struct io_engine *engine; struct io_engine *engine;
@ -762,8 +764,8 @@ struct bcache *bcache_create(sector_t block_sectors, unsigned nr_cache_blocks)
cache->block_sectors = block_sectors; cache->block_sectors = block_sectors;
cache->nr_cache_blocks = nr_cache_blocks; cache->nr_cache_blocks = nr_cache_blocks;
cache->max_io = nr_cache_blocks < MAX_IO ? nr_cache_blocks : MAX_IO;
cache->engine = _engine_create(nr_cache_blocks < 1024u ? nr_cache_blocks : 1024u); cache->engine = _engine_create(cache->max_io);
if (!cache->engine) { if (!cache->engine) {
dm_free(cache); dm_free(cache);
return NULL; return NULL;
@ -820,16 +822,21 @@ unsigned bcache_nr_cache_blocks(struct bcache *cache)
return cache->nr_cache_blocks; return cache->nr_cache_blocks;
} }
unsigned bcache_max_prefetches(struct bcache *cache)
{
return cache->max_io;
}
void bcache_prefetch(struct bcache *cache, int fd, block_address index) void bcache_prefetch(struct bcache *cache, int fd, block_address index)
{ {
struct block *b = _hash_lookup(cache, fd, index); struct block *b = _hash_lookup(cache, fd, index);
if (!b) { if (!b) {
cache->prefetches++;
b = _new_block(cache, fd, index); b = _new_block(cache, fd, index);
if (b) if (b && (cache->nr_io_pending < cache->max_io)) {
cache->prefetches++;
_issue_read(b); _issue_read(b);
}
} }
} }

View File

@ -62,6 +62,7 @@ enum bcache_get_flags {
typedef uint64_t block_address; typedef uint64_t block_address;
unsigned bcache_nr_cache_blocks(struct bcache *cache); unsigned bcache_nr_cache_blocks(struct bcache *cache);
unsigned bcache_max_prefetches(struct bcache *cache);
/* /*
* Use the prefetch method to take advantage of asynchronous IO. For example, * Use the prefetch method to take advantage of asynchronous IO. For example,