From patchwork Sat Feb 22 02:44:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexei Starovoitov X-Patchwork-Id: 13986515 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 02AB4C021B3 for ; Sat, 22 Feb 2025 02:44:50 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8617F280003; Fri, 21 Feb 2025 21:44:49 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 7C2E9280002; Fri, 21 Feb 2025 21:44:49 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 63C82280003; Fri, 21 Feb 2025 21:44:49 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 3F6C9280002 for ; Fri, 21 Feb 2025 21:44:49 -0500 (EST) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id D52C850A6C for ; Sat, 22 Feb 2025 02:44:48 +0000 (UTC) X-FDA: 83146037856.16.638645C Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) by imf01.hostedemail.com (Postfix) with ESMTP id C739140008 for ; Sat, 22 Feb 2025 02:44:46 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=SL0fNzUv; spf=pass (imf01.hostedemail.com: domain of alexei.starovoitov@gmail.com designates 209.85.214.177 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=1740192286; a=rsa-sha256; cv=none; b=mdZSRV4ZY/alh29vcigYuIWMPVL8MnmaSu9CnDTEjDfH0EGJH6s2kcs6zLrQJp/wXRCgZx 9WDnhNv4QJ2owaDuBrlaLbtkSQ1+/9451tOz2f9+Rz4InfpP0/SqAHGQRNnovMBXFbRS6q R1h/c5qf99PVaj3SRNlxRm7+c4apxIM= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=SL0fNzUv; spf=pass (imf01.hostedemail.com: domain of alexei.starovoitov@gmail.com designates 209.85.214.177 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=1740192286; 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=o7gSAyaMDg2aK78kqVgF49+jZKrcrw3bhnHUdoMZI7o=; b=t06lOODcRw+6/FVJFbVPuUhnzwMwf23P3dxMToLf67eCRN4tNiLZSnNVd3/hglzX/8kW+H z4sWPv1u6aVWp3uXor4DKjSZxLZCoVAQqcqz0mLKfEmVsSdUPGzZ0TUT8txb09dvxk59IM NF0mhxPBipgRYyw1yAzNt+HL607dIDw= Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-22100006bc8so49468565ad.0 for ; Fri, 21 Feb 2025 18:44:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740192286; x=1740797086; 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=o7gSAyaMDg2aK78kqVgF49+jZKrcrw3bhnHUdoMZI7o=; b=SL0fNzUv5HHgE5S+h8266ybLBCjtr2D3+yjzvRzUZ+mjYbx4Sy/6kSZIqaeSOjRRyx GdLywH7DO+fJxr1dyjw2VWisUEYBXMkqatLcyZPVe/ee48Fc5TJjq/HJNRQgcdShlSgz 2C+L/COWHH7t/UtDD67FcrNyVdHtnKoNNuzt15N3r4zDVierjnh4MA6EQPb0NROI381O caaUi2l8UImcrf8dY80I7Kb3k71jp229wyrYrjGOzsztNVt7Gn8vsIOrJAwDU7hRAJn8 wihL+MFr7fLBa2H7ykE7I+ebAPp5h9hjG1Ot3eBw+TDothgc+tMgbzcu9+4Xe+X6M+7a tYKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740192286; x=1740797086; 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=o7gSAyaMDg2aK78kqVgF49+jZKrcrw3bhnHUdoMZI7o=; b=gIQKUpGe+4L26Gz6cQgiLMCefj/oR1iolgb+C9ehgfnIXXW1sxYJ6qXxIgMs/lID6O Pym1UIr50IuhjuqczNCLJNJdiLmHNDX1Dw1KhLkCFd/cLKqkSq6AHzCL1qxgcgAaYki0 YJl6f11hqIISqv/n2Bl0/1U/Wt0jMsiiCmXmNGFXuYOxExd+Qk9lQe9Mb/5KI95uvR9f LXIvGcnn5B7C2q3hsjovxQ/9G42XQG5A8518szK9WTO6pwFRBpY0hLlkDFjDjl+G0HIy m2H5L3cc4SElh6hHZ/z5T5nYgVMOPN5BFzsh2/mrCBhZkcNX2GcisgFxnjLc7sgmkJb6 7n4Q== X-Forwarded-Encrypted: i=1; AJvYcCX0LcZmqeXTQLcbsvLEE0V39sl9oaJQPSuwKShz6JOp8v7ZBSZxnfKkLdLWE+5iSE+Uhs1bU8XchA==@kvack.org X-Gm-Message-State: AOJu0Yy8GoZj5sdcUhKDkaO+gR1UhnfXafg2hx6Cuk0gYg1pHLZukukC MCDAkpkjSqsCO67qsXuyjsV0SittPzocDF6aMUlNtLdThBrwaKmr X-Gm-Gg: ASbGncsUTZjQw/k3yxxrIiZyQ4tlJCQv4sMHToei3f+9BJz3eJDfW2xOqOLF9ulrmgu vZeWsKzazIle6dxJ1DKzt4hvmGGkFUpF2ojcx6eCYFYAwc6rgbWWAplI6krTE5QbUDQLow+dGBz oR+qTWE76tBFcix0w+FZUo+XRvfeNyaJbp025CRpKzAxUfE2CtQ6OO3n+TRS3+CB6rTTMGrehTE xg8+xCy3t7NUa3XsisVF9dzWrRrthHnCva+7hA0Azvh/7RPuYrPZZdgcqrwK5A+0ekq7WBd0EfD Nx7/rXFSksQlTbBEXkNswRGR3hfFjBpn9ZCUF51m55e/LK2djVYk+g== X-Google-Smtp-Source: AGHT+IH21mr57VC26OTPfaSlSbo/9B6lZeQIfI31TFaxfhjBWjCtyIwbhx9A5VtfOfNAoOWI2FAXPA== X-Received: by 2002:a05:6a20:2444:b0:1ee:d06c:cddc with SMTP id adf61e73a8af0-1eef3da4cf2mr11663031637.30.1740192285626; Fri, 21 Feb 2025 18:44:45 -0800 (PST) Received: from localhost.localdomain ([2620:10d:c090:400::5:fd1b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73242568b03sm16979202b3a.54.2025.02.21.18.44.43 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 21 Feb 2025 18:44:45 -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 v9 3/6] mm, bpf: Introduce free_pages_nolock() Date: Fri, 21 Feb 2025 18:44:24 -0800 Message-Id: <20250222024427.30294-4-alexei.starovoitov@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20250222024427.30294-1-alexei.starovoitov@gmail.com> References: <20250222024427.30294-1-alexei.starovoitov@gmail.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: C739140008 X-Stat-Signature: 7xsm3578ib9woq8n4upj8yugcf4byb3p X-Rspam-User: X-Rspamd-Server: rspam10 X-HE-Tag: 1740192286-362094 X-HE-Meta: U2FsdGVkX1//Jw9/4ilrQVmCBYlta8B4B8PnxuY31bXfin+CEprhrmTyHrBzfywu5tQ57qCisZGc1u/EwEA2cYmSdJm/WkSjMh2C7Ihmkg2u3cO0yWoA2AceKiuYYqvipzEnC3b9GRm6UrkdjkbqtygtWKBVw2d3gjeyOIpIRhu7sJp1iwXtDwxVsK17msGzb2GF91OxWCi0tUIOcg9AVEpUqGOlNQrB0nM1oOjGfOFhOvR7dsq1OgiUkq4y4ytmIwEFnyojfavJuSlDFSLQn0Sj6dVIC6NPqMhzIcc8n2hOdYLwaOoLUFjFf3YssFTwEtKviUFzPxDSTbXgbaPUkcYlI5BNppHMPm/WIh/GorAxkfGr/MIoJfnY7fEaxgQLlqudzmc6cQbm6jjSY/9j9wX5VBkgUBhnDrc9qIVsvP1zCkzvJdY7A02uEu9cZdAC8ny7j2DKhbVu7Zdu4xq8sKsuej9XeBOcAU2FdfsG6nu0XJ6NdPJ20uqdgTt5KVDsQvwKbMeDKvkHpRvxrZI6N071XoiPPVZnwIAlSjddoiTa1aeeiBx6AbC/5NjspZMh8qQtPbmbCC951eT+/b+Gv3ruv4RHY4yVVH5t+iXDloQxShW5xvGJP+nPZOQB+Ii8KqPxrU4n3hRPqFo+e/OSWnN/R2K0amCzjrvKAMgBaVowSMhHmMbx57vhYR/NRVrrFP5LuJNsCEkGHIQBL3x8ZG72qzkC8tQyjNsx0fRUN3+HBVZHuIRpf9cYx/HySQkgpDfLn45AkVuu4a8xfuLg0qrOfkftCz5brT0ebe8mR2OR+eoLbJxvP3ANUSuV3qg6MaYpUMjogrvhvLymuKfNQxS7LRR5d/pD3vileZ6BZ1rHvvIv1LVN905weEHF+BY4iCH4US7uMrUBUxZcqKIaIAtNCblg0aqqsUAQSsrSg9N162ViSxeFvAZ/2pqneFRPYzw0qRYvSoxO6t/xLwl P6ngL3SJ hQ/PhNLbfv8joDEhGRaZx2hctgAOHXXlv3nJ+lTYS+F4r5IKqQ8ZnQn89heQmhyCLdl4MdtetMUqnYOi0X7fbFmj9Zd2U/sWUL6e7PQD7Un8V9MzvPult46tnbK6s26VcZDcUr8glr2HoLfhYHbU5BxRtKq9Kg/luQdg/57cQ0nKKcyZEFtXgYAm6SspolWx3a2ZZ7EnZJCX2YPPVKbt5AX7Hh1sAn/REjzTn/bWsjH/xL5L7qyzexeb0tBA/9TKL9g1BaSdDBdrIQjMVx92vp99Cg4QOcFRYc3eQN7+LwuxjL+ztIXFGroWLa3GYO2QyIKHmCEu+3DCgfC58x2BjmR7kU5J7NvYlDdeScnXpv1FBMAjyOgvsI5WSZYLCccHZD/MLgDbHJXeT6U0CRWURbXTarim1HpGVv51v7BqxCuxHr9GZtDFOZSUf68LLyv5i2++RIXmh7JzDA3HnDbRgGa92oqxKxz12aDqBgGmb/j3h3y8npQSZPlGvFA== 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 1f2a4e1c70ae..79b39ad4bb1b 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);