From patchwork Fri Jul 13 03:26:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naoya Horiguchi X-Patchwork-Id: 10522541 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BF6336028E for ; Fri, 13 Jul 2018 03:26:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AD99628CB5 for ; Fri, 13 Jul 2018 03:26:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A1EC629B99; Fri, 13 Jul 2018 03:26:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B91EE28CB5 for ; Fri, 13 Jul 2018 03:26:25 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 454B76B0007; Thu, 12 Jul 2018 23:26:24 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 407206B0008; Thu, 12 Jul 2018 23:26:24 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2CBAD6B000A; Thu, 12 Jul 2018 23:26:24 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pf0-f199.google.com (mail-pf0-f199.google.com [209.85.192.199]) by kanga.kvack.org (Postfix) with ESMTP id DDB816B0007 for ; Thu, 12 Jul 2018 23:26:23 -0400 (EDT) Received: by mail-pf0-f199.google.com with SMTP id v25-v6so11626999pfm.11 for ; Thu, 12 Jul 2018 20:26:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:dkim-signature:sender:from:to:cc:subject:date :message-id:in-reply-to:references; bh=5fXt0fl+qc7hqJ8oDMdCmzsKVv7p1HlWSqloKSeYltY=; b=qR+EQJaLqIH4bxe785su6bYaFDIch0Ws/fiBRQqSS1fQFxLMEc9nAFgEBLWIrEdM0j BUxci7WqllqIcuTTjiI1f9z9ez28Aqfzo4K7UBQiQVc7X3y3Iso7HoiWJ09bmZn2W2qf AdcIIKxVxkDkZI8CqWtF8/WQUKU+13+5SI60mdaJvuCQUytfYwDfAbrzcoQpCtSjEG1H KB6K8IKho29/zHCESOqJfqLr1wBiayK74u+L82+K45FqjkuSudkaSOg3hI0Fqv5VcGFI AJnF+zyHroCGdyMvYfEoy8G6y8QIex2QRVnIo12KnnHK1mmvOc9wlM9aICg52ApsVk8m SSIA== X-Gm-Message-State: AOUpUlG8/+ImjSCKR8IzmHaN3jtK60V8gLluBaMPPo8/jiRRtGlvwK4l SYSm8iKbkbJTetXx0Xn0OjfXcjt4aZN0mdyig2m/zeitQZGpbm2hziCP3Y0Tok4wG91AO237F39 js1i/dhARabwL2bVkKTedn8bDpq0Z08uEV7XffdYSYmUqFbbr/eom2xUfue9IPCgRRqTPNe0GoF 4RwljswQoPTBkaSuUtfnM0u6tN3RikSy5PpUuB0F6H4mB/e2Hqi454JWqBCitl+RqU1bkSLgytP ti06WDGxf/XPsgfBDlQoVK/KWBu1Ny5uUObpx9eHhBZGz306hUZNLaHL8wx0mdgVmbrOHzAOmBf B8cSgDHSMYJ+DZx229qYCveYS+ww1XEv94Vmau8uv+SGITUclsK62OoOneJ9uSlhRaatreGUOA= = X-Received: by 2002:a17:902:7481:: with SMTP id h1-v6mr4737885pll.183.1531452383579; Thu, 12 Jul 2018 20:26:23 -0700 (PDT) X-Received: by 2002:a17:902:7481:: with SMTP id h1-v6mr4737826pll.183.1531452382588; Thu, 12 Jul 2018 20:26:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531452382; cv=none; d=google.com; s=arc-20160816; b=C0y3BT2Gxwg1n6GYd47vL6lUIfYmwizu4LQAU9fZFrjy/31GA5XMVWqeUyRJ4AWCw+ xqlnROWW+IimC8WRQLGG5ipPqM1dm87Mw0BkiVYKZfFA6pMWAntcZpi6PLf6iNmq3dX1 SbHRP3ZP18BrHjishuX7W9MTgYaDFs9U4oyqclAsjoJDonb+BZL9b/ifPaVysBYVaV5R 1F8MVP5RzT2bYzo6gVyD5ZFqRkUsHRgsWaLpWADD8itwDKDYBvyDyPpwt9RgyNFtP6xQ cj/lvOuzKXe+zFfZAAqCLMZNrDSpGJGB0HaC1PUTwSJbbDz+U7/s7OnAD2M69LrpjVUc afFg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from:sender :dkim-signature:arc-authentication-results; bh=5fXt0fl+qc7hqJ8oDMdCmzsKVv7p1HlWSqloKSeYltY=; b=U6pz0CViDgFW9esPs35yWFsDOolwgbVGnbnHO5IaZ4Kb1LnH0vQe4pCYgyLQ4N2J1x g+TpNtguIc/YYZnVY+cxU7382LTngjCRAslsHnwN3v0eZkiQ/03WUCLkGRo55+NW4hJe hrKkAegdKL/1tCq6Q9Lt9U12STGEqsgWo+MW4tX9f93CqVA5hf68PJaP1JNyWjPVkwxe Vl5+lzSIO2/EG7hF31MdPcnCt2BsnnhfEBjterCEf1HJwiqnukl3LX1EbjFVclkR2rSR 2bbPFTjCcWfQDmVxs5zNGvKr8lvJS1xA2O4+jAHUD/RJcmLlJJG+AFBXkQD2Q4l9OiHf mXyw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=s5PKq+1F; spf=pass (google.com: domain of nao.horiguchi@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=nao.horiguchi@gmail.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id s27-v6sor7099966pfi.6.2018.07.12.20.26.22 for (Google Transport Security); Thu, 12 Jul 2018 20:26:22 -0700 (PDT) Received-SPF: pass (google.com: domain of nao.horiguchi@gmail.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=s5PKq+1F; spf=pass (google.com: domain of nao.horiguchi@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=nao.horiguchi@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=5fXt0fl+qc7hqJ8oDMdCmzsKVv7p1HlWSqloKSeYltY=; b=s5PKq+1F6Gje2S1bJEfGVv2c7OcZP0V33S8jsckpOYAFuZMCBTHKuEskSJAt2JyoLj Pmaieu5J5JJoudDiMews7MRurDbnOcgDEP8mtrE5XfC0s2bL7sj8iaxUUZjYfQv08XBv j6LxYdCIbFS9lpdw3he33viz149oXlDk/2IpRinUUGrCXbR2q3+Es5WIiY0/nUcmsxqf +xjNLrWeAH/n6QjJ9VfnsXeopkyaR5d0RRKv+wECY4rETyobz3bygCa7FKqn9VmRkOhK vgB2UH+GCYSJp7qEonz2iEgoHqy/rA9/DmYCzZJEo3wokOBDwX3XydILIPAFER/9+MVE AqMw== X-Google-Smtp-Source: AAOMgpdIH6JZjGOut4k9s0b1IRS689VymubaD4ejXurmyO5TOwWSzB2MTIAsi2+hdfTGHlPLyMI+1A== X-Received: by 2002:a62:98d6:: with SMTP id d83-v6mr5194408pfk.186.1531452381856; Thu, 12 Jul 2018 20:26:21 -0700 (PDT) Received: from www9186uo.sakura.ne.jp (www9186uo.sakura.ne.jp. [153.121.56.200]) by smtp.gmail.com with ESMTPSA id b66-v6sm8867241pgc.15.2018.07.12.20.26.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 12 Jul 2018 20:26:20 -0700 (PDT) From: Naoya Horiguchi To: linux-mm@kvack.org Cc: Michal Hocko , Andrew Morton , xishi.qiuxishi@alibaba-inc.com, zy.zhengyi@alibaba-inc.com, linux-kernel@vger.kernel.org Subject: [PATCH v1 1/2] mm: fix race on soft-offlining free huge pages Date: Fri, 13 Jul 2018 12:26:05 +0900 Message-Id: <1531452366-11661-2-git-send-email-n-horiguchi@ah.jp.nec.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1531452366-11661-1-git-send-email-n-horiguchi@ah.jp.nec.com> References: <1531452366-11661-1-git-send-email-n-horiguchi@ah.jp.nec.com> 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: X-Virus-Scanned: ClamAV using ClamSMTP There's a race condition between soft offline and hugetlb_fault which causes unexpected process killing and/or hugetlb allocation failure. The process killing is caused by the following flow: CPU 0 CPU 1 CPU 2 soft offline get_any_page // find the hugetlb is free mmap a hugetlb file page fault ... hugetlb_fault hugetlb_no_page alloc_huge_page // succeed soft_offline_free_page // set hwpoison flag mmap the hugetlb file page fault ... hugetlb_fault hugetlb_no_page find_lock_page return VM_FAULT_HWPOISON mm_fault_error do_sigbus // kill the process The hugetlb allocation failure comes from the following flow: CPU 0 CPU 1 mmap a hugetlb file // reserve all free page but don't fault-in soft offline get_any_page // find the hugetlb is free soft_offline_free_page // set hwpoison flag dissolve_free_huge_page // fail because all free hugepages are reserved page fault ... hugetlb_fault hugetlb_no_page alloc_huge_page ... dequeue_huge_page_node_exact // ignore hwpoisoned hugepage // and finally fail due to no-mem The root cause of this is that current soft-offline code is written based on an assumption that PageHWPoison flag should beset at first to avoid accessing the corrupted data. This makes sense for memory_failure() or hard offline, but does not for soft offline because soft offline is about corrected (not uncorrected) error and is safe from data lost. This patch changes soft offline semantics where it sets PageHWPoison flag only after containment of the error page completes successfully. Reported-by: Xishi Qiu Suggested-by: Xishi Qiu Signed-off-by: Naoya Horiguchi --- mm/hugetlb.c | 11 +++++------ mm/memory-failure.c | 22 ++++++++++++++++------ mm/migrate.c | 2 -- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git v4.18-rc4-mmotm-2018-07-10-16-50/mm/hugetlb.c v4.18-rc4-mmotm-2018-07-10-16-50_patched/mm/hugetlb.c index 430be42..937c142 100644 --- v4.18-rc4-mmotm-2018-07-10-16-50/mm/hugetlb.c +++ v4.18-rc4-mmotm-2018-07-10-16-50_patched/mm/hugetlb.c @@ -1479,22 +1479,20 @@ static int free_pool_huge_page(struct hstate *h, nodemask_t *nodes_allowed, /* * Dissolve a given free hugepage into free buddy pages. This function does * nothing for in-use (including surplus) hugepages. Returns -EBUSY if the - * number of free hugepages would be reduced below the number of reserved - * hugepages. + * dissolution fails because a give page is not a free hugepage, or because + * free hugepages are fully reserved. */ int dissolve_free_huge_page(struct page *page) { - int rc = 0; + int rc = -EBUSY; spin_lock(&hugetlb_lock); if (PageHuge(page) && !page_count(page)) { struct page *head = compound_head(page); struct hstate *h = page_hstate(head); int nid = page_to_nid(head); - if (h->free_huge_pages - h->resv_huge_pages == 0) { - rc = -EBUSY; + if (h->free_huge_pages - h->resv_huge_pages == 0) goto out; - } /* * Move PageHWPoison flag from head page to the raw error page, * which makes any subpages rather than the error page reusable. @@ -1508,6 +1506,7 @@ int dissolve_free_huge_page(struct page *page) h->free_huge_pages_node[nid]--; h->max_huge_pages--; update_and_free_page(h, head); + rc = 0; } out: spin_unlock(&hugetlb_lock); diff --git v4.18-rc4-mmotm-2018-07-10-16-50/mm/memory-failure.c v4.18-rc4-mmotm-2018-07-10-16-50_patched/mm/memory-failure.c index 9d142b9..c63d982 100644 --- v4.18-rc4-mmotm-2018-07-10-16-50/mm/memory-failure.c +++ v4.18-rc4-mmotm-2018-07-10-16-50_patched/mm/memory-failure.c @@ -1598,8 +1598,18 @@ static int soft_offline_huge_page(struct page *page, int flags) if (ret > 0) ret = -EIO; } else { - if (PageHuge(page)) - dissolve_free_huge_page(page); + /* + * We set PG_hwpoison only when the migration source hugepage + * was successfully dissolved, because otherwise hwpoisoned + * hugepage remains on free hugepage list, then userspace will + * find it as SIGBUS by allocation failure. That's not expected + * in soft-offlining. + */ + ret = dissolve_free_huge_page(page); + if (!ret) { + if (set_hwpoison_free_buddy_page(page)) + num_poisoned_pages_inc(); + } } return ret; } @@ -1715,13 +1725,13 @@ static int soft_offline_in_use_page(struct page *page, int flags) static void soft_offline_free_page(struct page *page) { + int rc = 0; struct page *head = compound_head(page); - if (!TestSetPageHWPoison(head)) { + if (PageHuge(head)) + rc = dissolve_free_huge_page(page); + if (!rc && !TestSetPageHWPoison(page)) num_poisoned_pages_inc(); - if (PageHuge(head)) - dissolve_free_huge_page(page); - } } /** diff --git v4.18-rc4-mmotm-2018-07-10-16-50/mm/migrate.c v4.18-rc4-mmotm-2018-07-10-16-50_patched/mm/migrate.c index 198af42..3ae213b 100644 --- v4.18-rc4-mmotm-2018-07-10-16-50/mm/migrate.c +++ v4.18-rc4-mmotm-2018-07-10-16-50_patched/mm/migrate.c @@ -1318,8 +1318,6 @@ static int unmap_and_move_huge_page(new_page_t get_new_page, out: if (rc != -EAGAIN) putback_active_hugepage(hpage); - if (reason == MR_MEMORY_FAILURE && !test_set_page_hwpoison(hpage)) - num_poisoned_pages_inc(); /* * If migration was not successful and there's a freeing callback, use