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 CC133C19F29 for ; Thu, 4 Aug 2022 01:19:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3294F8E0002; Wed, 3 Aug 2022 21:19:51 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2D7E78E0001; Wed, 3 Aug 2022 21:19:51 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1F7388E0002; Wed, 3 Aug 2022 21:19:51 -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 0F57C8E0001 for ; Wed, 3 Aug 2022 21:19:51 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id D7D7C4027A for ; Thu, 4 Aug 2022 01:19:50 +0000 (UTC) X-FDA: 79760153340.02.487648E Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by imf08.hostedemail.com (Postfix) with ESMTP id CC31B160030 for ; Thu, 4 Aug 2022 01:19:49 +0000 (UTC) Received: from canpemm500002.china.huawei.com (unknown [172.30.72.54]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4LyrRH0N2SzjXNK; Thu, 4 Aug 2022 09:16:43 +0800 (CST) Received: from [10.174.177.76] (10.174.177.76) by canpemm500002.china.huawei.com (7.192.104.244) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.24; Thu, 4 Aug 2022 09:19:46 +0800 Subject: Re: [RFC PATCH] mm/memory-failure: release private data before split THP To: Yin Fengwei CC: , , , , , Matthew Wilcox References: <20220803025243.155798-1-fengwei.yin@intel.com> From: Miaohe Lin Message-ID: <410bb7b3-db57-47a9-f97c-1e3441aadb23@huawei.com> Date: Thu, 4 Aug 2022 09:19:45 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [10.174.177.76] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) To canpemm500002.china.huawei.com (7.192.104.244) X-CFilter-Loop: Reflected ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1659575990; a=rsa-sha256; cv=none; b=gB55fBN6+x7IVN+skXOOKHLnyCoYcdVLZYCwE7twOnIoz/Hv8e+Maer1aUjJORbLgBGTnA XPUYDp/6g0LNm5Jq0H5awi6WO7TKskGM+foPPZnmDwlakvx765HHb2lZl/3Sc/oVNOOQe2 E96fs8iz9g3LiGCUYyvOSNykvCKWoC0= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=none; spf=pass (imf08.hostedemail.com: domain of linmiaohe@huawei.com designates 45.249.212.187 as permitted sender) smtp.mailfrom=linmiaohe@huawei.com; dmarc=pass (policy=quarantine) header.from=huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1659575990; 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; bh=+JwFs9GJx3YZ4gknrcbcOru25/Hadf/ZEJvy878KOKA=; b=uqLCCKg+/3yusvjc8F/uI0BWoNqWsa9mn0krWx59kF3qD8z/9FAZxfqya33g9TiUpQefks oD5Q5n8BcJQOXExXKIT6IBxLSvUmGhac790dAhe5HQNWVsfFdVmgZx/+iHAHvjYK0XR7Tv Yud/xCNO0PXuV56QzOh2ZS+NG0WjIjc= X-Stat-Signature: motfnwgeqc9wzztipohxrrqh4hiwa3nn X-Rspamd-Queue-Id: CC31B160030 Authentication-Results: imf08.hostedemail.com; dkim=none; spf=pass (imf08.hostedemail.com: domain of linmiaohe@huawei.com designates 45.249.212.187 as permitted sender) smtp.mailfrom=linmiaohe@huawei.com; dmarc=pass (policy=quarantine) header.from=huawei.com X-Rspam-User: X-Rspamd-Server: rspam05 X-HE-Tag: 1659575989-531947 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: On 2022/8/3 21:01, Matthew Wilcox wrote: > On Wed, Aug 03, 2022 at 10:52:43AM +0800, Yin Fengwei wrote: >> diff --git a/mm/memory-failure.c b/mm/memory-failure.c >> index da39ec8afca8..08e21973b120 100644 >> --- a/mm/memory-failure.c >> +++ b/mm/memory-failure.c >> @@ -1484,7 +1484,16 @@ static int identify_page_state(unsigned long pfn, struct page *p, >> >> static int try_to_split_thp_page(struct page *page, const char *msg) >> { >> + struct page *head = compound_head(page); > > + >> lock_page(page); >> + /* >> + * If thp page has private data attached, thp split will fail. >> + * Release private data before split thp. >> + */ >> + if (page_has_private(head)) >> + try_to_release_page(head, GFP_KERNEL); >> + >> if (unlikely(split_huge_page(page))) { >> unsigned long pfn = page_to_pfn(page); > > It seems a shame to use the old page approach instead of the > shiny new folio approach. We're quite close to being able to remove > try_to_release_page() in 6.1 or 6.2 so adding a new caller is a bad idea. > How about this: > > diff --git a/mm/memory-failure.c b/mm/memory-failure.c > index da39ec8afca8..765b383288b1 100644 > --- a/mm/memory-failure.c > +++ b/mm/memory-failure.c > @@ -1484,16 +1484,21 @@ static int identify_page_state(unsigned long pfn, struct page *p, > > static int try_to_split_thp_page(struct page *page, const char *msg) > { > - lock_page(page); > + struct folio *folio = page_folio(page); > + > + folio_lock(folio); > + if (folio_test_private(folio)) > + filemap_release_folio(folio, GFP_KERNEL); If filemap_release_folio fails, we could avoid trying split_huge_page here? > if (unlikely(split_huge_page(page))) { > unsigned long pfn = page_to_pfn(page); > > - unlock_page(page); > + folio_unlock(folio); > pr_info("%s: %#lx: thp split failed\n", msg, pfn); > - put_page(page); > + folio_put(folio); > return -EBUSY; > } > - unlock_page(page); > + folio = page_folio(page); Above line (re-fetching folio) might need a comment to avoid future confusing ? Anyway, this patch looks good to me. Thanks for fixing. > + folio_unlock(folio); > > return 0; > } > > . >