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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 86F33C433EF for ; Tue, 24 May 2022 19:35:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2A7488D0005; Tue, 24 May 2022 15:35:28 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 256868D0002; Tue, 24 May 2022 15:35:28 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 168888D0005; Tue, 24 May 2022 15:35:28 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 093C28D0002 for ; Tue, 24 May 2022 15:35:28 -0400 (EDT) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay12.hostedemail.com (Postfix) with ESMTP id CEB90120876 for ; Tue, 24 May 2022 19:35:27 +0000 (UTC) X-FDA: 79501640694.21.3FDC209 Received: from mail-pg1-f173.google.com (mail-pg1-f173.google.com [209.85.215.173]) by imf30.hostedemail.com (Postfix) with ESMTP id C506C80031 for ; Tue, 24 May 2022 19:34:58 +0000 (UTC) Received: by mail-pg1-f173.google.com with SMTP id h186so17119637pgc.3 for ; Tue, 24 May 2022 12:35:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=NGhQ6XjzeBQ4Z1lBaXWPtqbvSkb9LDrtZPpIoNTrnHs=; b=S8kCJrrjZVilbPLbgqHEtfrGGL87rjC73z2fu55PSnaB4H6N/r8D4wKI9QJWtUp1Dd uLPbAqQwT2OaOCh2RG4WtvPJJEfgy6tAtz3vTx4+No9bEXDQ/xHwTBEh8fqDf0hwm4Ha +m4I2v72Xb1OF4LHSyaSRvi7rxAUZ2F0BW+XJfsLo+qC+WDoz3UiyV6fyhg1WBA6wOP1 xRugM+4A8Ta0pv+Js3QRz/ooC+PzbF3AdQgqaRTZjcSKYtYIqlcWcy9wP5XSjBU8r0V4 6ig27H60dtcxgkkZJtjTkymdz6UT15iW3+xoYZu8yfIIPQTfHEkBtFYNttZVfCEBtKH7 NVuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=NGhQ6XjzeBQ4Z1lBaXWPtqbvSkb9LDrtZPpIoNTrnHs=; b=vUyCBWhrsN1h5HM6uggtNimtrxSySUMuLM4PGl4SItvrY/DEmDW+a6doBb8ypGMaVl tU87e7yCK6zXpnGEGsXFtdEt11OGPnsuf+uk4ftY9HJS/YAhI/s1wYiX4Ovp6BLHAvV8 j/9zvaY+h9bqby+HmOWEXlPWHn7TREJYnLaBB0EcuASXsXr+qmAcwiD4418SAcqtBora 1zuwlCrDPuHa/SXEK1lffUuWG9u5/OBlF5QG3l2Qw+1lRsy70eDBofkI9wowTjmjNRnJ mrHrlkbguyvwLCNYXkFDVNXCbgQAvc6tgwNfrnhCvXL/HPPDrtbBF2MXXnmLmsaNm391 L+GQ== X-Gm-Message-State: AOAM532qtRHAKtY769PNU4TfehfoT+YIAgBCy9T/xKVA0wdAF6Q76vcg YtE4oLFVskrLWjQXrFz1YOWRnyB4dAn3yBGgPko= X-Google-Smtp-Source: ABdhPJx8lizYS2Y4cmc3WxMnDTnpWUdWamljbY543FcBk5z/fYY1sMVHWy3gg77krOnrW8jAHscOJWAx7EuwIOSaDOA= X-Received: by 2002:a62:e518:0:b0:4fa:9333:ddbd with SMTP id n24-20020a62e518000000b004fa9333ddbdmr30019530pff.11.1653420926437; Tue, 24 May 2022 12:35:26 -0700 (PDT) MIME-Version: 1.0 References: <20220524025352.1381911-1-jiaqiyan@google.com> <20220524025352.1381911-3-jiaqiyan@google.com> In-Reply-To: <20220524025352.1381911-3-jiaqiyan@google.com> From: Yang Shi Date: Tue, 24 May 2022 12:35:13 -0700 Message-ID: Subject: Re: [PATCH v3 2/2] mm: khugepaged: recover from poisoned file-backed memory To: Jiaqi Yan Cc: Tong Tiangen , Tony Luck , =?UTF-8?B?SE9SSUdVQ0hJIE5BT1lBKOWggOWPoyDnm7TkuZ8p?= , "Kirill A. Shutemov" , Miaohe Lin , Jue Wang , Linux MM Content-Type: text/plain; charset="UTF-8" X-Stat-Signature: cs8q7ri19q6zwuce7z1zj5ujme1kx493 X-Rspam-User: Authentication-Results: imf30.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=S8kCJrrj; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf30.hostedemail.com: domain of shy828301@gmail.com designates 209.85.215.173 as permitted sender) smtp.mailfrom=shy828301@gmail.com X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: C506C80031 X-HE-Tag: 1653420898-915838 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 Mon, May 23, 2022 at 7:54 PM Jiaqi Yan wrote: > > Make collapse_file roll back when copying pages failed. > More concretely: > * extract copying operations into a separate loop > * postpone the updates for nr_none until both scanning and > copying succeeded > * postpone joining small xarray entries until both scanning and > copying succeeded > * postpone the update operations to NR_XXX_THPS > * for non-SHMEM file, roll back filemap_nr_thps_inc if scan > succeeded but copying failed > > Signed-off-by: Jiaqi Yan Reviewed-by: Yang Shi Just a nit below. > --- > mm/khugepaged.c | 77 ++++++++++++++++++++++++++++++------------------- > 1 file changed, 48 insertions(+), 29 deletions(-) > > diff --git a/mm/khugepaged.c b/mm/khugepaged.c > index 1b08e31ba081a..98976622ee7c5 100644 > --- a/mm/khugepaged.c > +++ b/mm/khugepaged.c > @@ -1716,7 +1716,7 @@ static void collapse_file(struct mm_struct *mm, > { > struct address_space *mapping = file->f_mapping; > gfp_t gfp; > - struct page *new_page; > + struct page *new_page, *page, *tmp; > pgoff_t index, end = start + HPAGE_PMD_NR; > LIST_HEAD(pagelist); > XA_STATE_ORDER(xas, &mapping->i_pages, start, HPAGE_PMD_ORDER); > @@ -1772,7 +1772,7 @@ static void collapse_file(struct mm_struct *mm, > > xas_set(&xas, start); > for (index = start; index < end; index++) { > - struct page *page = xas_next(&xas); > + page = xas_next(&xas); > > VM_BUG_ON(index != xas.xa_index); > if (is_shmem) { > @@ -1944,10 +1944,7 @@ static void collapse_file(struct mm_struct *mm, > } > nr = thp_nr_pages(new_page); > > - if (is_shmem) > - __mod_lruvec_page_state(new_page, NR_SHMEM_THPS, nr); > - else { > - __mod_lruvec_page_state(new_page, NR_FILE_THPS, nr); > + if (!is_shmem) { > filemap_nr_thps_inc(mapping); > /* > * Paired with smp_mb() in do_dentry_open() to ensure > @@ -1958,40 +1955,44 @@ static void collapse_file(struct mm_struct *mm, > smp_mb(); > if (inode_is_open_for_write(mapping->host)) { > result = SCAN_FAIL; > - __mod_lruvec_page_state(new_page, NR_FILE_THPS, -nr); > filemap_nr_thps_dec(mapping); > goto xa_locked; > } > } > > - if (nr_none) { > - __mod_lruvec_page_state(new_page, NR_FILE_PAGES, nr_none); > - if (is_shmem) > - __mod_lruvec_page_state(new_page, NR_SHMEM, nr_none); > - } > - > - /* Join all the small entries into a single multi-index entry */ > - xas_set_order(&xas, start, HPAGE_PMD_ORDER); > - xas_store(&xas, new_page); > xa_locked: > xas_unlock_irq(&xas); > xa_unlocked: > > if (result == SCAN_SUCCEED) { > - struct page *page, *tmp; > - > /* > * Replacing old pages with new one has succeeded, now we > - * need to copy the content and free the old pages. > + * attempt to copy the contents. > */ > index = start; > - list_for_each_entry_safe(page, tmp, &pagelist, lru) { > + list_for_each_entry(page, &pagelist, lru) { > while (index < page->index) { > clear_highpage(new_page + (index % HPAGE_PMD_NR)); > index++; > } > - copy_highpage(new_page + (page->index % HPAGE_PMD_NR), > - page); > + if (copy_highpage_mc(new_page + (page->index % HPAGE_PMD_NR), page)) { > + result = SCAN_COPY_MC; > + break; > + } > + index++; > + } > + while (result == SCAN_SUCCEED && index < end) { > + clear_highpage(new_page + (page->index % HPAGE_PMD_NR)); > + index++; > + } > + } > + > + if (result == SCAN_SUCCEED) { > + /* > + * Copying old pages to huge one has succeeded, now we > + * need to free the old pages. > + */ > + list_for_each_entry_safe(page, tmp, &pagelist, lru) { > list_del(&page->lru); > page->mapping = NULL; > page_ref_unfreeze(page, 1); > @@ -1999,12 +2000,23 @@ static void collapse_file(struct mm_struct *mm, > ClearPageUnevictable(page); > unlock_page(page); > put_page(page); > - index++; > } > - while (index < end) { > - clear_highpage(new_page + (index % HPAGE_PMD_NR)); > - index++; > + > + xas_lock_irq(&xas); > + if (is_shmem) > + __mod_lruvec_page_state(new_page, NR_SHMEM_THPS, nr); > + else > + __mod_lruvec_page_state(new_page, NR_FILE_THPS, nr); > + > + if (nr_none) { > + __mod_lruvec_page_state(new_page, NR_FILE_PAGES, nr_none); > + if (is_shmem) > + __mod_lruvec_page_state(new_page, NR_SHMEM, nr_none); > } > + /* Join all the small entries into a single multi-index entry. */ > + xas_set_order(&xas, start, HPAGE_PMD_ORDER); > + xas_store(&xas, new_page); > + xas_unlock_irq(&xas); > > SetPageUptodate(new_page); > page_ref_add(new_page, HPAGE_PMD_NR - 1); > @@ -2020,9 +2032,9 @@ static void collapse_file(struct mm_struct *mm, > > khugepaged_pages_collapsed++; > } else { > - struct page *page; > - > - /* Something went wrong: roll back page cache changes */ > + /* > + * Something went wrong: roll back page cache changes > + */ Changing from one line to multiple lines seems pointless. > xas_lock_irq(&xas); > mapping->nrpages -= nr_none; > > @@ -2055,6 +2067,13 @@ static void collapse_file(struct mm_struct *mm, > xas_lock_irq(&xas); > } > VM_BUG_ON(nr_none); > + /* > + * Undo the updates of filemap_nr_thps_inc for non-SHMEM file only. > + * This undo is not needed unless failure is due to SCAN_COPY_MC. > + */ > + if (!is_shmem && result == SCAN_COPY_MC) > + filemap_nr_thps_dec(mapping); > + > xas_unlock_irq(&xas); > > new_page->mapping = NULL; > -- > 2.36.1.124.g0e6072fb45-goog >