Received: by 2002:a05:6358:5282:b0:b5:90e7:25cb with SMTP id g2csp3807767rwa; Tue, 23 Aug 2022 10:24:33 -0700 (PDT) X-Google-Smtp-Source: AA6agR4bZxb/WS9aSLoaCK0Uzs1UQMiM0kHe8t2oXoBG2Uk3sJRcstt4ZyJofg4Glf3mJB1ZDXNF X-Received: by 2002:a17:907:7210:b0:73d:9c29:890c with SMTP id dr16-20020a170907721000b0073d9c29890cmr390032ejc.770.1661275472994; Tue, 23 Aug 2022 10:24:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1661275472; cv=none; d=google.com; s=arc-20160816; b=Z7bJc93HwVdPHHZgPcdMTKbHLzoJOm06rOARGEedp40drAgKD7bNVoEqgBIVQFlcC7 QCT/xBm8Mt39VDrw0ZiR9uN1chfLj4AC/F3FVwfvq2U0sF03OCLWGK6FYvLOutH3FMhD AZ8hEgpvFtIhc0IvVDpX1XKf+a67E/766nqtLw0zb4CSdIjk7VThOBCNfGalXhSiCyN9 U0HfV8VFn/749Usc8fLHvrCQ4Sd7mnBX0TF46pqP5D67fLiG0Rg4hRcUNf09GcUIzpd1 myZQ/3SWGq5OChdg8OoOmCSfu0n+KbpLHfl2pZdfn+gvOM08Vt/1zBHfKSkI3pMWUauQ 8/pQ== 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=QTcwD8hhjKpG4Ex3yQuhOBlJMHaSmz0B3AI7MGnnu88=; b=C9k5qvoKWDQcwGPr09T7xldnHHUwx9B6LWonhOzljSk84oyNLdErX60P54vHjzQKND 6a+B4WAE7qmJnQKW9BQgjs37J7wcjs7j0g5b3kkoSHHn8Yd1h47H1RUvonxnKgQz/EEp nT4fS1iC2PF0rsFrsdG1ekjPyYIsa6+v+HOaw++cjMLWm45B9VvYtYHOgXqZFnpiXQJg TW4vTkSNHVmKzdRxTU2j26RUwoWMklPBNCQXinC75pqSqh5T6NPXR+f0NhzWf1nqIWQd EFH3kIZXZwETG1oRLtByfa6AQ0YYMohCG6Th3mga2feVzLeHEQTXxl+owcQEYaWJJcxX RdUg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Cg2mWjGD; 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 mp31-20020a1709071b1f00b0073082518a55si191455ejc.363.2022.08.23.10.24.04; Tue, 23 Aug 2022 10:24:32 -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=Cg2mWjGD; 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 S243250AbiHWRNE (ORCPT + 99 others); Tue, 23 Aug 2022 13:13:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39022 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344937AbiHWRL3 (ORCPT ); Tue, 23 Aug 2022 13:11:29 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E633C150173 for ; Tue, 23 Aug 2022 06:58:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1661263112; x=1692799112; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=4Pu50YmzN3N8F0nGXEPtFaQtALXj/wKmJ3as5yUVNsM=; b=Cg2mWjGDiDzLLB0dsiSgaCLxU6sC9HoY+NyEG8KV5K10Vkhedq/zW+NH 0/vKhvIZ8ER55gJcuAQ4OW2hnZMtOcWz6M9PkJ8yCiO5SHgJ8ksEIdQlz a9FP9uIwQ9InLHVMnBQBosgrgNp2yHoI8uammwi6v3dVLKp8p2S8GU5Zw 4X0tpbbqE3S2CkC4wvNQPlGGPlFHVX2Xrd6SkjTD7Xc75Pnp3+NzumOIf vKJdB2UIdu4RCHgLvqbYGkwyPxQox4uYFwmL8l0siAwx8ojq8+nGAh2V2 +hYe3798iyLVGBcf7swFqUOSc6hdF4RmL33WkDw3CTrAbB3I2PWLbFWLR g==; X-IronPort-AV: E=McAfee;i="6500,9779,10448"; a="357669589" X-IronPort-AV: E=Sophos;i="5.93,257,1654585200"; d="scan'208";a="357669589" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Aug 2022 06:58:32 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,257,1654585200"; d="scan'208";a="638663381" Received: from sse-cse-haiyue-nuc.sh.intel.com ([10.239.241.114]) by orsmga008.jf.intel.com with ESMTP; 23 Aug 2022 06:58:29 -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, mike.kravetz@oracle.com, gerald.schaefer@linux.ibm.com, Haiyue Wang , Felix Kuehling Subject: [PATCH v7 2/2] mm: fix the handling Non-LRU pages returned by follow_page Date: Tue, 23 Aug 2022 21:58:41 +0800 Message-Id: <20220823135841.934465-3-haiyue.wang@intel.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220823135841.934465-1-haiyue.wang@intel.com> References: <20220823135841.934465-1-haiyue.wang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.4 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,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(). Since the zone device page can't be a transparent huge page, so drop the redundant zone device page check for split_huge_pages_pid(). (by Miaohe) Fixes: 3218f8712d6b ("mm: handling Non-LRU pages returned by vm_normal_pages") Signed-off-by: Haiyue Wang Reviewed-by: "Huang, Ying" Reviewed-by: Felix Kuehling Reviewed-by: Alistair Popple Reviewed-by: Miaohe Lin Acked-by: David Hildenbrand --- mm/huge_memory.c | 2 +- mm/ksm.c | 12 +++++++++--- mm/migrate.c | 19 ++++++++++++------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 8a7c1b344abe..2ee6d38a1426 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -2963,7 +2963,7 @@ 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)) 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..44e05ce41d49 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,13 +1871,15 @@ 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 = -ENOENT; + if (!page) + goto set_status; + + if (!is_zone_device_page(page)) err = page_to_nid(page); - if (foll_flags & FOLL_GET) - put_page(page); - } else { - err = -ENOENT; - } + + if (foll_flags & FOLL_GET) + put_page(page); set_status: *status = err; -- 2.37.2