Received: by 2002:a05:6358:4e97:b0:b3:742d:4702 with SMTP id ce23csp2036981rwb; Sun, 14 Aug 2022 19:37:53 -0700 (PDT) X-Google-Smtp-Source: AA6agR5363RzXhBHJKZpXWDLW76S1UuF86xEMRuVs68l1D1OZd8nnh2uvz1SQWScR4J82E7VZQS5 X-Received: by 2002:a05:6402:1bc9:b0:43d:3903:11ee with SMTP id ch9-20020a0564021bc900b0043d390311eemr12876370edb.113.1660531073700; Sun, 14 Aug 2022 19:37:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660531073; cv=none; d=google.com; s=arc-20160816; b=l5pcqDlSa5lPZfW9iXtMEsGR6m9oU1hsAowjH1Pd3J6bLu6FMeNi7aJOgfoxaRlKuu cYwOtkLx4kd46EdQQ46geeK5SAty37bKfHNKnfQD5kMsTXme3mHB9xFUVIg8AiLda9HK HHon0L9fMIx+jdYvFtjPMD/2gttviQ2UJMAoQsRKVFEFDJUol8x+LJmT4Ou9pWSqww0u /cyVwTkYuEx1Ta9hXS7eTe9w+p4QCjiRYpTGl97xb184JZRWTmPKzd+nBN3+K+yvz14K qPDb5AH4wxTVDwUkcv7rXGtt946zK3VStcb9nC2RonP9ZQRcmmLWQvyCYm0PbyzR3LfQ q1rQ== 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=cYl8J/7wE0mavdL7bAVgni0Q+xO8KIyNbdm/0UikbeYuy+m7xynTX8X/oujTtn3DXi ZdswQ30rziFGkARg32PdJGwhubtax9rMfr3F8tiy2rSS6H+yp5pIwOktuGkeprQxap6A ixJrP4ishc/DobZkgXQu+aMhzeK/ifosCdsDhLasIgGrtSvzAFHGi2IYctKugLvNNN2E 7+sCOBR/oRkL7uvufVy+c11iadfiZbKaU9rk/y9+fbPonp1RFFX9SOBfr+0bmCCHl/WC Lw7YUPHQVnk3B3e6PbKxy/lfNONBITNta7jwBq3+ncfcJ3qaNthm5hnjI45bWW7JwCRL 9Yyg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=NxmT7Zpy; 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 sg16-20020a170907a41000b0073203356960si6453326ejc.273.2022.08.14.19.37.27; Sun, 14 Aug 2022 19:37:53 -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=NxmT7Zpy; 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 S230129AbiHOB7J (ORCPT + 99 others); Sun, 14 Aug 2022 21:59:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37054 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229841AbiHOB7C (ORCPT ); Sun, 14 Aug 2022 21:59:02 -0400 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4BFF412AD7 for ; Sun, 14 Aug 2022 18:59:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1660528741; x=1692064741; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=3RyMMTN/AHHSqtfx+jaKLw7DbxnmzdBDsCyu34bLAqQ=; b=NxmT7ZpyKnKhSc9llwsKGHijl029lLql0wvmcCzpQFC1k3vCcBGCqrgo IGP8/GRHIa+witpcJPSf9jxaGjwa7DdxVnVSwTqcE67xgU3jlhDu72iof p0C5MvKbNOhw/uNQwwrKvU5OspqyYpj+J7dVIP7yf0r7EBDnr9pnR/7Sq ndoMonx+VIvIKvo8d9m1QllBbvPp0Pu6Z1ayGtVb67t5lEjCbd0cJiVMz X0aSM9qTQyMJAi1pLXVntnpwMSVcDnfujWy3UOxZVXa+hYgzW4gHHzhUQ s2EO2ziMrGkoc3j1ZrufFyAYKCIV4ZQLi0kzDLetHQ+GeR2nacdfq9PDQ Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10439"; a="292667577" X-IronPort-AV: E=Sophos;i="5.93,237,1654585200"; d="scan'208";a="292667577" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Aug 2022 18:59:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,237,1654585200"; d="scan'208";a="557132038" Received: from sse-cse-haiyue-nuc.sh.intel.com ([10.239.241.114]) by orsmga003.jf.intel.com with ESMTP; 14 Aug 2022 18:58:58 -0700 From: Haiyue Wang To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: akpm@linux-foundation.org, david@redhat.com, linmiaohe@huawei.com, ying.huang@intel.com, songmuchun@bytedance.com, naoya.horiguchi@linux.dev, alex.sierra@amd.com, Haiyue Wang , Alistair Popple , Felix Kuehling Subject: [PATCH v4 2/2] mm: fix the handling Non-LRU pages returned by follow_page Date: Mon, 15 Aug 2022 09:59:09 +0800 Message-Id: <20220815015909.439623-3-haiyue.wang@intel.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220815015909.439623-1-haiyue.wang@intel.com> References: <20220812084921.409142-1-haiyue.wang@intel.com> <20220815015909.439623-1-haiyue.wang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.5 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,RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham 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