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 4EC16C83F03 for ; Fri, 4 Jul 2025 15:25:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9EE1C6B02C0; Fri, 4 Jul 2025 11:25:48 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 99D3C6B02C2; Fri, 4 Jul 2025 11:25:48 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 88CF36B02C3; Fri, 4 Jul 2025 11:25:48 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 766626B02C0 for ; Fri, 4 Jul 2025 11:25:48 -0400 (EDT) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 4528B160122 for ; Fri, 4 Jul 2025 15:25:48 +0000 (UTC) X-FDA: 83626957176.25.55220EA Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) by imf26.hostedemail.com (Postfix) with ESMTP id 591E9140009 for ; Fri, 4 Jul 2025 15:25:46 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=a2OZcK02; spf=pass (imf26.hostedemail.com: domain of urezki@gmail.com designates 209.85.167.44 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=1751642746; 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=pHUeFclyhwsVTJxzUfzvQTESeuKzcTwA3vHG8FET718=; b=OaFjh3K0gs6HFuGZoug6poijB0CaSlf2j5SlKBBX7+uqIwcoGWfaEo9ee4Y6JY1IM8lDCe LeIWhkxhpSinbhD4W4/FiPMi/WTVON0TMc1akv9LZPrAavqyb4rE9rdG3nyLWt4wZHlmua PVetJT5xPmopJeOwQmmTcWZQxNn6Wmg= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751642746; a=rsa-sha256; cv=none; b=w2e/1hTihTld6BzqibQ/trJ2I9Em2Yv/kTY/Sog4qcmIsaBUYRxWxIQ7nD8tTpA1FMgO93 sSCEzaiSPNeRAYoOU/P/v2YI9jBuETP0S0Au619RkR44V7Fj1d6ZJUmdDl9tgvFIYc/BUX 2epKNqgblctm9yyg7P2nNnuNceNxsTE= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=a2OZcK02; spf=pass (imf26.hostedemail.com: domain of urezki@gmail.com designates 209.85.167.44 as permitted sender) smtp.mailfrom=urezki@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-5561ab55c4dso1224399e87.2 for ; Fri, 04 Jul 2025 08:25:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1751642745; x=1752247545; 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=pHUeFclyhwsVTJxzUfzvQTESeuKzcTwA3vHG8FET718=; b=a2OZcK02qgX/XIOqhAruCerdvWO32PaDrMgDwMv2JbSBiZex9cP91Pzpsg7PdK5g+j qbqkXjKt6lY2DExZVXx2A5vgB4DmQBT0EXp96K2L4jOjQNK2LtwPixeS2ufs4V7KmYgs m3s8gjXdnadcW757qELA1WD3oBP5fWLaXQBvfr+XtbMjjVwVLq/4tVTonkQzbvLg/W9u vRgJTYagWnNxy6czAgBLskr67PWLzpfU+iupzyGWoQLg8ZGWan0iGx9WoCvMDUTlMvhx 25FxZ8hKBTdAKJXbRa7aGc/wZKHv+N7aIF9kydmg0ka/tJbyGgp9PFtoFPu2ATQuAsno tQyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751642745; x=1752247545; 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=pHUeFclyhwsVTJxzUfzvQTESeuKzcTwA3vHG8FET718=; b=mkg5kFTCci1yt2KFz1gEmOKbMk2hGBPEJc2ftZnrKv7VquGV5XTqLQX5j/v7hYGtjV yVs5FUZCVM/4XCNUi2b4C5o8KNMGSS1FzkgKu6LmMH00+540I9v3wspqUCbQQO12gWq4 5qzty2/1BBiSRiTvKIp8HpbB/O50fLnNXPNLbHkKdN3oI5KUwck1v0R44NGaKJZgdoZJ aMtqABdU+LP2m7Xx+nDqLnYibItZiqStK1qc51nOfqS/yxKUqFevfqo7w4O+1nQJB4uV 3jbfDPqQqiGfxN5scqpC7abGHn8qtOj32tzmyDaF6ib4DWJpE5v2PokyJr2PPfzxB64/ N7vQ== X-Gm-Message-State: AOJu0YydgT4pKvjC3TegiFySvHq7UWsDd8cWmi8UqtPmU8xhP8N1Ch2m R/xVaLg47g0xMzhB3N7H1F5KDfOJD5O0zuDk0r5YabSesH3OhpcfCKaX+95VJw== X-Gm-Gg: ASbGncsbxv5aUptzBseQl90MrAaEtyg++b6FSlc6ggNkrJnhroef3EmuVHiVNmr9Hup 70eAscaRPDZX/mxfxmWRC1oD83A5M6Vthkh4NLUQTaMBtqILEsQTu93DIUMlP+Qnn7seZXhvoW9 xTXdhLHvP1HJICetp7d6cAjc4pGU02oLmqYPA741iArzN6sNAGiHoJpWeR4UUPf09t2ppkfpPO1 S9/rIG5lZbVOFVP7m5LlnD5Yo41Y6Qq8oW+SFBJOpOyMA4ICoiG9udcvVwWANOAFy09QkpVnts1 Cs6h69k3pCK30FXa9xVO14W5DNqwIXpGPDZUy/gGGzcLgw+HkWBiz8YlIw== X-Google-Smtp-Source: AGHT+IF9kNVMLIoDCz9z6Zd+gvYPf6NxUQYP6tWGaRRecVqu4l25Lqb05sgsp0OcAW+jSRltea3qnQ== X-Received: by 2002:a05:6512:12c8:b0:553:35f5:7aac with SMTP id 2adb3069b0e04-556dd1e4a26mr931874e87.48.1751642744366; Fri, 04 Jul 2025 08:25:44 -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.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 08:25:43 -0700 (PDT) From: "Uladzislau Rezki (Sony)" To: linux-mm@kvack.org, Andrew Morton Cc: Michal Hocko , LKML , Baoquan He , Uladzislau Rezki Subject: [RFC 5/7] mm/vmalloc: Defer freeing partly initialized vm_struct Date: Fri, 4 Jul 2025 17:25:35 +0200 Message-Id: <20250704152537.55724-6-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-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 591E9140009 X-Stat-Signature: u31n677ewze3wmeib45k7gubmyzd9op7 X-HE-Tag: 1751642746-286646 X-HE-Meta: U2FsdGVkX18vDBFs0Ta7v4iHWYtBUUYVYFcFbMCMuvV+bTPGP7Fj5cWdt9SWLqRB65vUatYhPwFMrOR7btEpVmR2gbKJiVsLlWrn/6Uz9smToBffKgbf7IRW7fopyIE0wu9O4REMLbzQEAqrELET+bFy1zUuwV0l/wRYQeM9NZyQwCk2yUAzaSa0XTcFrJSVbLgVNlsmsiURV3LKfTQWfzhKrLzr4vSVw3q32bm9zAtcQMxAcE79EDu19TlCI14gpu7k80VO38cDM/eFigsVQq1q4AqL2+u1fkoco2pPEtlnJNJ3Q/bzTc4jbPhGMrVYx7wKDz73zKTz/S/I8I0L7vGiVL6LytH/xG5lDDTAdS261vv3K0SRSwF0sMOv55/lpxeYAFfyBza5Wp6Pq3pcnmMWX6ouEYluwTPjDRFq+vR3ISMpD1Icm8Y7XLMF6CGBs4VHDyo6R+lBxWFRYD5hCXOsH3ZNQ90DmbTBjgJ8+74ZZh2WU0687hQGONnhOlJvaIs5N88vsxEEvVPvMmU3k7ZjkJDsspFlP7fBIvsUdOL04zKS9zaaPJtqrVMH+6oyZaFs1khPW3z0/heHQpXQH4bGOLMqYY39hAb4Wo1aufi7aqkCPivA7SzlVwvH6FE+HW7iXLFPr9yUTgP5LKNBUy0hfHZHFTafXZjMgKcw+q0YHiOAwJIYcOKwiSzVlHhOIlclBlFULlfvgD4Uo+Z6uJJrykXjHagUqYNfJZqQg4SuJy89heZCXgk0jy+0vdG0TJ7k/IvdbRPiUHW9Mgfa2YNDH3DKMN9t5nQFqIuyHUtvaqZq8VX85Eqy7wHAhKNItzXBkCJnGkqt8GExdy2UUVznYnkWfwHDf3ePNRpe9nAA4Twazx+d9RV1OXMOWLr19FX6SdP82VWLIMbvqVFHHkl9ZvZAWka5U+GDadcr5pdTd7YKQLsR60yQHj0hM0s74n5MjJNxBoiTNXLq8QO 44RmY3iX 3jtvQSIpRWhxYUNf6B6U3DVlyGi/SREwVH+hOYvXAo1wXuE3ycYMzt0dN8ZTZ186jdyedbJvs4uvdac/2bc3SDYc6gKQl1z/Cqai882JC+47/lZp6h9iOaQbkaAJrDjWomabot+6LO3zl2ndotTLuIp1FbG+13TcAMUy09HAF37MbGS433ruUh2xq3cHRMkaMMVtkCTqg3+U0LwAKrH5JZBOLj0xs03YxLUGXSKQHLN0Q2v4ul5NUWPqgn0jQjQe3YlaakkD73MaHB6Ph+cfajby5CST/pq+zWCChW6zlLEylE8eb2z8QiaBPD5mEYBqWCP7Z0uyk4TRV7P4O+ZGYixyoV17hzf6DJsAa/yqOeXkPE+eEB8r0eMgE0BW6thmwIVEDQGe8sjbmw1pEHss4o7Pvw/LZonxKNEQlAF8y5Qf+m4/sN3zeEDYCmTY6x6+9HQPL6/ZKXN493BjggYzJajR0p+ZZ4SwsUuSk8RaeqZDNXaA2QmIlXfszHg== 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: __vmalloc_area_node() may call free_vmap_area() or vfree() on error paths, both of which can sleep. This becomes problematic if the function is invoked from an atomic context, such as when GFP_ATOMIC or GFP_NOWAIT is passed via gfp_mask. To fix this, unify error paths and defer the cleanup of partly initialized vm_struct objects to a workqueue. This ensures that freeing happens in a process context and avoids invalid sleeps in atomic regions. Signed-off-by: Uladzislau Rezki (Sony) --- mm/vmalloc.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 5bac15b09b03..2eaff0575a9e 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3677,6 +3677,36 @@ vm_area_alloc_pages(gfp_t gfp, int nid, return nr_allocated; } +static LLIST_HEAD(pending_vm_area_cleanup); + +static void cleanup_vm_area_work(struct work_struct *work) +{ + struct llist_node *node, *next; + struct vm_struct *vm; + + llist_for_each_safe(node, next, llist_del_all(&pending_vm_area_cleanup)) { + vm = (void *) node - offsetof(struct vm_struct, next); + + if (!vm->nr_pages) + free_vm_area(vm); + else + vfree(vm->addr); + } +} + +static DECLARE_WORK(cleanup_vm_area, cleanup_vm_area_work); + +/* + * Helper for __vmalloc_area_node() to defer cleanup + * of partially initialized vm_struct in error paths. + */ +static void +defer_vm_area_cleanup(struct vm_struct *area) +{ + if (llist_add((struct llist_node *) &area->next, &pending_vm_area_cleanup)) + schedule_work(&cleanup_vm_area); +} + static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask, pgprot_t prot, unsigned int page_shift, int node) @@ -3708,8 +3738,7 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask, warn_alloc(gfp_mask, NULL, "vmalloc error: size %lu, failed to allocated page array size %lu", nr_small_pages * PAGE_SIZE, array_size); - free_vm_area(area); - return NULL; + goto fail; } set_vm_area_page_order(area, page_shift - PAGE_SHIFT); @@ -3786,7 +3815,7 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask, return area->addr; fail: - vfree(area->addr); + defer_vm_area_cleanup(area); return NULL; } -- 2.39.5