ash: memalloc: Avoid looping in growstackto

Upstream commit:

    Date: Thu, 31 May 2018 01:51:48 +0800
    memalloc: Avoid looping in growstackto

    Currently growstackto will repeatedly call growstackblock until
    the requisite size is obtained.  This is wasteful.  This patch
    changes growstackblock to take a minimum size instead.

    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2020-02-21 15:25:37 +01:00
parent 3ced804e31
commit da2e46dff6

View File

@ -1678,15 +1678,16 @@ popstackmark(struct stackmark *mark)
* part of the block that has been used.
*/
static void
growstackblock(void)
growstackblock(size_t min)
{
size_t newlen;
newlen = g_stacknleft * 2;
if (newlen < g_stacknleft)
ash_msg_and_raise_error(bb_msg_memory_exhausted);
if (newlen < 128)
newlen += 128;
min = SHELL_ALIGN(min | 128);
if (newlen < min)
newlen += min;
if (g_stacknxt == g_stackp->space && g_stackp != &stackbase) {
struct stack_block *sp;
@ -1736,16 +1737,15 @@ static void *
growstackstr(void)
{
size_t len = stackblocksize();
growstackblock();
growstackblock(0);
return (char *)stackblock() + len;
}
static char *
growstackto(size_t len)
{
while (stackblocksize() < len)
growstackblock();
if (stackblocksize() < len)
growstackblock(len);
return stackblock();
}