Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751193AbbDUEUo (ORCPT ); Tue, 21 Apr 2015 00:20:44 -0400 Received: from TYO201.gate.nec.co.jp ([210.143.35.51]:35795 "EHLO tyo201.gate.nec.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750751AbbDUEUm convert rfc822-to-8bit (ORCPT ); Tue, 21 Apr 2015 00:20:42 -0400 From: Naoya Horiguchi To: Andrew Morton CC: Dean Nelson , Andi Kleen , "linux-mm@kvack.org" , "linux-kernel@vger.kernel.org" , Naoya Horiguchi Subject: [PATCH] mm: soft-offline: fix num_poisoned_pages counting on concurrent events Thread-Topic: [PATCH] mm: soft-offline: fix num_poisoned_pages counting on concurrent events Thread-Index: AQHQe+o4JId7qyNT7E2lSYfmiS4Qmg== Date: Tue, 21 Apr 2015 04:18:28 +0000 Message-ID: <1429589902-2765-1-git-send-email-n-horiguchi@ah.jp.nec.com> Accept-Language: ja-JP, en-US Content-Language: ja-JP X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.128.101.31] Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1789 Lines: 45 If multiple soft offline events hit one free page/hugepage concurrently, soft_offline_page() can handle the free page/hugepage multiple times, which makes num_poisoned_pages counter increased more than once. This patch fixes this wrong counting by checking TestSetPageHWPoison for normal papes and by checking the return value of dequeue_hwpoisoned_huge_page() for hugepages. Signed-off-by: Naoya Horiguchi Cc: stable@vger.kernel.org # v3.14+ --- # This problem might happen before 3.14, but it's rare and non-critical, # so I want this patch to be backported to stable trees only if the patch # cleanly applies (i.e. v3.14+). --- mm/memory-failure.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git v4.0.orig/mm/memory-failure.c v4.0/mm/memory-failure.c index 2cc1d578144b..72a5224c8084 100644 --- v4.0.orig/mm/memory-failure.c +++ v4.0/mm/memory-failure.c @@ -1721,12 +1721,12 @@ int soft_offline_page(struct page *page, int flags) } else if (ret == 0) { /* for free pages */ if (PageHuge(page)) { set_page_hwpoison_huge_page(hpage); - dequeue_hwpoisoned_huge_page(hpage); - atomic_long_add(1 << compound_order(hpage), + if (!dequeue_hwpoisoned_huge_page(hpage)) + atomic_long_add(1 << compound_order(hpage), &num_poisoned_pages); } else { - SetPageHWPoison(page); - atomic_long_inc(&num_poisoned_pages); + if (!TestSetPageHWPoison(page)) + atomic_long_inc(&num_poisoned_pages); } } unset_migratetype_isolate(page, MIGRATE_MOVABLE); -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/