From patchwork Tue Dec 14 18:58:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 48913 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id EFD18385AC3A for ; Tue, 14 Dec 2021 19:02:53 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EFD18385AC3A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1639508574; bh=FBSfTpvPv/cnCfCHkaV37K9/4Q98DmVqHynXYFbvnTA=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=W6QfQKKtyB83M1H322lyXVdeC2zUKuWGdEhAtV5dOkI8R4bDd78d/kvlk5u4Zi7sf XIbzp8159YlGTxYx7Np7lxOUxe62cRM3WQOv+eHx6ZQvdO3AKxGeLG7k4YQOQL2VYX kQ7H1FG8Tr5n49YS2B/RnWW9JqNKvs2SLG3hMI4U= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-qt1-x82a.google.com (mail-qt1-x82a.google.com [IPv6:2607:f8b0:4864:20::82a]) by sourceware.org (Postfix) with ESMTPS id B6C51385BF9C for ; Tue, 14 Dec 2021 18:58:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B6C51385BF9C Received: by mail-qt1-x82a.google.com with SMTP id t34so19368527qtc.7 for ; Tue, 14 Dec 2021 10:58:20 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FBSfTpvPv/cnCfCHkaV37K9/4Q98DmVqHynXYFbvnTA=; b=ch4xFBeAU6KVWwkVbAKdUqM84kSm8UwcHBhTd4k83qeLPeibLJw/2kU85K1o7D8LGM mzTh1dWDI7FSNonRmQt3myAnzkRck4+RJpqo0p8C+QnibeIriUqPeBO0iqnOlRu/FF08 saB+VocMQaFjZwHYduF8o8Osc6PdLuQNdsrcPLeZ4o1nEphEL5Kh76hFnZ0nIiXCLeND GrTURGdHPRpkRxN8O1n7qOkFNBvqUPTBxva4QxVyBm6S9eWSlBnwBczBIWp1/Wh2Z39P OQTnTUJaK7k2XV8DrKP2ODw5F3+hTC+EX14QjJag3lHynNY3Jm9sPRtqZpr+47iZo4qL FNbA== X-Gm-Message-State: AOAM530Nc5fpZS0FbpdNv2ZX7BXxgfD9KX0+Wu1CVk25RiLAa6WoA85A 6pWtTB5RBUClPO1IOBAZztpaBujKRXQvmA== X-Google-Smtp-Source: ABdhPJzciTv6NWXNNFumJfeWW3WR61TqpsmMq/7r/loBI7HvDGbQKbHoRkx0b2Lld6MMfhDglKuLDw== X-Received: by 2002:ac8:5c93:: with SMTP id r19mr8038767qta.67.1639508300191; Tue, 14 Dec 2021 10:58:20 -0800 (PST) Received: from birita.. ([2804:431:c7ca:103f:1000:c46d:a2d6:9bed]) by smtp.gmail.com with ESMTPSA id j124sm422848qkd.98.2021.12.14.10.58.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 10:58:20 -0800 (PST) To: libc-alpha@sourceware.org, Siddhesh Poyarekar Subject: [PATCH v5 6/7] malloc: Move MORECORE fallback mmap to sysmalloc_mmap_fallback Date: Tue, 14 Dec 2021 15:58:05 -0300 Message-Id: <20211214185806.4109231-7-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211214185806.4109231-1-adhemerval.zanella@linaro.org> References: <20211214185806.4109231-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-13.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=unavailable autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Cc: Norbert Manthey , Guillaume Morin Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" So it can be used on hugepage code as well. Reviewed-by: DJ Delorie --- malloc/malloc.c | 85 ++++++++++++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 32 deletions(-) diff --git a/malloc/malloc.c b/malloc/malloc.c index 37fbd7e51d..9118306923 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -2498,6 +2498,51 @@ sysmalloc_mmap (INTERNAL_SIZE_T nb, size_t pagesize, int extra_flags, mstate av) return chunk2mem (p); } +/* + Allocate memory using mmap() based on S and NB requested size, aligning to + PAGESIZE if required. The EXTRA_FLAGS is used on mmap() call. If the call + succeedes S is updated with the allocated size. This is used as a fallback + if MORECORE fails. + */ +static void * +sysmalloc_mmap_fallback (long int *s, INTERNAL_SIZE_T nb, + INTERNAL_SIZE_T old_size, size_t minsize, + size_t pagesize, int extra_flags, mstate av) +{ + long int size = *s; + + /* Cannot merge with old top, so add its size back in */ + if (contiguous (av)) + size = ALIGN_UP (size + old_size, pagesize); + + /* If we are relying on mmap as backup, then use larger units */ + if ((unsigned long) (size) < minsize) + size = minsize; + + /* Don't try if size wraps around 0 */ + if ((unsigned long) (size) <= (unsigned long) (nb)) + return MORECORE_FAILURE; + + char *mbrk = (char *) (MMAP (0, size, + mtag_mmap_flags | PROT_READ | PROT_WRITE, + extra_flags)); + if (mbrk == MAP_FAILED) + return MAP_FAILED; + +#ifdef MAP_HUGETLB + if (!(extra_flags & MAP_HUGETLB)) + madvise_thp (mbrk, size); +#endif + + /* Record that we no longer have a contiguous sbrk region. After the first + time mmap is used as backup, we do not ever rely on contiguous space + since this could incorrectly bridge regions. */ + set_noncontiguous (av); + + *s = size; + return mbrk; +} + static void * sysmalloc (INTERNAL_SIZE_T nb, mstate av) { @@ -2695,38 +2740,14 @@ sysmalloc (INTERNAL_SIZE_T nb, mstate av) segregated mmap region. */ - /* Cannot merge with old top, so add its size back in */ - if (contiguous (av)) - size = ALIGN_UP (size + old_size, pagesize); - - /* If we are relying on mmap as backup, then use larger units */ - if ((unsigned long) (size) < (unsigned long) (MMAP_AS_MORECORE_SIZE)) - size = MMAP_AS_MORECORE_SIZE; - - /* Don't try if size wraps around 0 */ - if ((unsigned long) (size) > (unsigned long) (nb)) - { - char *mbrk = (char *) (MMAP (0, size, - mtag_mmap_flags | PROT_READ | PROT_WRITE, - 0)); - - if (mbrk != MAP_FAILED) - { - madvise_thp (mbrk, size); - - /* We do not need, and cannot use, another sbrk call to find end */ - brk = mbrk; - snd_brk = brk + size; - - /* - Record that we no longer have a contiguous sbrk region. - After the first time mmap is used as backup, we do not - ever rely on contiguous space since this could incorrectly - bridge regions. - */ - set_noncontiguous (av); - } - } + char *mbrk = sysmalloc_mmap_fallback (&size, nb, old_size, pagesize, + MMAP_AS_MORECORE_SIZE, 0, av); + if (mbrk != MAP_FAILED) + { + /* We do not need, and cannot use, another sbrk call to find end */ + brk = mbrk; + snd_brk = brk + size; + } } if (brk != (char *) (MORECORE_FAILURE))