From patchwork Thu Jul 27 11:56:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miaohe Lin X-Patchwork-Id: 13330022 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 EE5CEC0015E for ; Thu, 27 Jul 2023 11:57:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C60F36B0074; Thu, 27 Jul 2023 07:57:01 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BE99F6B0075; Thu, 27 Jul 2023 07:57:01 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AB1B06B0078; Thu, 27 Jul 2023 07:57:01 -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 81D266B0075 for ; Thu, 27 Jul 2023 07:57:01 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 41F16C04A9 for ; Thu, 27 Jul 2023 11:57:01 +0000 (UTC) X-FDA: 81057240642.16.89C54C8 Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) by imf20.hostedemail.com (Postfix) with ESMTP id 9379E1C0009 for ; Thu, 27 Jul 2023 11:56:58 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=none; spf=pass (imf20.hostedemail.com: domain of linmiaohe@huawei.com designates 45.249.212.189 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=1690459019; 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=MvyH4AFrYOxo0odqqElQhuARJ/c2riZFZSUjGAvlpN0=; b=y0ZGShTbD0OasdZcqavOYiwhyhjaYwSOpHefNTUAKl17rYYDMa6D+WdCQxZDulbf5pCWzw ddqd6q/etFFXQwhYyM9yMGcyYVuipDuoxejPAkLqSDK5tvkcay5wh4wUVnabDybdV3Y9m7 PgBlNcD40ZHcRL5rMyObF62rrhi0gYY= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1690459019; a=rsa-sha256; cv=none; b=LQ4VWgTSc8xhbsMrlEva6u/vbKoAyMsYtik4AzC+faiPJyON7xvE6c6N6ASFhtwfCO60Og iDWLXwIhdl0lNC+1/VGcl4AlYALowVrMRoMlyB6KjOXNxlX4zrvOtQso2C7Kiz8kJtMBEr 0ZBmOmrK2aHJjMeaivdZ+EnrBW9dV70= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=none; spf=pass (imf20.hostedemail.com: domain of linmiaohe@huawei.com designates 45.249.212.189 as permitted sender) smtp.mailfrom=linmiaohe@huawei.com; dmarc=pass (policy=quarantine) header.from=huawei.com Received: from canpemm500002.china.huawei.com (unknown [172.30.72.57]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4RBTh66H48zLntw; Thu, 27 Jul 2023 19:54:14 +0800 (CST) Received: from huawei.com (10.174.151.185) 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.2507.27; Thu, 27 Jul 2023 19:56:50 +0800 From: Miaohe Lin To: , CC: , , , Subject: [PATCH v2 2/4] mm: memory-failure: fix potential unexpected return value from unpoison_memory() Date: Thu, 27 Jul 2023 19:56:41 +0800 Message-ID: <20230727115643.639741-3-linmiaohe@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20230727115643.639741-1-linmiaohe@huawei.com> References: <20230727115643.639741-1-linmiaohe@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.174.151.185] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To canpemm500002.china.huawei.com (7.192.104.244) X-CFilter-Loop: Reflected X-Rspamd-Queue-Id: 9379E1C0009 X-Rspam-User: X-Stat-Signature: 9pr1ngxk6pyk4tgkk8epb1dqrr4wd91t X-Rspamd-Server: rspam03 X-HE-Tag: 1690459018-403242 X-HE-Meta: U2FsdGVkX1+dFsvoLH4b+gWG4aPtAkOJU9FBsvv9BMROdHFS7wq1auB/Vg6IXLBxz1ruCShzEQ37Sh35xtdaTo03znFq4AWl2UxYrL12bu0zJAR2lWhO9Z/UpoN0WQJjSxxqDauDWWjDqxi/zg1ieyTOMpswXTpGxLIvkAmZLaC8NhRl5BE+iuF13pjd1iu8r3G3appKW/c1BE6XuNU1JgglCLv3x4J8lZh1JPGcfhNm9rZbBfcDdjAaf8+nsXMrrfTKz/YUqvv0y06JvHVtiGNwg+4kDoDZevI1FJddtHnguU+xkw10H5kOezCyJ4meQU8fDO3yU/1hWfg1a73h8Ryr9tjNbm09K/Xkm8LW3x+KFb2PB6oB+16W6aU4WyqcJH1IeutkclXTeFqfGUhEIY+btYEjRlN9ffQfbhELuQCHi/Jl8YVwn7QxBMwFYGl62ZkptQAFrXGJnuVnnBz/I930YXXSrg1fQIY8g5YUBn9PDjezKb728RHR2TtvEHsBGRBhVza4vAJTUwNVtL+XSZmnYKCRC0CrZrDLpDO5K+b694Co/caBi6DCiv3VwF/aGroqlPWbdXXUYrHsgr0ON0Gumm568RRYzGgxeQ70lRqeypnAdxVKJpn9gqyH+VCqdEUIU0uMardrUJzl1ADQ9MKWztc+6PsgztF50lJ1J/sdey5LA4LJ19M8hEhsF1p8+R2/q+NR7ODjcwSBstIhdftiRsU0aJAnWeUqGH+EX72oiZcAtB9gni7Bh3270EaIjUc5ovO7R+0FwkSeMdyAjUmmI8PeUysJgIOhZcxPlnvKvSSCo4hfOZVidf3hn16WBtkkMGZFQ7O75MK9AVgL43CSInjyq5RvothRp/wYiqDwMbHFV7zxcGdHPZ06aqs69JNWQa0KbzwLk8RSBLZwdQAv8jX818NupFw1QjYj9xTy4GUhxdrIDiKscIG6bEbBFUTUicnTOaaAkWImmH7 HYyKHhuT T1O6/ym55vbWPKSxu6m8jvcDh5kL5Htp7xO4ebNE59GEFANP6Y5LEGOp8lBUr1UdRSPIUudruZo+T+5G/tphBYih8N35+sEPAreEPm6LpHoVluNdF7lKMFRL4S43OJGWMnecnAHbYIm/1J6OwJzlWwkY2QRVUPwxvBxQBtut3dBkL67ECAFBhIDbvvdMvMFFPQ2N5 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: If unpoison_memory() fails to clear page hwpoisoned flag, return value ret is expected to be -EBUSY. But when get_hwpoison_page() returns 1 and fails to clear page hwpoisoned flag due to races, return value will be unexpected 1 leading to users being confused. And there's a code smell that the variable "ret" is used not only to save the return value of unpoison_memory(), but also the return value from get_hwpoison_page(). Make a further cleanup by using another auto-variable solely to save the return value of get_hwpoison_page() as suggested by Naoya. Fixes: bf181c582588 ("mm/hwpoison: fix unpoison_memory()") Signed-off-by: Miaohe Lin --- mm/memory-failure.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/mm/memory-failure.c b/mm/memory-failure.c index a114c8c3039c..4a3e88c15631 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -2502,7 +2502,7 @@ int unpoison_memory(unsigned long pfn) { struct folio *folio; struct page *p; - int ret = -EBUSY; + int ret = -EBUSY, ghp; unsigned long count = 1; bool huge = false; static DEFINE_RATELIMIT_STATE(unpoison_rs, DEFAULT_RATELIMIT_INTERVAL, @@ -2550,29 +2550,28 @@ int unpoison_memory(unsigned long pfn) if (folio_test_slab(folio) || PageTable(&folio->page) || folio_test_reserved(folio)) goto unlock_mutex; - ret = get_hwpoison_page(p, MF_UNPOISON); - if (!ret) { + ghp = get_hwpoison_page(p, MF_UNPOISON); + if (!ghp) { if (PageHuge(p)) { huge = true; count = folio_free_raw_hwp(folio, false); - if (count == 0) { - ret = -EBUSY; + if (count == 0) goto unlock_mutex; - } } ret = folio_test_clear_hwpoison(folio) ? 0 : -EBUSY; - } else if (ret < 0) { - if (ret == -EHWPOISON) { + } else if (ghp < 0) { + if (ghp == -EHWPOISON) { ret = put_page_back_buddy(p) ? 0 : -EBUSY; - } else + } else { + ret = ghp; unpoison_pr_info("Unpoison: failed to grab page %#lx\n", pfn, &unpoison_rs); + } } else { if (PageHuge(p)) { huge = true; count = folio_free_raw_hwp(folio, false); if (count == 0) { - ret = -EBUSY; folio_put(folio); goto unlock_mutex; }