From mboxrd@z Thu Jan 1 00:00:00 1970 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 B9954C8303D for ; Fri, 4 Jul 2025 15:26:00 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E81466B02C4; Fri, 4 Jul 2025 11:25:49 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E32046B02C5; Fri, 4 Jul 2025 11:25:49 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D209C6B02C6; Fri, 4 Jul 2025 11:25:49 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id BEEBD6B02C4 for ; Fri, 4 Jul 2025 11:25:49 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 45029102236 for ; Fri, 4 Jul 2025 15:25:49 +0000 (UTC) X-FDA: 83626957218.13.86EE244 Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) by imf27.hostedemail.com (Postfix) with ESMTP id 5ED4C40006 for ; Fri, 4 Jul 2025 15:25:47 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=mvUdN22i; spf=pass (imf27.hostedemail.com: domain of urezki@gmail.com designates 209.85.167.46 as permitted sender) smtp.mailfrom=urezki@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=1751642747; 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=arwAS3MnsbTZHt/wqS3QddqTZ/QZ8JyexXGr/bs6RJk=; b=wH1t42upPQ1/yOJWpiv1H1HQFFVn2XJIMHtMsREuU+1CA9UKYMFtBh7iqfPe/poeS4GJlu B7gquwvU9NuOrdyL/hYFzNkYsM12lWtD2opLayXyYUHAkqBtziu+g2SkGAPyzTjLlab188 QpU4G4lOKwsBdIUseJgpZBbIlt5npS4= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=mvUdN22i; spf=pass (imf27.hostedemail.com: domain of urezki@gmail.com designates 209.85.167.46 as permitted sender) smtp.mailfrom=urezki@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751642747; a=rsa-sha256; cv=none; b=rB98C5f7xGraPhF8RpWEm0aK1ZaAOxJUGMAQ9FcsWsq4jfnqC39s/NOC0ZmT0BSzuCjBrK u/f8/IIo9h5nFOgMQ2SlzQY8dNfKC5sdUOTfi+StSZd7ApJyuYainT7u+Pmlr6WzeyZT7L TZ+9Iz3kquuB9OF+dBye/hppvZG4ry4= Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-555024588a8so1072531e87.0 for ; Fri, 04 Jul 2025 08:25:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1751642746; x=1752247546; 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=arwAS3MnsbTZHt/wqS3QddqTZ/QZ8JyexXGr/bs6RJk=; b=mvUdN22i3P9DQApiEQzLnx2KtjcWgcaPKb0bSRIIeikOerYn9Rk6pQdlLi2WEIa3Do Ik3aoYSl2i2TJLUZtIfgTUtuDo1ef9PDTsfbtZJtS2GUbryZi15hwdMi7NvA35kRtjNx 7z0Q3eeqXdiGA5cdrnZTK2vJsA7U7odISNDmdoj9icqM0T/VmCvAZhI38F5gB1M2nJDw KgouiZZpm3Znx7+kK814nTcgwYsSXjjUvxGsujMc/dOsH18R9bFrS+QuN/VIysFCM4GY t9LgXcY5pjiMBCbpduqlClLVbs/hafwuqrhDGuCd8w7JEeUcQEs4oz9uW8b9UCZOfpOY x3eA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751642746; x=1752247546; 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=arwAS3MnsbTZHt/wqS3QddqTZ/QZ8JyexXGr/bs6RJk=; b=YzvLTWL9bDqQtZavsuJg/Mn/Ald++sk6tHd/qIfniJbrMWKzrNp+AUJ6ftS+MkIENF sRD2vrNAYD9BARmOhvzNAlMaotLjIXKbrflENwbvmCCADfrWzujX7+GPm368BBNqgZ0m SIg9f+vjcKP3UzfsGAs17fn6+Ge9kHSs90TorNEPAdVao0MxFxsNmdsEL/YLfskT/U+Q QWUMpcS8YpRgQhvBILVoavEU43aiBJa4Ka7kO+rC3qg63r/DmKnM1xb3MZgkQ2wf3R1y WDocKI4LrwN64ETBwiHXC3HLYkF0OXRWzfu81UQfa+AIg/994s/2aGud6PC9OlNCHLiq oOQg== X-Gm-Message-State: AOJu0YyOaq5NPO7Ndud68qAKTtcuq0KnHbcHjADFg8BWydFMhAXEX3WK Fcql1nRdlqVgwF7BM83ig58cf7ajkixXLR1//Oml+rL9ua1KXf2VwYhmSsc0JQ== X-Gm-Gg: ASbGnctQAC3cQMYsdK20vZsgdBiPwRcwaA8wdwWDuk8DbV2lL2+tFMJm/ggf2ljkT82 YUZDEEOIsXM73yRsI/i9ouObUzVT056rkYIJRrRJD07EidMORx/gTw3P/vxnRYaxBbiRRspLvte /vc8G93Zw2DsjYfUR7CBIoWme0SJEu+hXi22vMfUcxpWkTpVOnKldOxKaK8CMjh7eQej4gSNGrM oOluZaQKEDhGDQUh59i01ar/hhXZO/Vpny1hTOg+Zvqs9CG20mdZFQxsfHsKjmei1dk2cgyN4C1 9DwPOFm12GXTO5cBhgWJhaHIpnVRDHwMzJSRSV3AEDfr0i1nqVr5zQJz4Q== X-Google-Smtp-Source: AGHT+IEYL7tRLeQ9FHsJy0cpiiGVHfquXjv3sMFZffM/DIKO7uvCOChW4gRxbWFFqxpfUSQWnHPTig== X-Received: by 2002:a05:6512:e99:b0:553:37a7:b217 with SMTP id 2adb3069b0e04-557aa292c14mr873459e87.35.1751642745406; Fri, 04 Jul 2025 08:25:45 -0700 (PDT) Received: from pc638.lan ([2001:9b1:d5a0:a500:2d8:61ff:fec9:d743]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-556383bb113sm281028e87.11.2025.07.04.08.25.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 08:25:44 -0700 (PDT) From: "Uladzislau Rezki (Sony)" To: linux-mm@kvack.org, Andrew Morton Cc: Michal Hocko , LKML , Baoquan He , Uladzislau Rezki Subject: [RFC 6/7] mm/vmalloc: Support non-blocking GFP flags in __vmalloc_area_node() Date: Fri, 4 Jul 2025 17:25:36 +0200 Message-Id: <20250704152537.55724-7-urezki@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250704152537.55724-1-urezki@gmail.com> References: <20250704152537.55724-1-urezki@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: qbkzyzb33m9phxdkw7z4ars65zu47h96 X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 5ED4C40006 X-HE-Tag: 1751642747-275408 X-HE-Meta: U2FsdGVkX1+pv6y1QWuOJERv0EfrhsW3SJnOXEXW5NGv+HJ56i2qqIJVxvR0jKHI5yl8iiGL+HRrsqd8+XWhBaqbxEyUU+CQ8wffCXCbLruz4tUHtTQhHnnJJ6nwHUOW19XGCTo+4zz0DqydUe/8LT5LBifXEA832xRQrEBidOh6uRSqM4Y/BTlE2GmigCM76hDTitJmj47PzYrlwDnrx/U/zyMlm7safiL7KIMl9QLzPgHxJ5ZMsbytpxzgjS9zx7F8cTLEdViu3kbKlfg7pqaI9Lw3llBVU9C4cN4d4c78V5d1EBHo2NzVL6k5wn4UHmdr4T4lLJRLYE9e97L8TBFJziXkzTszVOtdEeTLB1zIIENZ4T52GQTwIhyPCcRXfXpaM5bg9LLbsE9qywG/Yvhn1t/5R5cHeVH/d09rNuEMz/IRXPvWJb0YCSveoMXXduuwtRo6HPsFfvj13tHcp6YXqiKf/mlyIRym1l2MAf8KNpvwh9bD0bLnHtmgbAGIaK3JzvT9MpyICqo97JaC1yOUPTczzHMydvbYuo8VODRcHBiwKCJ+0Dx1ygpAMiKwmgXRE5lOmrT+TB8ycXWvRqT0Ti+8e+w6Ck/1HHyFYlk2lnueQh6QPXjZkszTMfVYveCluU9xyqejVMrWzQZHzRGnRTmIksraCi1BA5T+UWfIDWorZumjHxUpvy4pfGBTKUs4PdfNI53c2j62iHwLEsdSwqTcI1Jan4M+59fuqbrl89YMMbylSXmfECL6BdXG3l6c50l2867Uya1+YtTgrRZAP+HAwznFqetjRBAuht2fKnAaQwbgWjThvgnNz6Fx776+leQa0SxjW62EkhVupvLnyJaHRNQL3Q833BtAL/EUfloUuYP2U4m+EQG1NGNIfB7aDLIPKIf6sbMArU77Octz3AxayDNOCoK52D8sVsJVi3qQQn6Zhki/Jr94OhYxJt2GWiltBq/eYn+1DFi cCLAfiJS rn3bCh5VywCm/jCkaFziMCPgqLy5PP3uC3+kutlmcGfKUWeOizKBHKvkbqEO2leSFy1TBw1CXiz7SVOU+0e9T/HZwI5agEWK94G6DeTsiM7QhlRtLeZbxnYH6FC2/u5elNqD+QwrCSNXgh379U+PK0KJrz9Kv5y2R+dgpo758mVMWhLcz0LDhbh9TTyTLm6oxbWt+J+fr1/vgcRL/3Kc8NXQJwoU940jdv32AeAiVpnRahYYLaWKa/crcDTiJCvtj7scInQODDleBTAkB0fppXJRqXKYhkZeX69E4kmG4kT22zq3aSZZIUBNtTxK47Ut6fXo0KNVz1KgHhvEqZbngFxtDSHlb+SSXMxHMcvV1qjYz5n2RXJxN+y08T6swFTOI5sFzzoZraFqBUot99Dry7R1oc7LvIvlSRXvQ0XNvKzFBRUcxDC1kqAxbBVlp1dF1jS1/W4IqVJZ6BlW+SHFlrhVE6njBfsj263kgCZ1GdQa/sF5eEalio/YuvA== 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: This patch makes __vmalloc_area_node() to correctly handle non-blocking allocation requests, such as GFP_ATOMIC and GFP_NOWAIT. Main changes: - nested_gfp flag follows the same non-blocking constraints as the primary gfp_mask, ensuring consistency and avoiding sleeping allocations in atomic contexts. - if blocking is not allowed, __GFP_NOFAIL is forcibly cleared and warning is issued if it was set, since __GFP_NOFAIL is incompatible with non-blocking contexts; - Add a __GFP_HIGHMEM to gfp_mask only for blocking requests if there are no DMA constraints. - in non-blocking mode we use memalloc_noreclaim_save/restore() to prevent reclaim related operations that may sleep while setting up page tables or mapping pages. This is particularly important for page table allocations that internally use GFP_PGTABLE_KERNEL, which may sleep unless such scope restrictions are applied. For example: #define GFP_PGTABLE_KERNEL (GFP_KERNEL | __GFP_ZERO) __pte_alloc_kernel() pte_alloc_one_kernel(&init_mm); pagetable_alloc_noprof(GFP_PGTABLE_KERNEL & ~__GFP_HIGHMEM, 0); Signed-off-by: Uladzislau Rezki (Sony) --- mm/vmalloc.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 2eaff0575a9e..fe1699e01e02 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3711,7 +3711,7 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask, pgprot_t prot, unsigned int page_shift, int node) { - const gfp_t nested_gfp = (gfp_mask & GFP_RECLAIM_MASK) | __GFP_ZERO; + gfp_t nested_gfp = (gfp_mask & GFP_RECLAIM_MASK) | __GFP_ZERO; bool nofail = gfp_mask & __GFP_NOFAIL; unsigned long addr = (unsigned long)area->addr; unsigned long size = get_vm_area_size(area); @@ -3719,12 +3719,28 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask, unsigned int nr_small_pages = size >> PAGE_SHIFT; unsigned int page_order; unsigned int flags; + bool noblock; int ret; array_size = (unsigned long)nr_small_pages * sizeof(struct page *); + noblock = !gfpflags_allow_blocking(gfp_mask); - if (!(gfp_mask & (GFP_DMA | GFP_DMA32))) - gfp_mask |= __GFP_HIGHMEM; + if (noblock) { + /* __GFP_NOFAIL is incompatible with non-blocking contexts. */ + WARN_ON_ONCE(gfp_mask & __GFP_NOFAIL); + gfp_mask &= ~__GFP_NOFAIL; + + /* + * In non-sleeping contexts, ensure nested allocations follow + * same non-blocking rules. + */ + nested_gfp = gfp_mask | __GFP_ZERO; + nofail = false; + } else { + /* Allow highmem allocations if there are no DMA constraints. */ + if (!(gfp_mask & (GFP_DMA | GFP_DMA32))) + gfp_mask |= __GFP_HIGHMEM; + } /* Please note that the recursion is strictly bounded. */ if (array_size > PAGE_SIZE) { @@ -3788,7 +3804,9 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask, * page tables allocations ignore external gfp mask, enforce it * by the scope API */ - if ((gfp_mask & (__GFP_FS | __GFP_IO)) == __GFP_IO) + if (noblock) + flags = memalloc_noreclaim_save(); + else if ((gfp_mask & (__GFP_FS | __GFP_IO)) == __GFP_IO) flags = memalloc_nofs_save(); else if ((gfp_mask & (__GFP_FS | __GFP_IO)) == 0) flags = memalloc_noio_save(); @@ -3800,7 +3818,9 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask, schedule_timeout_uninterruptible(1); } while (nofail && (ret < 0)); - if ((gfp_mask & (__GFP_FS | __GFP_IO)) == __GFP_IO) + if (noblock) + memalloc_noreclaim_restore(flags); + else if ((gfp_mask & (__GFP_FS | __GFP_IO)) == __GFP_IO) memalloc_nofs_restore(flags); else if ((gfp_mask & (__GFP_FS | __GFP_IO)) == 0) memalloc_noio_restore(flags); -- 2.39.5