Received: by 10.192.165.156 with SMTP id m28csp492836imm; Wed, 11 Apr 2018 02:33:16 -0700 (PDT) X-Google-Smtp-Source: AIpwx48C2ikSp1Ma1hh7LEsyxjIsbLKnhH2UrXgzv92f3MZrVgOx0KDTfAYW5NXVKYgc+dwh7f6i X-Received: by 2002:a17:902:8ec5:: with SMTP id x5-v6mr4243208plo.391.1523439196769; Wed, 11 Apr 2018 02:33:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523439196; cv=none; d=google.com; s=arc-20160816; b=uGrkSNuLGpEYOBI9umyxnDxz0TAltw5pBS6QvFJQsK+CRol9sjc265AGNQ1RBOAynV bLMLKUsnj1RFQ2TxYLT5jea9fL33ees+xE0xgZ1k6N5h6ilaFMIF8IsKveta+yOMK8QF C18pTaBGsGXOaP4NfkBAwo1p5B8ZP2vYJhrnDPSuKuxykeodRqikOjI/mWC23WTfpYvs ZpqdrNHfxmgivqiip+UW33Wj2ewRufrhWF47EY9xHe4B1GKKUYu10Pl1OLxIR673+ons DC3HjxiG33oFnrtsfb98Qi8cZrG+wJkxgKnldRyB5eDM6kENUvTmJXxGhUSCJs7SysMS 7RMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:arc-authentication-results; bh=K1lsBmJYzScXs+eC4QHTx3w3nLpydVV4tO6cskecLLE=; b=W8x/mboWUonmtkrYkESAoxV27F/xXVFHLAJYnkq4F5DdAMnH6FlMz8okioFU/WUTpv xaKnwTthZEUVJUlIE3bulXovxj+cu05thYEcUbvE9LYqf4YMVF2eUbUDI67ZcqxzZcG7 2t3lVi4cEC9PJ/AqsXvQmf8867W+QakceaFPwRlfZn/+a+OnWQa1HRGuE5Nsd2nazV8x Jogu0klcc6Yvcju+SZ62Xy5J74CQUKo2/yWL2iny+mjbkjpo0dMDUBePxqRLYuuhb1mN 3HPFPdpTfL4679p/Lv/dQ4GQGT+4OtlNFSiIDC63HwIbGMSIR8nl8Q+Yr02q6DDl1MC1 Stqg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q14-v6si677159pls.3.2018.04.11.02.32.40; Wed, 11 Apr 2018 02:33:16 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752286AbeDKJ0S (ORCPT + 99 others); Wed, 11 Apr 2018 05:26:18 -0400 Received: from mx2.suse.de ([195.135.220.15]:60952 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750785AbeDKJ0Q (ORCPT ); Wed, 11 Apr 2018 05:26:16 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id E5F73ACE5; Wed, 11 Apr 2018 09:26:14 +0000 (UTC) Date: Wed, 11 Apr 2018 11:26:11 +0200 From: Michal Hocko To: Naoya Horiguchi , Andrew Morton Cc: "Kirill A. Shutemov" , Zi Yan , "linux-mm@kvack.org" , Vlastimil Babka , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH] mm: shmem: enable thp migration (Re: [PATCH v1] mm: consider non-anonymous thp as unmovable page) Message-ID: <20180411092611.GE23400@dhcp22.suse.cz> References: <20180403083451.GG5501@dhcp22.suse.cz> <20180403105411.hknofkbn6rzs26oz@node.shutemov.name> <20180405085927.GC6312@dhcp22.suse.cz> <20180405122838.6a6b35psizem4tcy@node.shutemov.name> <20180405124830.GJ6312@dhcp22.suse.cz> <20180405134045.7axuun6d7ufobzj4@node.shutemov.name> <20180405150547.GN6312@dhcp22.suse.cz> <20180405155551.wchleyaf4rxooj6m@node.shutemov.name> <20180405160317.GP6312@dhcp22.suse.cz> <20180406030706.GA2434@hori1.linux.bs1.fc.nec.co.jp> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180406030706.GA2434@hori1.linux.bs1.fc.nec.co.jp> User-Agent: Mutt/1.9.4 (2018-02-28) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri 06-04-18 03:07:11, Naoya Horiguchi wrote: > >From e31ec037701d1cc76b26226e4b66d8c783d40889 Mon Sep 17 00:00:00 2001 > From: Naoya Horiguchi > Date: Fri, 6 Apr 2018 10:58:35 +0900 > Subject: [PATCH] mm: enable thp migration for shmem thp > > My testing for the latest kernel supporting thp migration showed an > infinite loop in offlining the memory block that is filled with shmem > thps. We can get out of the loop with a signal, but kernel should > return with failure in this case. > > What happens in the loop is that scan_movable_pages() repeats returning > the same pfn without any progress. That's because page migration always > fails for shmem thps. > > In memory offline code, memory blocks containing unmovable pages should > be prevented from being offline targets by has_unmovable_pages() inside > start_isolate_page_range(). > > So it's possible to change migratability > for non-anonymous thps to avoid the issue, but it introduces more complex > and thp-specific handling in migration code, so it might not good. > > So this patch is suggesting to fix the issue by enabling thp migration > for shmem thp. Both of anon/shmem thp are migratable so we don't need > precheck about the type of thps. > > Fixes: commit 72b39cfc4d75 ("mm, memory_hotplug: do not fail offlining too early") > Signed-off-by: Naoya Horiguchi > Cc: stable@vger.kernel.org # v4.15+ I do not really feel qualified to give my ack but this is the right approach for the fix. We simply do expect that LRU pages are migrateable as well as zone_movable pages. Andrew, do you plan to take it (with Kirill's ack). Thanks! > --- > mm/huge_memory.c | 5 ++++- > mm/migrate.c | 19 ++++++++++++++++--- > mm/rmap.c | 3 --- > 3 files changed, 20 insertions(+), 7 deletions(-) > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 2aff58624886..933c1bbd3464 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -2926,7 +2926,10 @@ void remove_migration_pmd(struct page_vma_mapped_walk *pvmw, struct page *new) > pmde = maybe_pmd_mkwrite(pmde, vma); > > flush_cache_range(vma, mmun_start, mmun_start + HPAGE_PMD_SIZE); > - page_add_anon_rmap(new, vma, mmun_start, true); > + if (PageAnon(new)) > + page_add_anon_rmap(new, vma, mmun_start, true); > + else > + page_add_file_rmap(new, true); > set_pmd_at(mm, mmun_start, pvmw->pmd, pmde); > if (vma->vm_flags & VM_LOCKED) > mlock_vma_page(new); > diff --git a/mm/migrate.c b/mm/migrate.c > index bdef905b1737..f92dd9f50981 100644 > --- a/mm/migrate.c > +++ b/mm/migrate.c > @@ -472,7 +472,7 @@ int migrate_page_move_mapping(struct address_space *mapping, > pslot = radix_tree_lookup_slot(&mapping->i_pages, > page_index(page)); > > - expected_count += 1 + page_has_private(page); > + expected_count += hpage_nr_pages(page) + page_has_private(page); > if (page_count(page) != expected_count || > radix_tree_deref_slot_protected(pslot, > &mapping->i_pages.xa_lock) != page) { > @@ -505,7 +505,7 @@ int migrate_page_move_mapping(struct address_space *mapping, > */ > newpage->index = page->index; > newpage->mapping = page->mapping; > - get_page(newpage); /* add cache reference */ > + page_ref_add(newpage, hpage_nr_pages(page)); /* add cache reference */ > if (PageSwapBacked(page)) { > __SetPageSwapBacked(newpage); > if (PageSwapCache(page)) { > @@ -524,13 +524,26 @@ int migrate_page_move_mapping(struct address_space *mapping, > } > > radix_tree_replace_slot(&mapping->i_pages, pslot, newpage); > + if (PageTransHuge(page)) { > + int i; > + int index = page_index(page); > + > + for (i = 0; i < HPAGE_PMD_NR; i++) { > + pslot = radix_tree_lookup_slot(&mapping->i_pages, > + index + i); > + radix_tree_replace_slot(&mapping->i_pages, pslot, > + newpage + i); > + } > + } else { > + radix_tree_replace_slot(&mapping->i_pages, pslot, newpage); > + } > > /* > * Drop cache reference from old page by unfreezing > * to one less reference. > * We know this isn't the last reference. > */ > - page_ref_unfreeze(page, expected_count - 1); > + page_ref_unfreeze(page, expected_count - hpage_nr_pages(page)); > > xa_unlock(&mapping->i_pages); > /* Leave irq disabled to prevent preemption while updating stats */ > diff --git a/mm/rmap.c b/mm/rmap.c > index f0dd4e4565bc..8d5337fed37b 100644 > --- a/mm/rmap.c > +++ b/mm/rmap.c > @@ -1374,9 +1374,6 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma, > if (!pvmw.pte && (flags & TTU_MIGRATION)) { > VM_BUG_ON_PAGE(PageHuge(page) || !PageTransCompound(page), page); > > - if (!PageAnon(page)) > - continue; > - > set_pmd_migration_entry(&pvmw, page); > continue; > } > -- > 2.7.4 -- Michal Hocko SUSE Labs