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:
parent
c4c4acfd42
commit
1563b93691
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user