journal: return mapped size from mmap_cache_get()

If requested, return the actual mapping size to the caller in
addition to the address.

journal_file_move_to_object() often performs two successive
mmap_cache_get() calls via journal_file_move_to(); one to get the
object header, then another to get the entire object when it's
larger than the header's size.

If mmap_cache_get() returned the actual mapping's size, it's
probable that the second mmap_cache_get() could be skipped when
the established mapping already encompassed the desired size.
This commit is contained in:
Vito Caputo
2017-07-12 23:58:48 -07:00
parent c1edab7ad1
commit b42549ad69
5 changed files with 32 additions and 18 deletions
+4 -4
View File
@@ -749,7 +749,7 @@ static int journal_file_move_to(JournalFile *f, ObjectType type, bool keep_alway
return -EADDRNOTAVAIL;
}
return mmap_cache_get(f->mmap, f->cache_fd, f->prot, type_to_context(type), keep_always, offset, size, &f->last_stat, ret);
return mmap_cache_get(f->mmap, f->cache_fd, f->prot, type_to_context(type), keep_always, offset, size, &f->last_stat, ret, NULL);
}
static uint64_t minimum_header_size(Object *o) {
@@ -991,7 +991,7 @@ int journal_file_map_data_hash_table(JournalFile *f) {
OBJECT_DATA_HASH_TABLE,
true,
p, s,
&t);
&t, NULL);
if (r < 0)
return r;
@@ -1017,7 +1017,7 @@ int journal_file_map_field_hash_table(JournalFile *f) {
OBJECT_FIELD_HASH_TABLE,
true,
p, s,
&t);
&t, NULL);
if (r < 0)
return r;
@@ -3196,7 +3196,7 @@ int journal_file_open(
goto fail;
}
r = mmap_cache_get(f->mmap, f->cache_fd, f->prot, CONTEXT_HEADER, true, 0, PAGE_ALIGN(sizeof(Header)), &f->last_stat, &h);
r = mmap_cache_get(f->mmap, f->cache_fd, f->prot, CONTEXT_HEADER, true, 0, PAGE_ALIGN(sizeof(Header)), &f->last_stat, &h, NULL);
if (r < 0)
goto fail;
+1 -1
View File
@@ -392,7 +392,7 @@ static int contains_uint64(MMapCache *m, MMapFileDescriptor *f, uint64_t n, uint
c = (a + b) / 2;
r = mmap_cache_get(m, f, PROT_READ|PROT_WRITE, 0, false, c * sizeof(uint64_t), sizeof(uint64_t), NULL, (void **) &z);
r = mmap_cache_get(m, f, PROT_READ|PROT_WRITE, 0, false, c * sizeof(uint64_t), sizeof(uint64_t), NULL, (void **) &z, NULL);
if (r < 0)
return r;
+20 -7
View File
@@ -338,7 +338,8 @@ static int try_context(
bool keep_always,
uint64_t offset,
size_t size,
void **ret) {
void **ret,
size_t *ret_size) {
Context *c;
@@ -370,6 +371,9 @@ static int try_context(
c->window->keep_always = c->window->keep_always || keep_always;
*ret = (uint8_t*) c->window->ptr + (offset - c->window->offset);
if (ret_size)
*ret_size = c->window->size - (offset - c->window->offset);
return 1;
}
@@ -381,7 +385,8 @@ static int find_mmap(
bool keep_always,
uint64_t offset,
size_t size,
void **ret) {
void **ret,
size_t *ret_size) {
Window *w;
Context *c;
@@ -409,6 +414,9 @@ static int find_mmap(
w->keep_always = w->keep_always || keep_always;
*ret = (uint8_t*) w->ptr + (offset - w->offset);
if (ret_size)
*ret_size = w->size - (offset - w->offset);
return 1;
}
@@ -448,7 +456,8 @@ static int add_mmap(
uint64_t offset,
size_t size,
struct stat *st,
void **ret) {
void **ret,
size_t *ret_size) {
uint64_t woffset, wsize;
Context *c;
@@ -508,6 +517,9 @@ static int add_mmap(
LIST_PREPEND(by_window, w->contexts, c);
*ret = (uint8_t*) w->ptr + (offset - w->offset);
if (ret_size)
*ret_size = w->size - (offset - w->offset);
return 1;
outofmem:
@@ -524,7 +536,8 @@ int mmap_cache_get(
uint64_t offset,
size_t size,
struct stat *st,
void **ret) {
void **ret,
size_t *ret_size) {
int r;
@@ -536,14 +549,14 @@ int mmap_cache_get(
assert(context < MMAP_CACHE_MAX_CONTEXTS);
/* Check whether the current context is the right one already */
r = try_context(m, f, prot, context, keep_always, offset, size, ret);
r = try_context(m, f, prot, context, keep_always, offset, size, ret, ret_size);
if (r != 0) {
m->n_hit++;
return r;
}
/* Search for a matching mmap */
r = find_mmap(m, f, prot, context, keep_always, offset, size, ret);
r = find_mmap(m, f, prot, context, keep_always, offset, size, ret, ret_size);
if (r != 0) {
m->n_hit++;
return r;
@@ -552,7 +565,7 @@ int mmap_cache_get(
m->n_missed++;
/* Create a new mmap */
return add_mmap(m, f, prot, context, keep_always, offset, size, st, ret);
return add_mmap(m, f, prot, context, keep_always, offset, size, st, ret, ret_size);
}
unsigned mmap_cache_get_hit(MMapCache *m) {
+2 -1
View File
@@ -41,7 +41,8 @@ int mmap_cache_get(
uint64_t offset,
size_t size,
struct stat *st,
void **ret);
void **ret,
size_t *ret_size);
MMapFileDescriptor * mmap_cache_add_fd(MMapCache *m, int fd);
void mmap_cache_free_fd(MMapCache *m, MMapFileDescriptor *f);
+5 -5
View File
@@ -51,23 +51,23 @@ int main(int argc, char *argv[]) {
assert_se(z >= 0);
unlink(pz);
r = mmap_cache_get(m, fx, PROT_READ, 0, false, 1, 2, NULL, &p);
r = mmap_cache_get(m, fx, PROT_READ, 0, false, 1, 2, NULL, &p, NULL);
assert_se(r >= 0);
r = mmap_cache_get(m, fx, PROT_READ, 0, false, 2, 2, NULL, &q);
r = mmap_cache_get(m, fx, PROT_READ, 0, false, 2, 2, NULL, &q, NULL);
assert_se(r >= 0);
assert_se((uint8_t*) p + 1 == (uint8_t*) q);
r = mmap_cache_get(m, fx, PROT_READ, 1, false, 3, 2, NULL, &q);
r = mmap_cache_get(m, fx, PROT_READ, 1, false, 3, 2, NULL, &q, NULL);
assert_se(r >= 0);
assert_se((uint8_t*) p + 2 == (uint8_t*) q);
r = mmap_cache_get(m, fx, PROT_READ, 0, false, 16ULL*1024ULL*1024ULL, 2, NULL, &p);
r = mmap_cache_get(m, fx, PROT_READ, 0, false, 16ULL*1024ULL*1024ULL, 2, NULL, &p, NULL);
assert_se(r >= 0);
r = mmap_cache_get(m, fx, PROT_READ, 1, false, 16ULL*1024ULL*1024ULL+1, 2, NULL, &q);
r = mmap_cache_get(m, fx, PROT_READ, 1, false, 16ULL*1024ULL*1024ULL+1, 2, NULL, &q, NULL);
assert_se(r >= 0);
assert_se((uint8_t*) p + 1 == (uint8_t*) q);