From patchwork Thu Feb 13 03:35:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexei Starovoitov X-Patchwork-Id: 13972749 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id C0501C021A0 for ; Thu, 13 Feb 2025 03:36:10 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4D2A9280005; Wed, 12 Feb 2025 22:36:10 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 482A2280003; Wed, 12 Feb 2025 22:36:10 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2ACEA280005; Wed, 12 Feb 2025 22:36:10 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 0BE50280003 for ; Wed, 12 Feb 2025 22:36:10 -0500 (EST) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 8AB4BAEE8C for ; Thu, 13 Feb 2025 03:36:09 +0000 (UTC) X-FDA: 83113508058.10.08686D1 Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.45]) by imf06.hostedemail.com (Postfix) with ESMTP id 66DE7180005 for ; Thu, 13 Feb 2025 03:36:07 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=gzkdFrmz; spf=pass (imf06.hostedemail.com: domain of alexei.starovoitov@gmail.com designates 209.85.216.45 as permitted sender) smtp.mailfrom=alexei.starovoitov@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1739417767; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=lzTu73HDNMqdVTVLzxRBLMiERoGgzud+lLSX9AZjyIs=; b=sEe8h4jC044opUOYXjZ9L12pAb1KGRQYD3l2aq5RS7PcKjps/rms0KPbXYkTVr2uEuhwhy HGoLdUr+bXbWsvdM8BDMpYQsCV4ekxkGkNGnR7RYw4R8bVXr9U9apa52vITXY4wVFpcYwe KvartuBOb3rfY8TpTYNSUpaqvyt8wmA= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=gzkdFrmz; spf=pass (imf06.hostedemail.com: domain of alexei.starovoitov@gmail.com designates 209.85.216.45 as permitted sender) smtp.mailfrom=alexei.starovoitov@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1739417767; a=rsa-sha256; cv=none; b=Wlbm4dumpAesHW6SeR7IU4jOGx+uPTuIf8VnFcVrW73inl2rC2VWD8IGnH7Ldj3zdkil4E S2RDyrk5C5dD6+A7vbPZlB621AsSLk2ghYbwjrP7b1krX8ZgW3yLI2eWvu790Ne5R/YkNt IQvWaU7AStWj/wGt+TLTzPShVnyhGmA= Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-2fa1a3c88c5so677245a91.3 for ; Wed, 12 Feb 2025 19:36:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739417766; x=1740022566; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lzTu73HDNMqdVTVLzxRBLMiERoGgzud+lLSX9AZjyIs=; b=gzkdFrmzYI9B+H07atIv3ySgzcapNdXl74wvlxM9xQ3zChDeyK4OLZMs/JURfQdx6S HjOGNJ4cCqfd/sahLbauE7FY9gOU16L3UtsheMkqzRL8x3sixcvfUd6mQSBfrE5cz4vA Y8AW5PcK0rt2Kx5d2fym/ZAUCgldAG1GgrAnfff9+DnO9P7TjjvQDDHBs+SNnzamw83/ w3V3uQFOsJnLjOIbrS1+bXa3InB675K4IOSVdhLrLDqa0EgbDvFUJJJ08qZrB7VhU5cm AuvDK6YZw14PBkl8j8XHX0C0QQuyOzFjajG2LjKDq+chwMbV8+KY9JXck8Uwo1cgu7yW soQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739417766; x=1740022566; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lzTu73HDNMqdVTVLzxRBLMiERoGgzud+lLSX9AZjyIs=; b=K7ZNpSdhp4ZP5IDKDopb5y6PPd6D0464ErlJ5lRHOMlapC7K8vMnGf1bft+sWOIo1r a0VIHe09pdmaqXO9dF67EOt92Ug0LUE3iv9bQRYSXeva4zuHA70ovOYfQDzg8BOabn+5 /pPpL6rGhtA9GMopDMAAHM6INh24STkV/+6H/NVGqxmAa690wJUnFt1twsCpWGMWVxCi Qrq7PlffbI1pymQhmybj88pNM2j+nqFXcxSNHFeaxm3u9i9JNbeHh45bZB+97FfbZSkt gs7wODgtB5QTqy6nxou2rPXj3jzByoMrTPe+y51IKCUaQz9aD8RrDMcsVm3NBhI5PU3E A0Nw== X-Forwarded-Encrypted: i=1; AJvYcCXLTYw73Gai3Mcj2OWiPlJxYz/1LOiSI3FNnoaQcnGKX/LR/831hSEOmzfYHwhklXeGG9hzevOBpQ==@kvack.org X-Gm-Message-State: AOJu0YwKvzGKuf06etFxxqiSf/z54623iEFmPU+dLdDn5Rr3T3B6HoZ6 9iKyS3uOMD8Wf8Rhcd2AWSUiurgL3IAxRAaLegWnMxNdK+Lmu/Nw X-Gm-Gg: ASbGnctUDVRlgiWcqEg3z+cSFRBETgZlqK7XQ9SVQuuN41+5MOS0B6jxYSB+IsVN48d C4/TDwtFnNpA/XsftIslaypJPogCAPz/VYckAJ4obyU9FiGOSaX2n8CJmREk1Nlpw+z5OGqtTDW jN4oFUXWH08WMzBSepoRmFid3IBxWMQ1xQHqROBKaVL16yMP7NDRLUKwQff+1D87rHIkgPuXDHd Wil1vxGmIBp0dgev1om4hjQabw5TrKoam+AjwVDiBd6RXTu6FR8ir5winEyMLpJtpIbEp3wf640 PqnNjT9QUwt3m3dRMHDR6bJbvi3SPWc2fCvCck0omMhw0MTgSQ== X-Google-Smtp-Source: AGHT+IHwW0mWciqg0xYIxqI4O6t3z/9NXB3Y7q2juLoIWFRHSivyRpyZDeMZECumFXMCEhZFV6jUHg== X-Received: by 2002:a17:90a:d404:b0:2ea:3f34:f190 with SMTP id 98e67ed59e1d1-2fbf91067abmr7466225a91.25.1739417766159; Wed, 12 Feb 2025 19:36:06 -0800 (PST) Received: from macbookpro.lan ([2603:3023:16e:5000:8af:ecd2:44cd:8027]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2fbf9ab0233sm2256043a91.44.2025.02.12.19.36.04 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 12 Feb 2025 19:36:05 -0800 (PST) From: Alexei Starovoitov To: bpf@vger.kernel.org Cc: andrii@kernel.org, memxor@gmail.com, akpm@linux-foundation.org, peterz@infradead.org, vbabka@suse.cz, bigeasy@linutronix.de, rostedt@goodmis.org, houtao1@huawei.com, hannes@cmpxchg.org, shakeel.butt@linux.dev, mhocko@suse.com, willy@infradead.org, tglx@linutronix.de, jannh@google.com, tj@kernel.org, linux-mm@kvack.org, kernel-team@fb.com Subject: [PATCH bpf-next v8 2/6] mm, bpf: Introduce free_pages_nolock() Date: Wed, 12 Feb 2025 19:35:52 -0800 Message-Id: <20250213033556.9534-3-alexei.starovoitov@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20250213033556.9534-1-alexei.starovoitov@gmail.com> References: <20250213033556.9534-1-alexei.starovoitov@gmail.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 66DE7180005 X-Stat-Signature: ww3uu45i5pt4wcp57hrsgzru3ttoucjp X-Rspam-User: X-Rspamd-Server: rspam01 X-HE-Tag: 1739417767-643790 X-HE-Meta: U2FsdGVkX1/sSl9wI2QXIF8SIyoTteukddC7H/ItCeGTQho5u4ITfe2bllpyC0ssNoNwpIIsqCRyUIp/guESXbeeve1k326DPu3F5SKxASRZsKYK4zngjgWC5sd2m2ZdwvttUB0QwZErYnjyCj054CFuLS8EfThBj8B12qB41sOaeO+GUCOBqttEdJm9denLll7hRNSoU0MAeTIVDiZ41Kaix97mXRZFvK8anqwwGGTvdfXC3bX3JD/6hC0NQpMgK0NutBuakHvrv0OTDY2aa4kQ1H99UhhzUOWeFWOGqU64qFcyvn/a5NmsrXx7z7p+TkyEd1ovhsSt+ExiQtsqpVEm4aGZwGG0y1hFTTsH0j6caqATmg/9HWmgOGwZMpY+gvcLcAKunrxJ1nMJHramUJdao4uLnOVq7YBFyaU/L7JgQumYRtW0zVe/yI66JOBZm/73KJ0UxZhFenJ7XQS53QFLR87roq0Xye4IsEEuSu4uNgSQNFpT7rRe6Jjyq1u+hKccTQ9U1z/aVucuxUyOfTgTvOO+xmp3YwsOHkgN681Dg0caeFp2vDxpJ8HAFl9NydiqjI97N/seLu9G0XQSzrSsg0TXZ9Npd8D+JVwq2g92aMMQwxE4Tcx9JV4keVHL0GMm0TsXjOCxOmAPLoQVan2JjC7mmpR14dn33SZQ0I8F7pCO0n3fqondEwjBq01R6FWUqMHk2+nIeK7bFxMHFhDT0TcU4qjv39bcFLWup8utzktCBKtbyevycep9prme/4lvQ2hv+/5xk8vIRls8ls3JcTc4Td6AAZ0MQRe8Dhh0+EJndoBlKYug0J6iX7FgA1IuxYl7fuVAbzrFysY4K6yYBwtVGBBS6XyDc1Bhn/gb8Xf3807foRAFXSfxz8uFfOJkOU/XB7IfqmtDuJ2xDmFn5XAD8uhqrrRbdjA1oR0UOZr++JRWAeIUpQF9WNZtvKpzwO6yJByXw30gC7a lYEdBYj1 DeD+KQSzRLpFiY83xi2PG6tMPMZEu6hGYfD/jRx4QHBYkpfrPY6ww62BzoWA4ZZDSsIelDA282BNCRHGcLTIoAJGU0Ms1/cjSM1by3FbSwSXxdh8SVzu5Zx6y/ffzVDc0ly6fvbwVc1YGaJfLtQ314UHDt5ZSSTyQxmUH1x+jdDkO1sYL3vxs62+2FDoFPd1CkF4C0WTpzZ+pTy7WpG7bJG9uAWn1XaXzdoxgUF3kXgorgW5dOyQdOk77lFtWqUbrg0IFOyv24jIBPJoeRwxU3kL1d5fEVAb4RJ6T/LTUY/YexhwcM1dr6vYMCnqKxQwVfAp36LoLi0ZvAmqN1ZFwZ0FCW/kNruN2tESTCjnVgWA2CE6oPDt7ktwuc9RDKxCVSqNUmGgGd7HgEEZMGz0OzTHfTcYJXNrFC5kRuNiaal1lMXzQlcZTPX/V0Smh3LkNbqE+FAQpPGGDMffEN9bnK1GkPbYv2u5lwg5zvQtcHjo++e8jLr9q9AhIEw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: Alexei Starovoitov Introduce free_pages_nolock() that can free pages without taking locks. It relies on trylock and can be called from any context. Since spin_trylock() cannot be used in PREEMPT_RT from hard IRQ or NMI it uses lockless link list to stash the pages which will be freed by subsequent free_pages() from good context. Do not use llist unconditionally. BPF maps continuously allocate/free, so we cannot unconditionally delay the freeing to llist. When the memory becomes free make it available to the kernel and BPF users right away if possible, and fallback to llist as the last resort. Acked-by: Vlastimil Babka Acked-by: Sebastian Andrzej Siewior Reviewed-by: Shakeel Butt Signed-off-by: Alexei Starovoitov --- include/linux/gfp.h | 1 + include/linux/mm_types.h | 4 ++ include/linux/mmzone.h | 3 ++ lib/stackdepot.c | 5 ++- mm/page_alloc.c | 90 +++++++++++++++++++++++++++++++++++----- mm/page_owner.c | 8 +++- 6 files changed, 98 insertions(+), 13 deletions(-) diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 5d9ee78c74e4..ceb226c2e25c 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -379,6 +379,7 @@ __meminit void *alloc_pages_exact_nid_noprof(int nid, size_t size, gfp_t gfp_mas __get_free_pages((gfp_mask) | GFP_DMA, (order)) extern void __free_pages(struct page *page, unsigned int order); +extern void free_pages_nolock(struct page *page, unsigned int order); extern void free_pages(unsigned long addr, unsigned int order); #define __free_page(page) __free_pages((page), 0) diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 6b27db7f9496..483aa90242cd 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -99,6 +99,10 @@ struct page { /* Or, free page */ struct list_head buddy_list; struct list_head pcp_list; + struct { + struct llist_node pcp_llist; + unsigned int order; + }; }; /* See page-flags.h for PAGE_MAPPING_FLAGS */ struct address_space *mapping; diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 9540b41894da..e16939553930 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -972,6 +972,9 @@ struct zone { /* Primarily protects free_area */ spinlock_t lock; + /* Pages to be freed when next trylock succeeds */ + struct llist_head trylock_free_pages; + /* Write-intensive fields used by compaction and vmstats. */ CACHELINE_PADDING(_pad2_); diff --git a/lib/stackdepot.c b/lib/stackdepot.c index 377194969e61..73d7b50924ef 100644 --- a/lib/stackdepot.c +++ b/lib/stackdepot.c @@ -672,7 +672,10 @@ depot_stack_handle_t stack_depot_save_flags(unsigned long *entries, exit: if (prealloc) { /* Stack depot didn't use this memory, free it. */ - free_pages((unsigned long)prealloc, DEPOT_POOL_ORDER); + if (!allow_spin) + free_pages_nolock(virt_to_page(prealloc), DEPOT_POOL_ORDER); + else + free_pages((unsigned long)prealloc, DEPOT_POOL_ORDER); } if (found) handle = found->handle.handle; diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 0404c4c0dfc7..3fbcbeb7de8e 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -88,6 +88,9 @@ typedef int __bitwise fpi_t; */ #define FPI_TO_TAIL ((__force fpi_t)BIT(1)) +/* Free the page without taking locks. Rely on trylock only. */ +#define FPI_TRYLOCK ((__force fpi_t)BIT(2)) + /* prevent >1 _updater_ of zone percpu pageset ->high and ->batch fields */ static DEFINE_MUTEX(pcp_batch_high_lock); #define MIN_PERCPU_PAGELIST_HIGH_FRACTION (8) @@ -1249,13 +1252,44 @@ static void split_large_buddy(struct zone *zone, struct page *page, } while (1); } +static void add_page_to_zone_llist(struct zone *zone, struct page *page, + unsigned int order) +{ + /* Remember the order */ + page->order = order; + /* Add the page to the free list */ + llist_add(&page->pcp_llist, &zone->trylock_free_pages); +} + static void free_one_page(struct zone *zone, struct page *page, unsigned long pfn, unsigned int order, fpi_t fpi_flags) { + struct llist_head *llhead; unsigned long flags; - spin_lock_irqsave(&zone->lock, flags); + if (!spin_trylock_irqsave(&zone->lock, flags)) { + if (unlikely(fpi_flags & FPI_TRYLOCK)) { + add_page_to_zone_llist(zone, page, order); + return; + } + spin_lock_irqsave(&zone->lock, flags); + } + + /* The lock succeeded. Process deferred pages. */ + llhead = &zone->trylock_free_pages; + if (unlikely(!llist_empty(llhead) && !(fpi_flags & FPI_TRYLOCK))) { + struct llist_node *llnode; + struct page *p, *tmp; + + llnode = llist_del_all(llhead); + llist_for_each_entry_safe(p, tmp, llnode, pcp_llist) { + unsigned int p_order = p->order; + + split_large_buddy(zone, p, page_to_pfn(p), p_order, fpi_flags); + __count_vm_events(PGFREE, 1 << p_order); + } + } split_large_buddy(zone, page, pfn, order, fpi_flags); spin_unlock_irqrestore(&zone->lock, flags); @@ -2599,7 +2633,7 @@ static int nr_pcp_high(struct per_cpu_pages *pcp, struct zone *zone, static void free_frozen_page_commit(struct zone *zone, struct per_cpu_pages *pcp, struct page *page, int migratetype, - unsigned int order) + unsigned int order, fpi_t fpi_flags) { int high, batch; int pindex; @@ -2634,6 +2668,14 @@ static void free_frozen_page_commit(struct zone *zone, } if (pcp->free_count < (batch << CONFIG_PCP_BATCH_SCALE_MAX)) pcp->free_count += (1 << order); + + if (unlikely(fpi_flags & FPI_TRYLOCK)) { + /* + * Do not attempt to take a zone lock. Let pcp->count get + * over high mark temporarily. + */ + return; + } high = nr_pcp_high(pcp, zone, batch, free_high); if (pcp->count >= high) { free_pcppages_bulk(zone, nr_pcp_free(pcp, batch, high, free_high), @@ -2648,7 +2690,8 @@ static void free_frozen_page_commit(struct zone *zone, /* * Free a pcp page */ -void free_frozen_pages(struct page *page, unsigned int order) +static void __free_frozen_pages(struct page *page, unsigned int order, + fpi_t fpi_flags) { unsigned long __maybe_unused UP_flags; struct per_cpu_pages *pcp; @@ -2657,7 +2700,7 @@ void free_frozen_pages(struct page *page, unsigned int order) int migratetype; if (!pcp_allowed_order(order)) { - __free_pages_ok(page, order, FPI_NONE); + __free_pages_ok(page, order, fpi_flags); return; } @@ -2675,23 +2718,33 @@ void free_frozen_pages(struct page *page, unsigned int order) migratetype = get_pfnblock_migratetype(page, pfn); if (unlikely(migratetype >= MIGRATE_PCPTYPES)) { if (unlikely(is_migrate_isolate(migratetype))) { - free_one_page(zone, page, pfn, order, FPI_NONE); + free_one_page(zone, page, pfn, order, fpi_flags); return; } migratetype = MIGRATE_MOVABLE; } + if (unlikely((fpi_flags & FPI_TRYLOCK) && IS_ENABLED(CONFIG_PREEMPT_RT) + && (in_nmi() || in_hardirq()))) { + add_page_to_zone_llist(zone, page, order); + return; + } pcp_trylock_prepare(UP_flags); pcp = pcp_spin_trylock(zone->per_cpu_pageset); if (pcp) { - free_frozen_page_commit(zone, pcp, page, migratetype, order); + free_frozen_page_commit(zone, pcp, page, migratetype, order, fpi_flags); pcp_spin_unlock(pcp); } else { - free_one_page(zone, page, pfn, order, FPI_NONE); + free_one_page(zone, page, pfn, order, fpi_flags); } pcp_trylock_finish(UP_flags); } +void free_frozen_pages(struct page *page, unsigned int order) +{ + __free_frozen_pages(page, order, FPI_NONE); +} + /* * Free a batch of folios */ @@ -2780,7 +2833,7 @@ void free_unref_folios(struct folio_batch *folios) trace_mm_page_free_batched(&folio->page); free_frozen_page_commit(zone, pcp, &folio->page, migratetype, - order); + order, FPI_NONE); } if (pcp) { @@ -4841,22 +4894,37 @@ EXPORT_SYMBOL(get_zeroed_page_noprof); * Context: May be called in interrupt context or while holding a normal * spinlock, but not in NMI context or while holding a raw spinlock. */ -void __free_pages(struct page *page, unsigned int order) +static void ___free_pages(struct page *page, unsigned int order, + fpi_t fpi_flags) { /* get PageHead before we drop reference */ int head = PageHead(page); struct alloc_tag *tag = pgalloc_tag_get(page); if (put_page_testzero(page)) - free_frozen_pages(page, order); + __free_frozen_pages(page, order, fpi_flags); else if (!head) { pgalloc_tag_sub_pages(tag, (1 << order) - 1); while (order-- > 0) - free_frozen_pages(page + (1 << order), order); + __free_frozen_pages(page + (1 << order), order, + fpi_flags); } } +void __free_pages(struct page *page, unsigned int order) +{ + ___free_pages(page, order, FPI_NONE); +} EXPORT_SYMBOL(__free_pages); +/* + * Can be called while holding raw_spin_lock or from IRQ and NMI for any + * page type (not only those that came from try_alloc_pages) + */ +void free_pages_nolock(struct page *page, unsigned int order) +{ + ___free_pages(page, order, FPI_TRYLOCK); +} + void free_pages(unsigned long addr, unsigned int order) { if (addr != 0) { diff --git a/mm/page_owner.c b/mm/page_owner.c index 2d6360eaccbb..90e31d0e3ed7 100644 --- a/mm/page_owner.c +++ b/mm/page_owner.c @@ -294,7 +294,13 @@ void __reset_page_owner(struct page *page, unsigned short order) page_owner = get_page_owner(page_ext); alloc_handle = page_owner->handle; - handle = save_stack(GFP_NOWAIT | __GFP_NOWARN); + /* + * Do not specify GFP_NOWAIT to make gfpflags_allow_spinning() == false + * to prevent issues in stack_depot_save(). + * This is similar to try_alloc_pages() gfp flags, but only used + * to signal stack_depot to avoid spin_locks. + */ + handle = save_stack(__GFP_NOWARN); __update_page_owner_free_handle(page_ext, handle, order, current->pid, current->tgid, free_ts_nsec); page_ext_put(page_ext);