Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp1595143ybi; Wed, 17 Jul 2019 18:23:14 -0700 (PDT) X-Google-Smtp-Source: APXvYqz0+RBqPyf9hGt9nYFREpkedb4Uj3E9YGLWSt75L6UJPnmkkrg2C2/nfWbJ7riAz3beMt3j X-Received: by 2002:a17:902:9a85:: with SMTP id w5mr46973513plp.221.1563412994080; Wed, 17 Jul 2019 18:23:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1563412994; cv=none; d=google.com; s=arc-20160816; b=g+tyjJtYs8/+C8cAdD2kOtvZiXMQH4tXjL4e5sJtolVWdJKGxl69NmRokmdNldPR3A qNjhIXvQ7Qc+5Fsz8FwXP6f8OOhhPvhgubFT4ZKkPJ5ZGjAigTXZQ6i13T+dvBUR2xUX 0ldaoLBQ6FHC+8MoZlNRaE0gVeZ1GBlYcnq/Ur0B1dSjjxdDOhQKk8cfZv3UVNYw0FKR vwm4y7GCTNXT0L1kDJmv3alft/stbC1MGcASLH99LBdqRFQHAtYj7iFYL5XvCux7rlhh 8OeJ6883ePeEOmkG8flqZoL+yuj5zwxsTeTLgxFnIKzPTn21S9vgn0XKixjv5RzBpkyP QrxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:cc:to:from :subject; bh=yhkZePYGOsmRDBQs9LKrGT1stoN0QsbIdPg010xMSkw=; b=xqU7bqWI3uZOQChO0RkfofpG+J9ql9mTRRrZInQxFmAVkEyMdDsRdHVpPySBthgI3l tWYoxIxAwJ45P9JLtyd/Utogcp4slPtltL0dJi8ICkgDG0H8H23pigCWF3F/kdKHB2IC RQFkYFHEr3LeygPHXYUQT1O8Yhr02SJxLEnDMGr3m0EqhZPeLpY9mFJVJ3ocPlAqJ2k5 tOitAWwyZC67mSXyrYG6bEI6amBfeYHr5WAlm6oD3T0sSzSYiEJf3Ad7PkD0yYe4orRV CTlxmbLOzxYQwXh+8PSypriS3umxNmQKoPeOVdvIgflEM4cydPryAqo4NHKIQZK4/S2E Uvfg== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x25si889494pfn.13.2019.07.17.18.22.58; Wed, 17 Jul 2019 18:23:14 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732670AbfGRBWW (ORCPT + 99 others); Wed, 17 Jul 2019 21:22:22 -0400 Received: from mga04.intel.com ([192.55.52.120]:24106 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732571AbfGRBWW (ORCPT ); Wed, 17 Jul 2019 21:22:22 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Jul 2019 18:22:21 -0700 X-IronPort-AV: E=Sophos;i="5.64,276,1559545200"; d="scan'208";a="168124002" Received: from dwillia2-desk3.jf.intel.com (HELO dwillia2-desk3.amr.corp.intel.com) ([10.54.39.16]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Jul 2019 18:22:21 -0700 Subject: [PATCH v2 3/7] libnvdimm/region: Register badblocks before namespaces From: Dan Williams To: linux-nvdimm@lists.01.org Cc: stable@vger.kernel.org, Vishal Verma , peterz@infradead.org, linux-kernel@vger.kernel.org Date: Wed, 17 Jul 2019 18:08:03 -0700 Message-ID: <156341208365.292348.1547528796026249120.stgit@dwillia2-desk3.amr.corp.intel.com> In-Reply-To: <156341206785.292348.1660822720191643298.stgit@dwillia2-desk3.amr.corp.intel.com> References: <156341206785.292348.1660822720191643298.stgit@dwillia2-desk3.amr.corp.intel.com> User-Agent: StGit/0.18-2-gc94f MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Namespace activation expects to be able to reference region badblocks. The following warning sometimes triggers when asynchronous namespace activation races in front of the completion of namespace probing. Move all possible namespace probing after region badblocks initialization. Otherwise, lockdep sometimes catches the uninitialized state of the badblocks seqlock with stack trace signatures like: INFO: trying to register non-static key. pmem2: detected capacity change from 0 to 136365211648 the code is fine but needs lockdep annotation. turning off the locking correctness validator. CPU: 9 PID: 358 Comm: kworker/u80:5 Tainted: G OE 5.2.0-rc4+ #3382 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 Workqueue: events_unbound async_run_entry_fn Call Trace: dump_stack+0x85/0xc0 pmem1.12: detected capacity change from 0 to 8589934592 register_lock_class+0x56a/0x570 ? check_object+0x140/0x270 __lock_acquire+0x80/0x1710 ? __mutex_lock+0x39d/0x910 lock_acquire+0x9e/0x180 ? nd_pfn_validate+0x28f/0x440 [libnvdimm] badblocks_check+0x93/0x1f0 ? nd_pfn_validate+0x28f/0x440 [libnvdimm] nd_pfn_validate+0x28f/0x440 [libnvdimm] ? lockdep_hardirqs_on+0xf0/0x180 nd_dax_probe+0x9a/0x120 [libnvdimm] nd_pmem_probe+0x6d/0x180 [nd_pmem] nvdimm_bus_probe+0x90/0x2c0 [libnvdimm] Fixes: 48af2f7e52f4 ("libnvdimm, pfn: during init, clear errors...") Cc: Cc: Vishal Verma Signed-off-by: Dan Williams --- drivers/nvdimm/region.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/nvdimm/region.c b/drivers/nvdimm/region.c index ef46cc3a71ae..488c47ac4c4a 100644 --- a/drivers/nvdimm/region.c +++ b/drivers/nvdimm/region.c @@ -34,17 +34,6 @@ static int nd_region_probe(struct device *dev) if (rc) return rc; - rc = nd_region_register_namespaces(nd_region, &err); - if (rc < 0) - return rc; - - ndrd = dev_get_drvdata(dev); - ndrd->ns_active = rc; - ndrd->ns_count = rc + err; - - if (rc && err && rc == err) - return -ENODEV; - if (is_nd_pmem(&nd_region->dev)) { struct resource ndr_res; @@ -60,6 +49,17 @@ static int nd_region_probe(struct device *dev) nvdimm_badblocks_populate(nd_region, &nd_region->bb, &ndr_res); } + rc = nd_region_register_namespaces(nd_region, &err); + if (rc < 0) + return rc; + + ndrd = dev_get_drvdata(dev); + ndrd->ns_active = rc; + ndrd->ns_count = rc + err; + + if (rc && err && rc == err) + return -ENODEV; + nd_region->btt_seed = nd_btt_create(nd_region); nd_region->pfn_seed = nd_pfn_create(nd_region); nd_region->dax_seed = nd_dax_create(nd_region);