| Jeroen Demeyer on Tue, 04 Apr 2017 13:11:05 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: When enlarging stack in new_chunk_resize(), add 1/8 to stack size |
On 2017-04-03 21:36, Bill Allombert wrote:
Could you align the stack size on page boundary ? This would avoid waisting part of the last page.
Done, see new patch.
>From c5d3f0368eb5e9a35c9f94667abb755f856b1c35 Mon Sep 17 00:00:00 2001
From: Jeroen Demeyer <jdemeyer@cage.ugent.be>
Date: Mon, 3 Apr 2017 14:06:22 +0200
Subject: [PATCH 1/2] When enlarging stack in new_chunk_resize(), add 1/8 to
stack size
---
src/language/init.c | 27 ++++++++++++++-------------
1 file changed, 14 insertions(+), 13 deletions(-)
diff --git a/src/language/init.c b/src/language/init.c
index 2a30482..34cce31 100644
--- a/src/language/init.c
+++ b/src/language/init.c
@@ -641,17 +641,17 @@ pari_mainstack_mextend(pari_sp from, pari_sp to)
return mprotect((void*)from, s, PROT_READ|PROT_WRITE);
}
-/* Set actual stack size to the given size. This sets st->size and
- * st->bot. If not enough system memory is available, this can fail.
- * Return 1 if successful, 0 if failed (in that case, st->size is not
- * changed) */
+/* Set actual stack size to the given size, aligned to the page size.
+ * This sets st->size and st->bot. If not enough system memory is
+ * available, this can fail. Return 1 if successful, 0 if failed
+ * (in that case, st->size is not changed) */
static int
pari_mainstack_setsize(struct pari_mainstack *st, size_t size)
{
pari_sp newbot = st->top - size;
/* Align newbot to pagesize */
- pari_sp alignbot = newbot & ~(pari_sp)(PARI_STACK_ALIGN - 1);
- if (pari_mainstack_mextend(alignbot, st->top))
+ newbot &= ~(pari_sp)(PARI_STACK_ALIGN - 1);
+ if (pari_mainstack_mextend(newbot, st->top))
{
/* Making the memory available did not work: limit vsize to the
* current actual stack size. */
@@ -659,9 +659,9 @@ pari_mainstack_setsize(struct pari_mainstack *st, size_t size)
pari_warn(warnstack, st->vsize);
return 0;
}
- pari_mainstack_mreset(st->vbot, alignbot);
+ pari_mainstack_mreset(st->vbot, newbot);
st->bot = newbot;
- st->size = size;
+ st->size = st->top - st->bot;
return 1;
}
@@ -809,7 +809,7 @@ parivstack_reset(void)
}
/* Enlarge the stack if needed such that the unused portion of the stack
- * (between bot and avma) is large enough to contain x longs. */
+ * (between bot and avma) is large enough to contain at least x longs. */
void
new_chunk_resize(size_t x)
{
@@ -817,11 +817,12 @@ new_chunk_resize(size_t x)
avail = (avma - pari_mainstack->bot) / sizeof(long);
if (avail >= x) return;
- /* We need to enlarge the stack. We try to at least double the
- * stack, to avoid increasing the stack a lot of times by a small
- * amount. */
+ /* We need to enlarge the stack. We compute the minimum size needed
+ * and add 1/8 to avoid increasing the stack a lot of times by a
+ * small amount. */
size = pari_mainstack->size;
- newsize = size + maxuu((x - avail) * sizeof(long), size);
+ newsize = size + (x - avail) * sizeof(long);
+ newsize += newsize / 8;
paristack_resize(newsize);
/* Verify that we have enough space. Using a division here instead
--
2.7.3