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 9BFD9C83F07 for ; Mon, 7 Jul 2025 07:13:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2B21D6B0388; Mon, 7 Jul 2025 03:13:09 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2625B6B038A; Mon, 7 Jul 2025 03:13:09 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1517D6B038B; Mon, 7 Jul 2025 03:13:09 -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 F3A886B0388 for ; Mon, 7 Jul 2025 03:13:08 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 96D531D907B for ; Mon, 7 Jul 2025 07:13:08 +0000 (UTC) X-FDA: 83636602056.11.F3DC112 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) by imf10.hostedemail.com (Postfix) with ESMTP id A2C41C0002 for ; Mon, 7 Jul 2025 07:13:06 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=suse.com header.s=google header.b=YvsDBWzm; spf=pass (imf10.hostedemail.com: domain of mhocko@suse.com designates 209.85.128.41 as permitted sender) smtp.mailfrom=mhocko@suse.com; dmarc=pass (policy=quarantine) header.from=suse.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1751872386; 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-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=JD+KiT4FtkyyerWMkVRBua38h0IytD72AbLemM5udpo=; b=nTsFZmXLR0WniLjlx+aCJpbRPvkvwzT6JajrsouFVWL3s6sEzmc8mif+5k6w4f+OMNjTvi UUDVegFM8xIenax1NbK+LazFE31yZ5g0L8aZBKgm4a6W7k7vK7XszIeI+8VmTkyHIlp3o1 zmNxEsbjtEs82gAZsLdfNTa9T63MzDw= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=suse.com header.s=google header.b=YvsDBWzm; spf=pass (imf10.hostedemail.com: domain of mhocko@suse.com designates 209.85.128.41 as permitted sender) smtp.mailfrom=mhocko@suse.com; dmarc=pass (policy=quarantine) header.from=suse.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751872386; a=rsa-sha256; cv=none; b=yWjvNsKCUffEr3QkINWdk+LwYofu7NyfhxWwYhOEOLEw04EM+jHfSYWYZN8UF71EjLqz8n RWs/yLt2vz/QIjxD0Jye12+nWsCqE0vSj2T5bKQ0ANx11i1mT4AznEdLZPrYcyAApo7cuA cDv7kQ9/9V0LSfLlYWN0kIOWX6PWASI= Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-451dbe494d6so30857955e9.1 for ; Mon, 07 Jul 2025 00:13:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1751872385; x=1752477185; darn=kvack.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=JD+KiT4FtkyyerWMkVRBua38h0IytD72AbLemM5udpo=; b=YvsDBWzmig5rfssj7hTzCfC77EtoYkKl6urM+RQBnQ1pRSDD8Ai2BK/Euj10ofK7i9 75Qd6TNE286bVrvnvCXsVr/z6ld2kEG+ZT79RTk52/x5JQ4RW0kJ08E+CPHJQXYa5zB/ 0v1I34CwvY6LWka5jpeeIVWwJIsqTEQ+I5b/Zx+Iu/BNcqqqS1ayIZwONqcOZQqxk6v1 jSJfzEIQlqXMEKS4gIaMP5/GxeHdEm7nBpBVjiXvqy0n/ML2d1FwKLlzOCpYAafaf1CP YmuMHkjD5DUUl6TtLliUNO1zrPOYPZxGVMYrwZjwPHNpSAWayBmUFIHk2jF/NzGZ1vXY 7pZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751872385; x=1752477185; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=JD+KiT4FtkyyerWMkVRBua38h0IytD72AbLemM5udpo=; b=Gr780QkJQhCYQeSQCd+E0tYGH9cl4jAwnPfbKcYgEo1zooSrHMlJgBYjN8yGTROIMt 3Mxs50Q7kGdl3nYTtKc4KamAQbtp285q85WGEX/Q6xwYgfBQCZ098oysxOX+7Pj8GmzO O6Yha137EkUicKgnxSqQlePYYdBLoEDgUd4FH0L8SUqyMo0/OYk2WAw7KW2j1N3UGYmV SUrdOpOlKFZ2wPt8M1qZnxw0uJqWpRa4ne9+2R6A2d/Qm7lRuZ3bqTCj+Tzo8hWFg/uD vrH3xuCRUd4kclIA9aMoULwJuBJnhvZgSbno+3hvG3Z7BYeYyTGF9HEtlJN0diV+BOic uYaA== X-Gm-Message-State: AOJu0Yy80CqK+pGPdXNnikyj5fEtVHJHhgFICbdItHxNWgl5MtQcvrF2 KmQeX0soBdcsScm10vlK8xFS+/iQN455J1ht0WZlzcu1TSNRarUhBwk2+H7NtTgSVYxPJWSaDow HSQzsstY= X-Gm-Gg: ASbGncvSzlNGM4hmAUtdjEe10rYzHdy6Uke7lGNBZRl+jt96GOm8IH2UM/swyjUpJdl jjTitFzRs2qg8frTyoL55IvVIvQyarRg+zscUokB8QxOPue/BdW2qMS8Du2JneQ0ozVlWfIvTRb 63xLS6ZWmnuev85epnM4TSmdnw2bDJuE+nCxuJeG6CaKqpaIdcxAB4o0ck7HxuFQ6dLANpibYI5 vqekJrPS80k3i9UCsLeXbP3p+gZcVhZ+3eiP+ugDiDaVOa/x4sicgaG8t5Sz65gwy/w5oJ6ASgJ J5WbqMLLrkFfNkLv8tRiBwXFelpCoa6jFlwzqFHgQLrAFPBk9q98hh3YujBKjtDFprp5nPsZao9 vowX4FLMQbg== X-Google-Smtp-Source: AGHT+IFsLt272vV06ptARJ2oT9fvp3AfYVUmVEbm+og3dVym4WCkiSPG7XgA962/8Uj17ANw8ZWrRQ== X-Received: by 2002:a05:600c:a108:b0:442:f4d4:522 with SMTP id 5b1f17b1804b1-454b6a9534bmr62703415e9.5.1751872385129; Mon, 07 Jul 2025 00:13:05 -0700 (PDT) Received: from localhost (109-81-17-167.rct.o2.cz. [109.81.17.167]) by smtp.gmail.com with UTF8SMTPSA id ffacd0b85a97d-3b47030bd90sm9419344f8f.15.2025.07.07.00.13.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jul 2025 00:13:04 -0700 (PDT) Date: Mon, 7 Jul 2025 09:13:04 +0200 From: Michal Hocko To: "Uladzislau Rezki (Sony)" Cc: linux-mm@kvack.org, Andrew Morton , LKML , Baoquan He Subject: Re: [RFC 6/7] mm/vmalloc: Support non-blocking GFP flags in __vmalloc_area_node() Message-ID: References: <20250704152537.55724-1-urezki@gmail.com> <20250704152537.55724-7-urezki@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20250704152537.55724-7-urezki@gmail.com> X-Rspamd-Queue-Id: A2C41C0002 X-Stat-Signature: ezikkbqc8mw3cctef6psfscnnokyyrfk X-Rspam-User: X-Rspamd-Server: rspam05 X-HE-Tag: 1751872386-638543 X-HE-Meta: U2FsdGVkX1+DJN0VtYZ6cOvwpllWvrlQgvaAwNBDcbPMeDFUYA7YyURaQ0N3OhgEU+e7+q4bVI2rkhscRaKbp1qj1SUBSz+LjQglz/ZxETXhxI/DJW42WMl/s/Iv6qpmBzRhuXlkUp2nT0XVs0h8CT7XpAJG71lpEVWFnzOfRHr4MCqQcygnTin4kwmBECrgLKw/9Ga5K36G6p9aEp4LLEoh+LPzuMpF28l13lvaPgE/aI1ugyL2Mp+qaEg+CILps/c3lmD/bmd8QGyI9NsBAQmqDA3hU39/BW6DsXL1zBO5W2XDSxkXnzSTRdaWoiQ48ADs5+Fo3uONfEcfXLKucHAdc3HVJ+9UGM27d1/fB+aAwZCJADCH+cO8/BP00cley1PUOK0g6klYje4WrZI82tkiwTR7OL8YpahyM0ii4QVcyvx/HRLcbG5mnqHVMBtNdu1pGnRkB5UwOAmPUR9VCsIcqP7P8F8a6YaOR3daWpMnME86cgEW/kkAWxW8Csc/+GamNg1UYB6ZzBZGIeS525GUbYXO5Sl797Mi1JJeNVCOTUa/2UevgVuTwT7caTThnLtASBxLMojnGgkETFUNDoZtv4+CnkzzHzhQEXVaBXMRT23C4DTKPAxIf9LJkZOoOnt0jk4qth00uIGD/OIgTgb3O92+NgTr7bl5J/mcksTOHuZfMOkK0Y2fp/UIzZuj5h7XhlHi3i4lqFbK85T3RSzueGwz4gksRc29/qGdRDPAFkq24gJ7M7iXyHcad5SYGsvO4mjnzbFMIh5HQM3JmQ9F5gB/LX2byl0F4BmzajpJMSE3d84kURm8gPMZUPSwamZjwcfAFdOeM63h1uvUsSyJ2qO/eX8bQJjB8D3nGoJMh7FX4QNyTBatg1Kkd19m4GWL8zpodnoRmWs+ALg+918d3X7z1t54XKHS0VHGLLMhGSNlS4/Rv1ZCYAER+jPEEHyZovn8Sq6tg3SIdTA a/KtRtJl xzypJK3rs5sGwU6IY4hV2nea6fvnBWHQiOlTw4H8u9nT0A/KApPaZ4sd+tkhsZchLqlzPEKd1+gHL+Tfn1x7z5lEeal7HV5gTatWssGUJnhoUmaJJP8t28mEPtvDrmsqxLlWhdbFJNgzVodcSqTIm3/8dfxmGMxW+yGYz3ZEi9mCAP58ItxfP6BdbC1w7hTgK3KgzW9PyoagwL2H24IY4LfiqQBpngOxDvwqBPSq0kweOk4mtyLCfMu8PMMt6e/QKxvB9QR5xgfUzN7RF2t1OcByd/G9UCkkKNhBbu/kADT4Qx7vZtDkQFUcD5G0DbVDp9p3ErrQkmoGp9SBzYxKRKUzlffOLrsB5Wtk1KodZm2orfOhZvLcWBvSYgdYKCvzsABjkKF/W5XrktOOUrFHwAsvAPMtT+8F70cLS 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: On Fri 04-07-25 17:25:36, Uladzislau Rezki wrote: > 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); > The changelog doesn't explain the actual implementation and that is really crucial here. You rely on memalloc_noreclaim_save (i.e. PF_MEMALLOC) to never trigger memory reclaim but you are not explaining how do you prevent from the biggest caveat of this interface. Let me quote the documentation * Users of this scope have to be extremely careful to not deplete the reserves * completely and implement a throttling mechanism which controls the * consumption of the reserve based on the amount of freed memory. Usage of a * pre-allocated pool (e.g. mempool) should be always considered before using * this scope. Unless I am missing something _any_ vmalloc(GFP_NOWAIT|GFP_ATOMIC) user would get practically unbound access to the whole available memory. This is not really acceptable. > 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 > -- Michal Hocko SUSE Labs