Received: by 2002:a05:6358:4e97:b0:b3:742d:4702 with SMTP id ce23csp2201966rwb; Mon, 15 Aug 2022 00:17:46 -0700 (PDT) X-Google-Smtp-Source: AA6agR6tf/uA9nhzn/NN59PPCakVGZKUkBMzBPrqhEIhwBeIWBwyhE1Egy2rod09mP29pw/zCijL X-Received: by 2002:a17:902:ebc8:b0:172:549d:e392 with SMTP id p8-20020a170902ebc800b00172549de392mr12261393plg.141.1660547866038; Mon, 15 Aug 2022 00:17:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660547866; cv=none; d=google.com; s=arc-20160816; b=Gx9WoODoSYvzmSQ6sb/405A+tcKAHn0B0fOU1sR3xdd20pI38LmINTUQX/BasoUdFZ Co0oYvIDxyGGPlYznOhiKkeGLCcX8R4uAig2pIGdbsZVGr1f4RoaUhIlksCVboB1/MPJ L0L0xTDtFOfLXce/XxvsJoZnmpgTT5xmhFamGBmJ0LZyEjYCokMY9s5c7zzClUP1aZMe z2KKDy9CwWfmDP2BDQM9xJsjMk9Bqb/gzFYdzxKaLUN4zYCVPx1mKpb+CS6ZXsomsyiG xmZDKr9vDzjXt4PCuODdRReEVVpxedDqwnP1BlXk36t+F6AsR++GbA2/Xm8iE7yi7GAU o6IQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=UXVGBXteGgnAWCtkLVBBIWLJ+s/PcHculFgKaTH2TmQ=; b=fTdw8lS3Dsk1wLvnkeYjZHJbMetYIcnpnMTEeGSH/HQKzukV/IEhQnpPbXZa65beSE Dt8K57GGbrx3H+LrrJv4+HPedK+tdVOqe6OhQsamkeElxidnvVfM9LaMlYx98elFDahP Be8iBM1CUmklO9jMS4MNCehGvHXWKZxUHbJkTNM/rO1/GQL0+AIQm6qjd5y+8BZugQMJ AHrp86E0lBXa1H6GuemEWJHiJp8w9Lz1/4h8FAumPvBL2I1iQoq/+xTJ7N78AqMsvUCl 4HZlfB8RcHTnHaM6J+2mz8ZinpzCy9cLEpD3yDaNijKLNujgYUpi7Xq0BmzxePhUOUOx 7fnQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="FxGtrw/r"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id pg7-20020a17090b1e0700b001f617f345bbsi16758238pjb.110.2022.08.15.00.17.35; Mon, 15 Aug 2022 00:17:46 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="FxGtrw/r"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241279AbiHOHCi (ORCPT + 99 others); Mon, 15 Aug 2022 03:02:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36084 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241275AbiHOHCe (ORCPT ); Mon, 15 Aug 2022 03:02:34 -0400 Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B4D3A1C135 for ; Mon, 15 Aug 2022 00:02:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1660546953; x=1692082953; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=3RyMMTN/AHHSqtfx+jaKLw7DbxnmzdBDsCyu34bLAqQ=; b=FxGtrw/rENG96QOw9t3WWxrBRVP5IhFCBQ94iZOAbBKpNbh7z1eAk/ER 62UOs4w9Cv6h66M/pla9IlWi2NdT6xODypBu7ssQ08pJbplDlgtBoCzCk zDivy1fW3lj5ljQMBRHB1mDls+y2EnrLYm1tfjXVo+OTHElp+WAaXSL1D cCsjnZ8/YOmNUmDQXFnB8fQiEKZtOY/Er1JsIzKZimM8Y99wvPg5zUSdt 5RO/LURgDQAUEvEV4eeoHwrQAS6uValmBDHikLFV/VuEnz+Xu6/oqVGCd tSSRTRzrwQ/M4Oh8kobFmPYFzGI9+moQRQSAu6oI2r4+GNlcDWBg14k/e Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10439"; a="274960263" X-IronPort-AV: E=Sophos;i="5.93,237,1654585200"; d="scan'208";a="274960263" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Aug 2022 00:02:33 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,237,1654585200"; d="scan'208";a="666566780" Received: from sse-cse-haiyue-nuc.sh.intel.com ([10.239.241.114]) by fmsmga008.fm.intel.com with ESMTP; 15 Aug 2022 00:02:30 -0700 From: Haiyue Wang To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: akpm@linux-foundation.org, david@redhat.com, apopple@nvidia.com, linmiaohe@huawei.com, ying.huang@intel.com, songmuchun@bytedance.com, naoya.horiguchi@linux.dev, alex.sierra@amd.com, Haiyue Wang , Felix Kuehling Subject: [PATCH v5 2/2] mm: fix the handling Non-LRU pages returned by follow_page Date: Mon, 15 Aug 2022 15:02:40 +0800 Message-Id: <20220815070240.470469-3-haiyue.wang@intel.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220815070240.470469-1-haiyue.wang@intel.com> References: <20220812084921.409142-1-haiyue.wang@intel.com> <20220815070240.470469-1-haiyue.wang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.2 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,HK_RANDOM_ENVFROM, HK_RANDOM_FROM,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The handling Non-LRU pages returned by follow_page() jumps directly, it doesn't call put_page() to handle the reference count, since 'FOLL_GET' flag for follow_page() has get_page() called. Fix the zone device page check by handling the page reference count correctly before returning. And as David reviewed, "device pages are never PageKsm pages". Drop this zone device page check for break_ksm(). Fixes: 3218f8712d6b ("mm: handling Non-LRU pages returned by vm_normal_pages") Signed-off-by: Haiyue Wang --- mm/huge_memory.c | 4 ++-- mm/ksm.c | 12 +++++++++--- mm/migrate.c | 10 +++++++--- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 8a7c1b344abe..b2ba17c3dcd7 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -2963,10 +2963,10 @@ static int split_huge_pages_pid(int pid, unsigned long vaddr_start, /* FOLL_DUMP to ignore special (like zero) pages */ page = follow_page(vma, addr, FOLL_GET | FOLL_DUMP); - if (IS_ERR_OR_NULL(page) || is_zone_device_page(page)) + if (IS_ERR_OR_NULL(page)) continue; - if (!is_transparent_hugepage(page)) + if (is_zone_device_page(page) || !is_transparent_hugepage(page)) goto next; total++; diff --git a/mm/ksm.c b/mm/ksm.c index 42ab153335a2..e26f57fc1f0e 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -475,7 +475,7 @@ static int break_ksm(struct vm_area_struct *vma, unsigned long addr) cond_resched(); page = follow_page(vma, addr, FOLL_GET | FOLL_MIGRATION | FOLL_REMOTE); - if (IS_ERR_OR_NULL(page) || is_zone_device_page(page)) + if (IS_ERR_OR_NULL(page)) break; if (PageKsm(page)) ret = handle_mm_fault(vma, addr, @@ -560,12 +560,15 @@ static struct page *get_mergeable_page(struct rmap_item *rmap_item) goto out; page = follow_page(vma, addr, FOLL_GET); - if (IS_ERR_OR_NULL(page) || is_zone_device_page(page)) + if (IS_ERR_OR_NULL(page)) goto out; + if (is_zone_device_page(page)) + goto out_putpage; if (PageAnon(page)) { flush_anon_page(vma, page, addr); flush_dcache_page(page); } else { +out_putpage: put_page(page); out: page = NULL; @@ -2308,11 +2311,13 @@ static struct rmap_item *scan_get_next_rmap_item(struct page **page) if (ksm_test_exit(mm)) break; *page = follow_page(vma, ksm_scan.address, FOLL_GET); - if (IS_ERR_OR_NULL(*page) || is_zone_device_page(*page)) { + if (IS_ERR_OR_NULL(*page)) { ksm_scan.address += PAGE_SIZE; cond_resched(); continue; } + if (is_zone_device_page(*page)) + goto next_page; if (PageAnon(*page)) { flush_anon_page(vma, *page, ksm_scan.address); flush_dcache_page(*page); @@ -2327,6 +2332,7 @@ static struct rmap_item *scan_get_next_rmap_item(struct page **page) mmap_read_unlock(mm); return rmap_item; } +next_page: put_page(*page); ksm_scan.address += PAGE_SIZE; cond_resched(); diff --git a/mm/migrate.c b/mm/migrate.c index 581dfaad9257..fee12cd2f294 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -1672,9 +1672,12 @@ static int add_page_for_migration(struct mm_struct *mm, unsigned long addr, goto out; err = -ENOENT; - if (!page || is_zone_device_page(page)) + if (!page) goto out; + if (is_zone_device_page(page)) + goto out_putpage; + err = 0; if (page_to_nid(page) == node) goto out_putpage; @@ -1868,8 +1871,9 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages, if (IS_ERR(page)) goto set_status; - if (page && !is_zone_device_page(page)) { - err = page_to_nid(page); + if (page) { + err = !is_zone_device_page(page) ? page_to_nid(page) + : -ENOENT; if (foll_flags & FOLL_GET) put_page(page); } else { -- 2.37.2