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 23D29C433F5 for ; Tue, 15 Feb 2022 22:38:21 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 976696B0078; Tue, 15 Feb 2022 17:38:20 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 924B26B007B; Tue, 15 Feb 2022 17:38:20 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7C58F6B007D; Tue, 15 Feb 2022 17:38:20 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0043.hostedemail.com [216.40.44.43]) by kanga.kvack.org (Postfix) with ESMTP id 6AEE96B0078 for ; Tue, 15 Feb 2022 17:38:20 -0500 (EST) Received: from smtpin30.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id 237C895C99 for ; Tue, 15 Feb 2022 22:38:20 +0000 (UTC) X-FDA: 79146479160.30.E0F94CA Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) by imf29.hostedemail.com (Postfix) with ESMTP id EC996120003 for ; Tue, 15 Feb 2022 22:38:18 +0000 (UTC) Received: by mail-pf1-f176.google.com with SMTP id f6so483110pfj.11 for ; Tue, 15 Feb 2022 14:38:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20210112.gappssmtp.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=83N6jbrz7Nk3njK8ABDKRljMA2AS3yoeVqMaJxkbwE4=; b=NZcAstJ9fEDIrozklG+RC9EQnCGd5vnNAmljBzFj7Frwp93akfK3W5JC/0w/lZ18dD MYqN+YgMBuM/nKcjfD2aeojlmtsQHT2+Be4zWWUs2s6SZLdqRp6AVGU1oryJJeClc7Kt XtHnfx8AOWkte0H2aoUZtq0u17D5yDLE3VhNbvYCHpY7QmFnYpsfRHTkw9EV1u+7l2yC JmubuJ1AB28ViO/8hEO0kHPsixIW9HU4iwOXN+/f6B4W4+9OHIHZcRTrv/eeN/Z6zSwS WAIwsOTjCBT/cguKvVlDE+i1V2yXum0gE9hA8+qaxza2iGH1wIlB8bXWrlVlVNHdSIRX k7Tw== 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=83N6jbrz7Nk3njK8ABDKRljMA2AS3yoeVqMaJxkbwE4=; b=FkVxJOCvx0SZeOOtYv1kymvvTITmZ6QvxpI2wTvf4jQOzqdKB2AywSa2QmaIUkd2S0 XDmYFWzJLNNV0yHsEhp8uXAcAuoMMNaP2up948ybmw+A6/1qyEzhDDG1MAS1aBqQyAwt uVlXhwohKBAH+A+t9VdeFRsBMATxSeZsjxpdvhYxJFybNJAqHXSKXeP87xlnExmGYPkO rufnyPVWK/1+SgUB+aPJdHTqfQjHHi05A6gd8N3lVK0nW9v0w/lnM483UKBTaGlFL4/G 0DPWUpAOiT/Kes03sn/L7T5nr7bqAWwUKnWmeGuC71SJv7t/fZc2YXvBtcNb+70wUD6X tnDg== X-Gm-Message-State: AOAM53079rExiyCtwZlDoduG2mFz4+HJq4fbxE7z0QYbXa/+fvTE/AEC Ey3gNJ55g/t2dSvTjq5pmNB/QjMkzJFb8i5c1f3bBg== X-Google-Smtp-Source: ABdhPJwyiOHriZYIH+JGn4mCV9FeAMpy8ae1cYWDts5xxcI1rDCUtkY8xoI1fwtyNIRCDQmS/O9n6n/LNqhqdjINLRE= X-Received: by 2002:a05:6a00:8ca:b0:4e0:2ed3:5630 with SMTP id s10-20020a056a0008ca00b004e02ed35630mr30392pfu.3.1644964697734; Tue, 15 Feb 2022 14:38:17 -0800 (PST) MIME-Version: 1.0 References: <20220127124058.1172422-1-ruansy.fnst@fujitsu.com> <20220127124058.1172422-4-ruansy.fnst@fujitsu.com> In-Reply-To: <20220127124058.1172422-4-ruansy.fnst@fujitsu.com> From: Dan Williams Date: Tue, 15 Feb 2022 14:38:11 -0800 Message-ID: Subject: Re: [PATCH v10 3/9] pagemap,pmem: Introduce ->memory_failure() To: Shiyang Ruan Cc: Linux Kernel Mailing List , linux-xfs , Linux NVDIMM , Linux MM , linux-fsdevel , "Darrick J. Wong" , david , Christoph Hellwig , Jane Chu , Christoph Hellwig Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: EC996120003 X-Stat-Signature: 7khkb7dxdmh19m5x8851wezmoymoeepq Authentication-Results: imf29.hostedemail.com; dkim=pass header.d=intel-com.20210112.gappssmtp.com header.s=20210112 header.b=NZcAstJ9; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=intel.com (policy=none); spf=none (imf29.hostedemail.com: domain of dan.j.williams@intel.com has no SPF policy when checking 209.85.210.176) smtp.mailfrom=dan.j.williams@intel.com X-HE-Tag: 1644964698-278101 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 Thu, Jan 27, 2022 at 4:41 AM Shiyang Ruan wrote: > > When memory-failure occurs, we call this function which is implemented > by each kind of devices. For the fsdax case, pmem device driver > implements it. Pmem device driver will find out the filesystem in which > the corrupted page located in. > > With dax_holder notify support, we are able to notify the memory failure > from pmem driver to upper layers. If there is something not support in > the notify routine, memory_failure will fall back to the generic hanlder. > > Signed-off-by: Shiyang Ruan > Reviewed-by: Christoph Hellwig > --- > drivers/nvdimm/pmem.c | 16 ++++++++++++++++ > include/linux/memremap.h | 12 ++++++++++++ > mm/memory-failure.c | 14 ++++++++++++++ > 3 files changed, 42 insertions(+) > > diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c > index 58d95242a836..0a6e8698d086 100644 > --- a/drivers/nvdimm/pmem.c > +++ b/drivers/nvdimm/pmem.c > @@ -366,6 +366,20 @@ static void pmem_release_disk(void *__pmem) > blk_cleanup_disk(pmem->disk); > } > > +static int pmem_pagemap_memory_failure(struct dev_pagemap *pgmap, > + unsigned long pfn, u64 len, int mf_flags) > +{ > + struct pmem_device *pmem = > + container_of(pgmap, struct pmem_device, pgmap); > + u64 offset = PFN_PHYS(pfn) - pmem->phys_addr - pmem->data_offset; > + > + return dax_holder_notify_failure(pmem->dax_dev, offset, len, mf_flags); > +} > + > +static const struct dev_pagemap_ops fsdax_pagemap_ops = { > + .memory_failure = pmem_pagemap_memory_failure, > +}; > + > static int pmem_attach_disk(struct device *dev, > struct nd_namespace_common *ndns) > { > @@ -427,6 +441,7 @@ static int pmem_attach_disk(struct device *dev, > pmem->pfn_flags = PFN_DEV; > if (is_nd_pfn(dev)) { > pmem->pgmap.type = MEMORY_DEVICE_FS_DAX; > + pmem->pgmap.ops = &fsdax_pagemap_ops; > addr = devm_memremap_pages(dev, &pmem->pgmap); > pfn_sb = nd_pfn->pfn_sb; > pmem->data_offset = le64_to_cpu(pfn_sb->dataoff); > @@ -440,6 +455,7 @@ static int pmem_attach_disk(struct device *dev, > pmem->pgmap.range.end = res->end; > pmem->pgmap.nr_range = 1; > pmem->pgmap.type = MEMORY_DEVICE_FS_DAX; > + pmem->pgmap.ops = &fsdax_pagemap_ops; > addr = devm_memremap_pages(dev, &pmem->pgmap); > pmem->pfn_flags |= PFN_MAP; > bb_range = pmem->pgmap.range; > diff --git a/include/linux/memremap.h b/include/linux/memremap.h > index 1fafcc38acba..f739318b496f 100644 > --- a/include/linux/memremap.h > +++ b/include/linux/memremap.h > @@ -77,6 +77,18 @@ struct dev_pagemap_ops { > * the page back to a CPU accessible page. > */ > vm_fault_t (*migrate_to_ram)(struct vm_fault *vmf); > + > + /* > + * Handle the memory failure happens on a range of pfns. Notify the > + * processes who are using these pfns, and try to recover the data on > + * them if necessary. The mf_flags is finally passed to the recover > + * function through the whole notify routine. > + * > + * When this is not implemented, or it returns -EOPNOTSUPP, the caller > + * will fall back to a common handler called mf_generic_kill_procs(). > + */ > + int (*memory_failure)(struct dev_pagemap *pgmap, unsigned long pfn, > + u64 len, int mf_flags); I think it is odd to have the start address be in terms of pfns and the length by in terms of bytes. I would either change @len to @nr_pages, or change @pfn to @phys and make it a phys_addr_t. Otherwise you can add, Reviewed-by: Dan Williams