fellow_logcache: Add a mempool

parent e3aaef01
...@@ -1077,6 +1077,11 @@ struct fellow_logcache_entry { ...@@ -1077,6 +1077,11 @@ struct fellow_logcache_entry {
off_t off; off_t off;
}; };
#define FLC_MEMPOOL_SIZE 2
BUDDY_POOL(flc_mempool, FLC_MEMPOOL_SIZE);
BUDDY_POOL_GET_FUNC(flc_mempool, static)
BUDDY_POOL_AVAIL_FUNC(flc_mempool, static)
VTAILQ_HEAD(flehead, fellow_logcache_entry); VTAILQ_HEAD(flehead, fellow_logcache_entry);
struct fellow_logcache { struct fellow_logcache {
...@@ -1089,6 +1094,7 @@ struct fellow_logcache { ...@@ -1089,6 +1094,7 @@ struct fellow_logcache {
struct fellow_fd_ioctx_lease fdil; struct fellow_fd_ioctx_lease fdil;
const struct buddy_off_extent *region; const struct buddy_off_extent *region;
struct buddy_ptr_page alloc_entry; struct buddy_ptr_page alloc_entry;
struct flc_mempool mempool[1];
struct fellow_logcache_entry *current; struct fellow_logcache_entry *current;
struct flehead free; struct flehead free;
struct flehead used; struct flehead used;
...@@ -1139,6 +1145,8 @@ fellow_logcache_fini(struct fellow_logcache *flc) ...@@ -1139,6 +1145,8 @@ fellow_logcache_fini(struct fellow_logcache *flc)
CHECK_OBJ_NOTNULL(flc, FELLOW_LOGCACHE_MAGIC); CHECK_OBJ_NOTNULL(flc, FELLOW_LOGCACHE_MAGIC);
rets = BUDDY_RETURNS_STK(flc->ffd->membuddy, BUDDY_RETURNS_MAX); rets = BUDDY_RETURNS_STK(flc->ffd->membuddy, BUDDY_RETURNS_MAX);
BUDDY_POOL_FINI(flc->mempool);
/* wait for all IO to complete before returning memory and /* wait for all IO to complete before returning memory and
* the ioctx * the ioctx
*/ */
...@@ -1160,12 +1168,23 @@ fellow_logcache_fini(struct fellow_logcache *flc) ...@@ -1160,12 +1168,23 @@ fellow_logcache_fini(struct fellow_logcache *flc)
buddy_return(rets); buddy_return(rets);
} }
// dup logbuffer_fill_mempool
static void
flc_mempool_fill(struct buddy_reqs *reqs, const void *priv)
{
unsigned u;
(void) priv;
for (u = 0; u < reqs->space; u++)
AN(buddy_req_page(reqs, MIN_FELLOW_BITS, 0));
}
static void static void
fellow_logcache_init(struct fellow_logcache *flc, struct fellow_fd *ffd, fellow_logcache_init(struct fellow_logcache *flc, struct fellow_fd *ffd,
uint8_t id, const struct buddy_off_extent *region) uint8_t id, const struct buddy_off_extent *region)
{ {
struct fellow_logcache_entry *fle; struct fellow_logcache_entry *fle;
struct buddy_reqs *reqs;
size_t sz; size_t sz;
unsigned n, u; unsigned n, u;
...@@ -1195,6 +1214,7 @@ fellow_logcache_init(struct fellow_logcache *flc, struct fellow_fd *ffd, ...@@ -1195,6 +1214,7 @@ fellow_logcache_init(struct fellow_logcache *flc, struct fellow_fd *ffd,
if (u > UINT8_MAX) if (u > UINT8_MAX)
u = UINT8_MAX; u = UINT8_MAX;
/* init FLEs */
flc->alloc_entry = buddy_alloc1_ptr_page_wait(ffd->membuddy, flc->alloc_entry = buddy_alloc1_ptr_page_wait(ffd->membuddy,
FEP_MEM_FLC, (uint8_t)u, (int8_t)0); FEP_MEM_FLC, (uint8_t)u, (int8_t)0);
AN(flc->alloc_entry.ptr); AN(flc->alloc_entry.ptr);
...@@ -1202,26 +1222,23 @@ fellow_logcache_init(struct fellow_logcache *flc, struct fellow_fd *ffd, ...@@ -1202,26 +1222,23 @@ fellow_logcache_init(struct fellow_logcache *flc, struct fellow_fd *ffd,
assert(sz >= sizeof *fle); assert(sz >= sizeof *fle);
sz /= sizeof *fle; sz /= sizeof *fle;
if (sz > BUDDY_REQS_MAX) BUDDY_POOL_INIT(flc->mempool, ffd->membuddy, FEP_MEM_FLC,
sz = BUDDY_REQS_MAX; flc_mempool_fill, NULL);
assert(sz < UINT_MAX);
reqs = BUDDY_REQS_STK(ffd->membuddy, BUDDY_REQS_MAX); flc->n = (unsigned)sz;
BUDDY_REQS_PRI(reqs, FEP_MEM_FLC);
for (u = 0; u < sz; u++)
AN(buddy_req_page(reqs, MIN_FELLOW_BITS, 0));
u = buddy_alloc_wait(reqs);
assert(u >= 2);
flc->n = u;
for (fle = flc->alloc_entry.ptr, u = 0; for (fle = flc->alloc_entry.ptr, u = 0;
u < flc->n; u < flc->n;
u++, fle++) { u++, fle++) {
INIT_OBJ(fle, FELLOW_LOGCACHE_ENTRY_MAGIC); INIT_OBJ(fle, FELLOW_LOGCACHE_ENTRY_MAGIC);
fle->alloc = buddy_get_ptr_page(reqs, (uint8_t)u); fle->alloc = buddy_get_next_ptr_page(
flc_mempool_get(flc->mempool, NULL));
VTAILQ_INSERT_TAIL(&flc->free, fle, list); VTAILQ_INSERT_TAIL(&flc->free, fle, list);
} }
buddy_alloc_wait_done(reqs); //XXX
(void) flc_mempool_avail(flc->mempool);
fellow_fd_ioctx_get(ffd, &flc->fdil); fellow_fd_ioctx_get(ffd, &flc->fdil);
} }
......
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