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