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 12C21C2BD09 for ; Wed, 3 Jul 2024 09:46:34 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2C3F96B0085; Wed, 3 Jul 2024 05:46:34 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 274B96B0088; Wed, 3 Jul 2024 05:46:34 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1152F6B0089; Wed, 3 Jul 2024 05:46:34 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id E7A806B0085 for ; Wed, 3 Jul 2024 05:46:33 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 4D4A9160A24 for ; Wed, 3 Jul 2024 09:46:33 +0000 (UTC) X-FDA: 82297961466.13.5421D53 Received: from mail-yb1-f177.google.com (mail-yb1-f177.google.com [209.85.219.177]) by imf01.hostedemail.com (Postfix) with ESMTP id 76B674001E for ; Wed, 3 Jul 2024 09:46:31 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="Y8OL/fv5"; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf01.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.219.177 as permitted sender) smtp.mailfrom=21cnbao@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1719999972; a=rsa-sha256; cv=none; b=i22hwNIuPbaqkuCiHQXAwT8V04xvYg8jKZmw5+FTRk/5hXTpxgW5ETfnt+y+GGO3iHkiba 06VulEHPVGkgqbOq0YGs2TPyz/PVYOepp2OASwj8Kb0S+wYK7Mo3grqqVcb9Laic68u+3m Uuh5iDatf2qmO0CmNuZrUggG1Kg7WgE= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="Y8OL/fv5"; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf01.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.219.177 as permitted sender) smtp.mailfrom=21cnbao@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1719999972; 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:in-reply-to:references:references:dkim-signature; bh=VtEhPZzFC3WYUCzkzU+BMtXUO+QJbt1cXqLAXxOunD8=; b=QBHUtPNFvKGg0o1znhmvUkFLz0D3qu3ZGsSDDnIvE4MNIlvF+oqWxnc9C9wRQfnRtUt9Sy 53YF0T9v1e1skyGOZLTy06hkUc+YMVxJ4iDIPuEBwnsLYPKZu525RchuO3Ao0MrKmi1e/F Us9/mHhwkRVg+qUQFVi4optAnKgvAlM= Received: by mail-yb1-f177.google.com with SMTP id 3f1490d57ef6-e0360f8901aso4645411276.2 for ; Wed, 03 Jul 2024 02:46:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719999990; x=1720604790; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=VtEhPZzFC3WYUCzkzU+BMtXUO+QJbt1cXqLAXxOunD8=; b=Y8OL/fv5X0Vd/K7QYwLlY8VPqoMRQw1iUyuk/yC4YOcOoXbSv6jY4caN3T0fA+XFU1 cPoUJnmxmfBPwWBM6EeOgcaK/Ba/5znf/bZfZ2PirniypmWDqzFEl+E4GOoz7PMIWXb2 wQ2kddgJ127T/STiiIsDM/R1+2+fCwEYEa1Er/AoDdHHUWxdNQIgfIjWSY7+1UZrBZ/4 VxEfPz6AgM4mIB6CBjcCwF5HAMEFczVs9zQKFOu+lw8nRVXe4Iuv2ZlH9R1fuPTDzFOV vMpOejsPsm7f0ILxi/Wpsr36LEH8OvPO6GiaAhVvYw4C8xudERvaaJXVE/NoILULOYXw JrYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719999990; x=1720604790; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=VtEhPZzFC3WYUCzkzU+BMtXUO+QJbt1cXqLAXxOunD8=; b=DW88VMFU/+mbzng30zYFqAz3z4nUcKgA3i5itIfpeGZoaJqPefG2opzh0uxemMNTNq YgPhpVVWSVnjE/cWm0AMxy93wU78/iN1XmI7EI0j7vFAyjaGOBtV/6/i698u0y0p28cE o8HLz1cIHRAkcKkqe5z6UcrUV4ZTG7RY05jyGPFKiGydvW4ywsekG915zPix3IS7Kw5T YlCc1H0K0sAIbSHwh84u1BvdYwAZ4lyR7C6YkPKsN3OYc7KrMP2nsIF6uVrKGk5jwl6K rodH6QTtL9ixbAdgKWRV2RQ/GhCn/o6RDtBzOUpfpvdtpmjs0j9EbMrqn2QOXHq80XOv /zZA== X-Forwarded-Encrypted: i=1; AJvYcCUxUzLMPxVhhK7yhnI5yuFViWTUmndgC1AKHGLYIuN223wABcutcdw4i31/NFMVytxNdYc73pFgsPEHWezeiFA6oss= X-Gm-Message-State: AOJu0YyDKZVjUJ9R7ZdyfPaKx9E3mRfS0nfkd2ZEoIMFVQ8ok8a9NIGO Zd27wgpfB65Byfn8ED/n9v2EZJXagQT9THYsd6iXnjbwlx5Kt/ADfwA61qZNdUaTsnyMK3cbnEe c3JaTw4XQCGH/x689P5oqZ+jpl7w= X-Google-Smtp-Source: AGHT+IFN6fJQ9FxDMTyB8AfK32sF4RcKcTiuXHuahStmF3o94VAYMckaMoXyAs7LTUHzEjZuWyRrspjYyMGCS3OXBkA= X-Received: by 2002:a25:e089:0:b0:dff:338e:4f6 with SMTP id 3f1490d57ef6-e036eaf9069mr10571411276.5.1719999990222; Wed, 03 Jul 2024 02:46:30 -0700 (PDT) MIME-Version: 1.0 References: <1719038884-1903-1-git-send-email-yangge1116@126.com> In-Reply-To: <1719038884-1903-1-git-send-email-yangge1116@126.com> From: Barry Song <21cnbao@gmail.com> Date: Wed, 3 Jul 2024 21:46:19 +1200 Message-ID: Subject: Re: [PATCH V2] mm/gup: Clear the LRU flag of a page before adding to LRU batch To: yangge1116@126.com Cc: akpm@linux-foundation.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, david@redhat.com, baolin.wang@linux.alibaba.com, liuzixing@hygon.cn Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 76B674001E X-Stat-Signature: 3uwcaigka5cbd9ojwjg5uc5mbz6sjjwe X-Rspam-User: X-HE-Tag: 1719999991-903907 X-HE-Meta: U2FsdGVkX1/hyiXb25FXgVAsKNg3frXeQICrX4DEOXgrQ7ItJ18KDdRs8kizOPSIL5v+p0Ps11Bf/cX5xmChKVN+3fS0hz+fx5nYyfnSnzP7jCOkOU3mNfsb0Wls/FR4LRf6VuQxEWVGaNM2D/R36XTkeiXpy0nMQkM64I/Pb6iE9fAR8LWS2JpEEyF4dmk3GGs+gdZIWVlZC2jmXzvO7cL4raB7qj95bs/brOoNLQASnCAA38dRPt6w00/8XfHjZ6JJe0dgOPYjG9PAro1VBk93GdV6+5zNFJ9njCfqYO2AOPQG3TmY2qWlFscOf5Dkyo/GP2FEGFotC3nw37FYbBSJ4sqIFzWGg3XLBEW3CTIG6cFlPr19j4EHtb0D1Kp0gPiDvhqj9hqwkz8T0JRm8p3+xRqvliLXy5WjA5ki2St8zAD33Hx3J75qbyaBU7BFyeZzfGSEs60fULxuTFDUCaNLp7rmprLCSsRhbm1u5aGyUuLM1iJv5NqZdHR/h+e4WCi03PKMF1ACM+KUHZ8jGOCQgoQa9SBk9KTCpZY2idccJrEJettYPlNqxh9E03ao+3wxm4e7EOFC1Cwk56B9bAlSSMWRD/5WCGz71eYkccL3GHmp1alCVqEntppcCX3NLbHCToz0IMb5ZmX3ffDeGyOyJthNA3Lb965vC6oP6GuthQlV6m+w/0IG+LZtWGvm16dIgplTAVIBdFFcALqPIjg5y1Hy5F7Uudt66aXi40QrKxXXMmJij1L9+JUUZ1EP+kAJX7Nyg7n1yzmoz235A8zjRBnwjDS+aF0/R5l1IYwS4B0e8xSLmRXPbiMQt1yFz6FFPIe+n/YAPUSNJgbQNdR4XgmK/A4/NmZv99+25plpBMcaMv42Mzl6P5kZsBARGhYa4kCzU+RzT07CLeD7Vw5tbeGhSBxQu4xy9EzJGqGTi3Ffjzxov8q6iLwusNVww/sWL402egrHIYt7nch dYa/AoU0 ebGDdaE12a4HSNHU4LabtT7hSgnoK4C5TKDcQANz0dBiUMtGui+r7mvXrkC5+yLeCqkFFX/sV+x+6MJchF5w+SBIiB9ykrlqaI7QO063dVS6HhXg5EmAaBMBwcV/EhTV/fEWzchnwRBk3nqH23BOJ4hkgz3ebLNvB/AX7pP7wChs5JLlVlZKw1Acbe42G0DeDl2X0atDmYl/oO00o5VBs4LxdpHV44rf+NZG7tZLq4h2j8jJ/Vr0TAQM9pCNM8Yy8EyzSsnohJl2OSQRYfS/S9/pwaVrJz/If9aN6hpy0wWEXg1i/RWIMc2HGyiwpWo413cbf7B9EZdlkY9KE2/ePebwkG0PQWWOTGVrZrx1eT1ELefyt+KCqRzBkNLe6RwF8nrHZCIV4VRHVVrGLD71R2Tn7ZA== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000041, 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 Sat, Jun 22, 2024 at 6:48=E2=80=AFPM wrote: > > From: yangge > > If a large number of CMA memory are configured in system (for example, th= e > CMA memory accounts for 50% of the system memory), starting a virtual > virtual machine, it will call pin_user_pages_remote(..., FOLL_LONGTERM, > ...) to pin memory. Normally if a page is present and in CMA area, > pin_user_pages_remote() will migrate the page from CMA area to non-CMA > area because of FOLL_LONGTERM flag. But the current code will cause the > migration failure due to unexpected page refcounts, and eventually cause > the virtual machine fail to start. > > If a page is added in LRU batch, its refcount increases one, remove the > page from LRU batch decreases one. Page migration requires the page is no= t > referenced by others except page mapping. Before migrating a page, we > should try to drain the page from LRU batch in case the page is in it, > however, folio_test_lru() is not sufficient to tell whether the page is > in LRU batch or not, if the page is in LRU batch, the migration will fail= . > > To solve the problem above, we modify the logic of adding to LRU batch. > Before adding a page to LRU batch, we clear the LRU flag of the page so > that we can check whether the page is in LRU batch by folio_test_lru(page= ). > Seems making the LRU flag of the page invisible a long time is no problem= , > because a new page is allocated from buddy and added to the lru batch, > its LRU flag is also not visible for a long time. > > Cc: you have Cced stable, what is the fixes tag? > Signed-off-by: yangge > --- > mm/swap.c | 43 +++++++++++++++++++++++++++++++------------ > 1 file changed, 31 insertions(+), 12 deletions(-) > > diff --git a/mm/swap.c b/mm/swap.c > index dc205bd..9caf6b0 100644 > --- a/mm/swap.c > +++ b/mm/swap.c > @@ -211,10 +211,6 @@ static void folio_batch_move_lru(struct folio_batch = *fbatch, move_fn_t move_fn) > for (i =3D 0; i < folio_batch_count(fbatch); i++) { > struct folio *folio =3D fbatch->folios[i]; > > - /* block memcg migration while the folio moves between lr= u */ > - if (move_fn !=3D lru_add_fn && !folio_test_clear_lru(foli= o)) > - continue; > - > folio_lruvec_relock_irqsave(folio, &lruvec, &flags); > move_fn(lruvec, folio); > > @@ -255,11 +251,16 @@ static void lru_move_tail_fn(struct lruvec *lruvec,= struct folio *folio) > void folio_rotate_reclaimable(struct folio *folio) > { > if (!folio_test_locked(folio) && !folio_test_dirty(folio) && > - !folio_test_unevictable(folio) && folio_test_lru(folio)) { > + !folio_test_unevictable(folio)) { > struct folio_batch *fbatch; > unsigned long flags; > > folio_get(folio); > + if (!folio_test_clear_lru(folio)) { > + folio_put(folio); > + return; > + } > + > local_lock_irqsave(&lru_rotate.lock, flags); > fbatch =3D this_cpu_ptr(&lru_rotate.fbatch); > folio_batch_add_and_move(fbatch, folio, lru_move_tail_fn)= ; > @@ -352,11 +353,15 @@ static void folio_activate_drain(int cpu) > > void folio_activate(struct folio *folio) > { > - if (folio_test_lru(folio) && !folio_test_active(folio) && > - !folio_test_unevictable(folio)) { > + if (!folio_test_active(folio) && !folio_test_unevictable(folio)) = { > struct folio_batch *fbatch; > > folio_get(folio); > + if (!folio_test_clear_lru(folio)) { > + folio_put(folio); > + return; > + } > + > local_lock(&cpu_fbatches.lock); > fbatch =3D this_cpu_ptr(&cpu_fbatches.activate); > folio_batch_add_and_move(fbatch, folio, folio_activate_fn= ); > @@ -700,6 +705,11 @@ void deactivate_file_folio(struct folio *folio) > return; > > folio_get(folio); > + if (!folio_test_clear_lru(folio)) { > + folio_put(folio); > + return; > + } > + > local_lock(&cpu_fbatches.lock); > fbatch =3D this_cpu_ptr(&cpu_fbatches.lru_deactivate_file); > folio_batch_add_and_move(fbatch, folio, lru_deactivate_file_fn); > @@ -716,11 +726,16 @@ void deactivate_file_folio(struct folio *folio) > */ > void folio_deactivate(struct folio *folio) > { > - if (folio_test_lru(folio) && !folio_test_unevictable(folio) && > - (folio_test_active(folio) || lru_gen_enabled())) { > + if (!folio_test_unevictable(folio) && (folio_test_active(folio) |= | > + lru_gen_enabled())) { > struct folio_batch *fbatch; > > folio_get(folio); > + if (!folio_test_clear_lru(folio)) { > + folio_put(folio); > + return; > + } > + > local_lock(&cpu_fbatches.lock); > fbatch =3D this_cpu_ptr(&cpu_fbatches.lru_deactivate); > folio_batch_add_and_move(fbatch, folio, lru_deactivate_fn= ); > @@ -737,12 +752,16 @@ void folio_deactivate(struct folio *folio) > */ > void folio_mark_lazyfree(struct folio *folio) > { > - if (folio_test_lru(folio) && folio_test_anon(folio) && > - folio_test_swapbacked(folio) && !folio_test_swapcache(folio) = && > - !folio_test_unevictable(folio)) { > + if (folio_test_anon(folio) && folio_test_swapbacked(folio) && > + !folio_test_swapcache(folio) && !folio_test_unevictable(folio= )) { > struct folio_batch *fbatch; > > folio_get(folio); > + if (!folio_test_clear_lru(folio)) { > + folio_put(folio); > + return; > + } > + > local_lock(&cpu_fbatches.lock); > fbatch =3D this_cpu_ptr(&cpu_fbatches.lru_lazyfree); > folio_batch_add_and_move(fbatch, folio, lru_lazyfree_fn); > -- > 2.7.4 >