logbuffer: When we need a regionlist under the logmtx, check the pool for memory

parent ac347062
......@@ -2598,6 +2598,26 @@ logbuffer_flush_finish(struct fellow_fd *ffd,
static void
logbuffer_flush_finish_work(struct worker *wrk, void *priv);
/*
* for use under the lock. Uses the mempool if possible
*/
static void
logbuffer_need_regions_to_free(struct fellow_logbuffer *lbuf)
{
if (lbuf->regions_to_free != NULL)
return;
if (lbuf_mempool_avail(lbuf->mempool)) {
lbuf->regions_to_free = regionlist_init(
buddy_get_next_ptr_page(
lbuf_mempool_get(lbuf->mempool, lbuf)),
lbuf->membuddy);
}
else
lbuf->regions_to_free = regionlist_alloc(lbuf->membuddy);
}
static void
logbuffer_flush(struct fellow_fd *ffd,
struct fellow_logbuffer *lbuf, unsigned doclose, unsigned can)
......@@ -2654,9 +2674,7 @@ logbuffer_flush(struct fellow_fd *ffd,
return;
}
if (lbuf->regions_to_free == NULL) {
lbuf->regions_to_free = regionlist_alloc(ffd->membuddy);
}
logbuffer_need_regions_to_free(lbuf);
if (lbuf->head.block == NULL) {
if (! cap(can, LBUF_CAN_REF) || lbuf->ff != NULL)
......@@ -4349,9 +4367,7 @@ fellow_log_entries_add(struct fellow_fd *ffd,
AN(entry);
if (prep->tofree.n) {
if (lbuf->regions_to_free == NULL)
lbuf->regions_to_free = regionlist_alloc(ffd->membuddy);
logbuffer_need_regions_to_free(lbuf);
prep->tofree.regionlist = lbuf->regions_to_free;
regionlist_stk_flush(prep->tofree);
}
......
......@@ -182,17 +182,12 @@ regl_init(const struct buddy_ptr_page alloc, size_t off)
}
static struct regionlist *
regionlist_alloc(buddy_t *membuddy)
regionlist_init(struct buddy_ptr_page alloc, buddy_t *membuddy)
{
struct buddy_ptr_page alloc;
struct regionlist *rl;
struct regl *r;
size_t sz;
alloc = buddy_alloc1_ptr_page_wait(membuddy, FEP_MEM_FREE,
regl_bits, regl_bits_cram);
AN(alloc.ptr);
sz = (size_t)1 << alloc.bits;
assert(sz >= (2 * sizeof *r + sizeof *rl));
......@@ -209,6 +204,18 @@ regionlist_alloc(buddy_t *membuddy)
return (rl);
}
static struct regionlist *
regionlist_alloc(buddy_t *membuddy)
{
struct buddy_ptr_page alloc;
alloc = buddy_alloc1_ptr_page_wait(membuddy, FEP_MEM_FREE,
regl_bits, regl_bits_cram);
AN(alloc.ptr);
return (regionlist_init(alloc, membuddy));
}
static unsigned
regionlist_used(const struct regionlist *rl)
{
......
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