From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B4DF5C43331 for ; Sat, 28 Mar 2020 00:39:19 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 669C62071B for ; Sat, 28 Mar 2020 00:39:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=shutemov-name.20150623.gappssmtp.com header.i=@shutemov-name.20150623.gappssmtp.com header.b="dPqibDBO" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 669C62071B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=shutemov.name Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 114DA6B0010; Fri, 27 Mar 2020 20:39:19 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 0C5A56B0032; Fri, 27 Mar 2020 20:39:19 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F1CE06B0036; Fri, 27 Mar 2020 20:39:18 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0219.hostedemail.com [216.40.44.219]) by kanga.kvack.org (Postfix) with ESMTP id D850C6B0010 for ; Fri, 27 Mar 2020 20:39:18 -0400 (EDT) Received: from smtpin14.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id A3699180AD80F for ; Sat, 28 Mar 2020 00:39:18 +0000 (UTC) X-FDA: 76642911996.14.drug51_8b7326f91ed21 X-HE-Tag: drug51_8b7326f91ed21 X-Filterd-Recvd-Size: 7721 Received: from mail-lj1-f194.google.com (mail-lj1-f194.google.com [209.85.208.194]) by imf25.hostedemail.com (Postfix) with ESMTP for ; Sat, 28 Mar 2020 00:39:18 +0000 (UTC) Received: by mail-lj1-f194.google.com with SMTP id r7so4432681ljg.13 for ; Fri, 27 Mar 2020 17:39:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shutemov-name.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=ROVVm02F2mPkayCz7uQ6Dt9NevyTnSqVmIYy5v5l5Jo=; b=dPqibDBOUmASG5925G2ZlgjrRvuC2qrI228mL0pONlSIkjTZVmjRNI10vxw6i0+RtS mMp9hKI1cI7ktHlWzwwXBAn5utTfvn4sxIfc9m4PWyerh18JD3RigwK56fqr+0LpHMGm IYiI30XcYa7xLkVj4KfKQFWmOEJZ9mqXjZrizI+aywolJvreeLt06WeyLEQV1ayO4iI7 IlOtAXKThyYguyIRozcWty4AqG7PYgqg9RQBFD6ruMffEC4KELmyvQme/yDuyaajd4M1 gTaroYmiU0bCEvMkCuHyhLCuou/zn3sVW6HReVPpuyZy9kUINsqkNtL+c+t6pgKuNHuz vlLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=ROVVm02F2mPkayCz7uQ6Dt9NevyTnSqVmIYy5v5l5Jo=; b=oSKwzNyhfiKNPYLPDSAaZH+wEwCLNH8GV4VtLCnuKVoXDfrGdLl6ccUzUqQc0CL6ak dhAiPNmCyKH3+icbo8A0enzXuh/U3ASRsEXipWrHyBWTr6cjUe0qqXZzAYi58px6WC5L ICdYM2txjZQREGzesmTZ+9hRKizT9oKAOBRu/5JnDjV34W8t/vFv+R6SYE7SXh0vQsjJ LOAfw12GU9iiOBlh8CkS4ZgeuYtBVzADzEZRvLePdPySKL0cqpOmlE3IHjM0KoX87ar/ D2wuaIh7WFdaT4XimCQmTO1ZVoTey8qS61TCD+f2eQbNkrNO7BtSrxyOg5Fuche8FS4v nZdw== X-Gm-Message-State: AGi0PuanMyMXyZ8RaBxfASiTnAnYQNEynqhbJmCwG3HsDnGMtOyuqCEj vdYp2EzJR1jVzNtOpSU/2fGNhDbXT0I= X-Google-Smtp-Source: APiQypIjWcZmokSE8JnEIwfVDD63eD3JlED/W7CxFSGEv7rcd/wJ5hISLbAVMoOnxciWUNr43dpM9g== X-Received: by 2002:a2e:b4e9:: with SMTP id s9mr892429ljm.108.1585355956345; Fri, 27 Mar 2020 17:39:16 -0700 (PDT) Received: from box.localdomain ([86.57.175.117]) by smtp.gmail.com with ESMTPSA id z5sm3608240lfq.71.2020.03.27.17.39.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Mar 2020 17:39:15 -0700 (PDT) Received: by box.localdomain (Postfix, from userid 1000) id 2CFD1101C38; Sat, 28 Mar 2020 03:39:20 +0300 (+03) Date: Sat, 28 Mar 2020 03:39:20 +0300 From: "Kirill A. Shutemov" To: Zi Yan Cc: akpm@linux-foundation.org, Andrea Arcangeli , linux-mm@kvack.org, linux-kernel@vger.kernel.org, "Kirill A. Shutemov" Subject: Re: [PATCH 5/7] khugepaged: Allow to collapse PTE-mapped compound pages Message-ID: <20200328003920.xvkt3hp65uccsq7b@box> References: <20200327170601.18563-1-kirill.shutemov@linux.intel.com> <20200327170601.18563-6-kirill.shutemov@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Fri, Mar 27, 2020 at 02:55:06PM -0400, Zi Yan wrote: > On 27 Mar 2020, at 13:05, Kirill A. Shutemov wrote: >=20 > > We can collapse PTE-mapped compound pages. We only need to avoid > > handling them more than once: lock/unlock page only once if it's pres= ent > > in the PMD range multiple times as it handled on compound level. The > > same goes for LRU isolation and putpack. >=20 > s/putpack/putback/ >=20 > > > > Signed-off-by: Kirill A. Shutemov > > --- > > mm/khugepaged.c | 41 +++++++++++++++++++++++++++++++---------- > > 1 file changed, 31 insertions(+), 10 deletions(-) > > > > diff --git a/mm/khugepaged.c b/mm/khugepaged.c > > index b47edfe57f7b..c8c2c463095c 100644 > > --- a/mm/khugepaged.c > > +++ b/mm/khugepaged.c > > @@ -515,6 +515,17 @@ void __khugepaged_exit(struct mm_struct *mm) > > > > static void release_pte_page(struct page *page) > > { > > + /* > > + * We need to unlock and put compound page on LRU only once. > > + * The rest of the pages have to be locked and not on LRU here. > > + */ > > + VM_BUG_ON_PAGE(!PageCompound(page) && > > + (!PageLocked(page) && PageLRU(page)), page); > It only checks base pages. That's the point. > Add >=20 > VM_BUG_ON_PAGE(PageCompound(page) && PageLocked(page) && PageLRU(page),= page); >=20 > to check for compound pages. The compound page may be locked here if the function called for the first time for the page and not locked after that (becouse we've unlocked it we saw it the first time). The same with LRU. > > + > > + if (!PageLocked(page)) > > + return; > > + > > + page =3D compound_head(page); > > dec_node_page_state(page, NR_ISOLATED_ANON + page_is_file_cache(pag= e)); > > unlock_page(page); > > putback_lru_page(page); > > @@ -537,6 +548,7 @@ static int __collapse_huge_page_isolate(struct vm= _area_struct *vma, > > pte_t *_pte; > > int none_or_zero =3D 0, result =3D 0, referenced =3D 0; > > bool writable =3D false; > > + LIST_HEAD(compound_pagelist); > > > > for (_pte =3D pte; _pte < pte+HPAGE_PMD_NR; > > _pte++, address +=3D PAGE_SIZE) { > > @@ -561,13 +573,23 @@ static int __collapse_huge_page_isolate(struct = vm_area_struct *vma, > > goto out; > > } > > > > - /* TODO: teach khugepaged to collapse THP mapped with pte */ > > + VM_BUG_ON_PAGE(!PageAnon(page), page); > > + > > if (PageCompound(page)) { > > - result =3D SCAN_PAGE_COMPOUND; > > - goto out; > > - } > > + struct page *p; > > + page =3D compound_head(page); > > > > - VM_BUG_ON_PAGE(!PageAnon(page), page); > > + /* > > + * Check if we have dealt with the compount page >=20 > s/compount/compound/ >=20 Thanks. > > + * already > > + */ > > + list_for_each_entry(p, &compound_pagelist, lru) { > > + if (page =3D=3D p) > > + break; > > + } > > + if (page =3D=3D p) > > + continue; > > + } > > > > /* > > * We can do it before isolate_lru_page because the > > @@ -640,6 +662,9 @@ static int __collapse_huge_page_isolate(struct vm= _area_struct *vma, > > page_is_young(page) || PageReferenced(page) || > > mmu_notifier_test_young(vma->vm_mm, address)) > > referenced++; > > + > > + if (PageCompound(page)) > > + list_add_tail(&page->lru, &compound_pagelist); > > } > > if (likely(writable)) { > > if (likely(referenced)) { >=20 > Do we need a list here? There should be at most one compound page we wi= ll see here, right? Um? It's outside the pte loop. We get here once per PMD range. 'page' argument to trace_mm_collapse_huge_page_isolate() is misleading: it's just the last page handled in the loop. >=20 > If a compound page is seen here, can we bail out the loop early? I gues= s not, > because we can a partially mapped compound page at the beginning or the= end of a VMA, right? >=20 > > @@ -1185,11 +1210,7 @@ static int khugepaged_scan_pmd(struct mm_struc= t *mm, > > goto out_unmap; > > } > > > > - /* TODO: teach khugepaged to collapse THP mapped with pte */ > > - if (PageCompound(page)) { > > - result =3D SCAN_PAGE_COMPOUND; > > - goto out_unmap; > > - } > > + page =3D compound_head(page); > > > > /* > > * Record which node the original page is from and save this > > --=20 > > 2.26.0 >=20 >=20 > =E2=80=94 > Best Regards, > Yan Zi --=20 Kirill A. Shutemov