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 19182C83F1B for ; Wed, 16 Jul 2025 15:37:42 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id AD1888D0002; Wed, 16 Jul 2025 11:37:41 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A82AE8D0001; Wed, 16 Jul 2025 11:37:41 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 970ED8D0002; Wed, 16 Jul 2025 11:37:41 -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 81D6F8D0001 for ; Wed, 16 Jul 2025 11:37:41 -0400 (EDT) Received: from smtpin19.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 23B261403AB for ; Wed, 16 Jul 2025 15:37:41 +0000 (UTC) X-FDA: 83670532722.19.A438AC5 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) by imf01.hostedemail.com (Postfix) with ESMTP id 2F07E40012 for ; Wed, 16 Jul 2025 15:37:38 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=suse.com header.s=google header.b=JwY8fhql; dmarc=pass (policy=quarantine) header.from=suse.com; spf=pass (imf01.hostedemail.com: domain of ydfan@suse.com designates 209.85.221.43 as permitted sender) smtp.mailfrom=ydfan@suse.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752680259; a=rsa-sha256; cv=none; b=pdHOSt7IRdrGi7ODVGdYuOe0/j2a0NjpWVcIa3IQUsqjsZuVbU9Dd6ESOZAOm1kjP5B9tN t+3uST4fB6xoKuIawgN8OabpkD/VBPUe/5CT1Lt6+7bqO2U2yz5+036em65t0gzDC3Ynea xXqeZBHhYIEc6UkLEMAQAzv/DQhn7pI= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=suse.com header.s=google header.b=JwY8fhql; dmarc=pass (policy=quarantine) header.from=suse.com; spf=pass (imf01.hostedemail.com: domain of ydfan@suse.com designates 209.85.221.43 as permitted sender) smtp.mailfrom=ydfan@suse.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752680259; 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:content-transfer-encoding:in-reply-to: references:dkim-signature; bh=DhScTCoErajgRG+SgtPz3ozjBNcUDPb2j8tb3iyak8A=; b=bLuDyi+BuRveYyVmcrxHr4VoR0Zs4F1kG+KSiLQwHCdEiDRrv4V4XT/kjMFiRSIczxjX5r +t/w3w9b1qZuX3SQVii9TlEela+CSTlrhiRulYvOJahhP02SotkvfbkAK42184L6FpRr74 H/QSBbYsC1Tl4TCgfSyzx8faEwV0zzE= Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-3a6f2c6715fso5268863f8f.1 for ; Wed, 16 Jul 2025 08:37:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1752680257; x=1753285057; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:from:content-language :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=DhScTCoErajgRG+SgtPz3ozjBNcUDPb2j8tb3iyak8A=; b=JwY8fhqlnsk308UGnOeWfIXzr2u3GjZ1AjPKg0recr554fnY1xv8fHT9AdZh4zZCwT EqbwfJ1K6X9pw7t9luPfRQvgdx8bAFCTVbvvviC9Bga1u0seWDNUBnUdzOBYsI/5Ib65 cpCInJFJQG8oraw9E8wJCcANKEF19eO2VoCaDHoRUY2nknhgnnh5T8Bw0ZH0xXScuKTW k0QpxmyFhu/w1hbXHvbnJJCxBPT/ChES0GQgAYisf7+Y5qScXGk9kTHEqkWfgb5r7sp9 BHU3/AanJiNW91EN4WQlkXwTXzsFNmw6yyFgQRZpDgO3bH/UHBLdMSgDZ7Eov08f+Ddv ttwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752680257; x=1753285057; h=content-transfer-encoding:cc:to:subject:from:content-language :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=DhScTCoErajgRG+SgtPz3ozjBNcUDPb2j8tb3iyak8A=; b=W76iixVm/QCFOLJggW30hxI9yT68EHdjgUAtgQDZGfKZ9Qnd1BNXXAQoAu+iAq0n0d k2b6+Ll3S8KUkG0gW6yBrKmLjXinOjCM5YMPzC/bSdkvRN7f4XOzmMT6x5GJAUwJVwhD i92oQOAKqq0UaMX7uB0QQlVfHH8tGwnBClBL6ISqG5OAxCk8AyyrQoer1ef6Ts4pE9nX EQBuXKdtBgjTOhKrRbJKcchZZSweQcLmGdQNR67Cc9fkiEsQNSOMaTBrbwtbaNlqKWut j+XEJ2cSn/766KpXg0+MSNeHaRD1M3fZY0UxX80GJka8rMC+TTjg41FZv2DCxmrs98N5 DMdA== X-Gm-Message-State: AOJu0YxOumRz4uSEL+pOdEZ7Pe8wSXY1RJUBWzUkHfFLpNZJSXCyhj1+ rfql9/Wcr2jQP23njOYQAKQz9LIaWzLU36egFUwEjwfCuWxOF0YcnnI8h9ixtCWAFLdgXZkQxGw QPNsnoVE= X-Gm-Gg: ASbGncswBAl1gu3efNU2IakrzWOqfXlmYX41sAx4G5PViNfgMezJov/CxEWix3Del7E bs2MO2dgVewxNWOYftmcExapaHbYihgCvDsL1in7GdgyOaBouwCkddmfhzfKQi/D605DA0wZ+QI 8bToI+GUjA5/7jf7vMUCGN9bOQR0r8Vi5xJSU0FGfSe9oN+FXjDeE350srhTmGbV5ZxvnCMp4gn NITPmbQ0kUPq2VqXJ2A9kOWcGWGww6BW4N2vtKCtvDYaPM9V46ebLzi0gMokWyOCO1jeIePCALh CSgMh1AzzoiKaToQPxj8DlmQcB+V/Uci/gxvjF2ZXlCp337AJlce8zl36H8azw5bkOspIw9B4ah sZ4PlABztMnjcVsAhq+w= X-Google-Smtp-Source: AGHT+IHu/GomoSnqAuI86F6j7vvKxYcamd6VYGJr+0QFP2hBnU9ssYS0FmhVUx2PlFDgd/E5fDZtaA== X-Received: by 2002:a5d:64ee:0:b0:3a6:ec1d:1cba with SMTP id ffacd0b85a97d-3b60e4c1e24mr2900002f8f.20.1752680257442; Wed, 16 Jul 2025 08:37:37 -0700 (PDT) Received: from [10.211.55.30] ([103.172.41.206]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-23de434d6b0sm131110635ad.203.2025.07.16.08.37.34 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 16 Jul 2025 08:37:36 -0700 (PDT) Message-ID: <8c0cdb71-8d21-497e-b793-c43ce3a16345@suse.com> Date: Wed, 16 Jul 2025 23:37:30 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US From: Yadan Fan Subject: [PATCH] mm: mempool: fix wake-up edge case bug for zero-minimum pools To: akpm@linux-foundation.org Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Stat-Signature: 1b6gd8o77r64d4wkatuc11kppe1w1suw X-Rspam-User: X-Rspamd-Queue-Id: 2F07E40012 X-Rspamd-Server: rspam02 X-HE-Tag: 1752680258-922826 X-HE-Meta: U2FsdGVkX18pcXw+3av2JAJbP6X5R9uocxlJT3QQFMA18S5P/nqV+b3d9vb8+2AbHVFo97EBvRk+eAFMS7BSzKpXDch7nCNv3ie0Sfld65uJt4E6CjX06zSF9Wbd/V05ZCnPOmtEBRt7+q/ePwv0YlKQ72S/0/VRpYCILV98HTe5kbksu1zG7XekcZr1r71xv8tVyRbc9CMycY8DZEmfGSdaElQChWzpAR0EEWKVxqETSZrpZMNIdPHpxcsZYcgsKkYzoXhsX51Zz4Ai9kbqw1AOho9FjvePXVAXVgzVbnwOsSFzULNLD2UlzmJafReWcp6htVQ7TXVF8VCN+4PBFGrosM4age7vHgtQOGb6Bi7IscYLGQBmZeqBLvciBPG2dpggdpAFs4cBHHQDfwFvabnIm/aqPm06+lJrBznRTU0uUL4ulObVJyCjmZ740oaCWb/1W9VgCO1GHv5zFvEcZT+ZfB8zf/zSRs3rlY0AUel2XT+XAAD8lcm+t1Su5hsTfPOdH+edRj28SaIkM003UHJWaR0aBjypqZgXkzBWd1+lVgrRwLiSbIcBzszF8VNdhE/oktTsCOpMrcRN+h4qV5pu83LEufgkYR5LuMEsE32W5lPtuWR3yC4llJRRBXXhnYdezdYvZ9RYYOWH2n7RFtoMhqQ47JjZIxegzHPrx9lWhuBStEOIFoRoxJ5D1e7hE6CbEuoxxaQrelCvUocpY/UvEHZVkGR1J8Z5EAKg7WbT7da15UKDY/ynJPj/zsKyi4lKLDlXTNif9twDoXZLsH3UrGztWOcd78JGh+MxqN1bUnD0d6uMBRV5QD7AJcVpxGYdVUYY4m4P4EzTBcW7sC+vBL2kLZ9HPBvgzB8btI9Tu3kO+XnU4YYImi7uWaakIEYNGIGIFq2i8Zc89VDQbdJyL+EteeRerG4be4qi2PvW51J/tZW6KYY46nYAC6xWIuPUEgpeswV6T5w+LCm EEn4sqW8 WiNDmHJ5vmH+HNij3PZi7EDtOdUK/pBGAY8XXycQaa1jFsdaxNgFtsdgUi97RWPfV8BjVqdbZjvoPOAA81dd/73xuF275/INn4gPulq5SIK2CKPIIlXx8KvW7f7TRKHNuPGDvGCsl+ZkaK/z8gou3W8BnVWFTHgq2+P6o337Qwzo4BFOW7dgNxj5l5kc2wUikYH/MzZpLPIxIzUwNUvsliJ6ripYTE5K7VNazoqBTogqPw0PA/ZS/iFW93a5TjUQDpaxk5991qmQBT4ZTxjYb1Fil6Eb4K0JhjNT8zhWdURB0lKB7srwXRNIkWDVE5QiObBVuQS29njeRqHLQH59cFkYyWi64qlniKcCmmNJI3HbqOVziQ0sWWFZ75CJ9+xelDU35vytPXL2A5Dy6h5FMqSggTg== 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: The mempool wake-up mechanism has a edge case bug that affects pools created with min_nr=0. When a thread blocks waiting for memory from an empty pool (curr_nr == 0), subsequent mempool_free() calls fail to wake the waiting thread because the condition "curr_nr < min_nr" evaluates to "0 < 0" which is false, this causes threads to sleep indefinitely. There is at least 2 places where the mempool created with min_nr=0: 1. lib/btree.c:191: mempool_create(0, btree_alloc, btree_free, NULL) 2. drivers/md/dm-verity-fec.c:791:    mempool_init_slab_pool(&f->extra_pool, 0, f->cache) Add an explicit check in mempool_free() to handle the min_nr=0 case: when the pool has zero minimum reserves, is currently empty, and has active waiters, wake them up. The wq_has_sleeper() avoids unnecessary wake-ups when no threads are waiting. Signed-off-by: Yadan Fan ---  mm/mempool.c | 16 ++++++++++++++++  1 file changed, 16 insertions(+) diff --git a/mm/mempool.c b/mm/mempool.c index 3223337135d0..803f8853e0f1 100644 --- a/mm/mempool.c +++ b/mm/mempool.c @@ -545,6 +545,22 @@ void mempool_free(void *element, mempool_t *pool)                 }                 spin_unlock_irqrestore(&pool->lock, flags);         } +       /* +        * Handle the min_nr = 0 edge case: +        * For zero-minimum pools, curr_nr < min_nr (0 < 0) never succeeds, +        * so waiters sleeping on pool->wait would never be woken by the +        * normal wake-up path. This explicit check ensures that when +        * pool->min_nr == 0 and pool->curr_nr == 0, any active waiters +        * are properly awakened. +        * The wq_has_sleeper() avoids unnecessary wake-ups when no +        * threads are waiting. +        */ +       if (unlikely(pool->min_nr == 0 && +                    READ_ONCE(pool->curr_nr) == 0 && +                    wq_has_sleeper(&pool->wait))) { +               wake_up(&pool->wait); +       } +         pool->free(element, pool->pool_data);  }  EXPORT_SYMBOL(mempool_free); -- 2.50.1