Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp807804pxb; Fri, 22 Apr 2022 11:34:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyLyEpfTI4026Evp0DwA40iR0eyqUEbf0RqWyxiAEWZuOvwMcbcAkIzyw1JuJnrEDFq3jZb X-Received: by 2002:a17:902:f605:b0:14d:9e11:c864 with SMTP id n5-20020a170902f60500b0014d9e11c864mr5888948plg.54.1650652476040; Fri, 22 Apr 2022 11:34:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650652476; cv=none; d=google.com; s=arc-20160816; b=Z/VvEEqlAU0AnFzhuqRbQzlzKknkRemTPqpS09W5uLwd5U2XtNAf5QL7FhpyuGmW4b neg0WaoC95iONP7YlHffAxkjQ52ILXWTf6XsE407l1rfpEutVEHpStKiRLiIhL9Q9XRJ ASM+e/4xYGm5B5bP6aQXp65gX2Rx2Dvz1lTrW0rb+43EKrES7F9y42/h5aJc65k0S1j1 +p0Ex/dxa8hDGZhaEEeo6XO3Or4jJYGcbAtF/v/ExHkhJ+v/cA3sdH0VmRLwgC/U/ZhD hZ6+vGcLrTpsUAczMt+lO7MS4YSjfZxeAgw0S2bu9nUHXhH3g/08hhyA3y+qgNzKCKbG 4Vcg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:cc:to:from :subject:dkim-signature; bh=WSRSz6CXYSaW49J6ranFls4MlzoYvo/FjuvhFRIr1WI=; b=ToHtky91i/JQB+a3h7Asj5whcqGrDH2xocWBms92SBqz6c7baME1WthRVLyy/kM/kD MZa9uvqWCi7iYfV/qDXcXdKreMSY9U0D7pK4i3ya3B5S58PvbTUmIx3F/TGN1usNlF66 BvBRpbJD8uVe4aAWKxiroZKSAbo2sl3tJz0JEtrztkg5TqiagVM6NNcXEm5RoLw0aaCT whmxDOD6cUVfROsZ8KS/3lIeZdyHW+TgXB1FelEQD8Refk/6dUtW/+0dyDSmQZhFlWpo wSAor2c2/DK3LumQblRnuvjH490AzJaQY8XGOtvtC2Nt2kXsEluHKv3mDMiplC9R5Soq pBqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=VoaT3SlF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id p1-20020a170902bd0100b001587083c785si8306708pls.405.2022.04.22.11.34.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Apr 2022 11:34:36 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=VoaT3SlF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id AB11C11838A; Fri, 22 Apr 2022 11:03:10 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1390207AbiDUPjj (ORCPT + 99 others); Thu, 21 Apr 2022 11:39:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35176 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377040AbiDUPjd (ORCPT ); Thu, 21 Apr 2022 11:39:33 -0400 Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9A39D47066; Thu, 21 Apr 2022 08:36:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1650555403; x=1682091403; h=subject:from:to:cc:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=b12rEqc7iUpGB3utf8444UKsKjTJOKJnfs9Yk6b7HUQ=; b=VoaT3SlFsyqjrzorp5DOImQLNmAKXJpz6OKXXMRpbW6tHW9dGV1GM6dC a0THAEFENSXUmAFCruzd0ZXi0egkEZApM2KZtJxf2dkpt8z+kq3Hfh1kH vtR1IxHPBjK2gSbUy1qXL4dNcqYeXomUmR0W11rwavprb3tS5s7KoBEff 21aJ8j7U0pU7Yc91GYJ5D0dRrTWQFzg+dvKPAZjVL69e+pTu7sCoUWRnt hD6+eWVJwJ+z179oQmU8JDmlnVaOF58vDA1VuKsHSIr0vqNSMzaddI94l jRUjOFmoOzWe+1mAHVRFJGdp0FA2a6PhUnvBnCLCGCne2anLEWUPRYMyW g==; X-IronPort-AV: E=McAfee;i="6400,9594,10324"; a="324837860" X-IronPort-AV: E=Sophos;i="5.90,279,1643702400"; d="scan'208";a="324837860" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga104.jf.intel.com with ESMTP; 21 Apr 2022 08:33:19 -0700 X-IronPort-AV: E=Sophos;i="5.90,279,1643702400"; d="scan'208";a="670939693" Received: from dwillia2-desk3.jf.intel.com (HELO dwillia2-desk3.amr.corp.intel.com) ([10.54.39.25]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Apr 2022 08:33:18 -0700 Subject: [PATCH v3 2/8] cxl/acpi: Add root device lockdep validation From: Dan Williams To: linux-cxl@vger.kernel.org Cc: Peter Zijlstra , Greg Kroah-Hartman , "Rafael J. Wysocki" , Ingo Molnar , Will Deacon , Waiman Long , Boqun Feng , Alison Schofield , Vishal Verma , Ira Weiny , Ben Widawsky , Jonathan Cameron , nvdimm@lists.linux.dev, linux-kernel@vger.kernel.org Date: Thu, 21 Apr 2022 08:33:18 -0700 Message-ID: <165055519869.3745911.10162603933337340370.stgit@dwillia2-desk3.amr.corp.intel.com> In-Reply-To: <165055518776.3745911.9346998911322224736.stgit@dwillia2-desk3.amr.corp.intel.com> References: <165055518776.3745911.9346998911322224736.stgit@dwillia2-desk3.amr.corp.intel.com> User-Agent: StGit/0.18-3-g996c MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The CXL "root" device, ACPI0017, is an attach point for coordinating platform level CXL resources and is the parent device for a CXL port topology tree. As such it has distinct locking rules relative to other CXL subsystem objects, but because it is an ACPI device the lock class is established well before it is given to the cxl_acpi driver. However, the lockdep API does support changing the lock class "live" for situations like this. Add a device_lock_set_class() helper that a driver can use in ->probe() to set a custom lock class, and device_lock_reset_class() to return to the default "no validate" class before the custom lock class key goes out of scope after ->remove(). Note the helpers are all macros to support dead code elimination in the CONFIG_PROVE_LOCKING=n case. Suggested-by: Peter Zijlstra Cc: Greg Kroah-Hartman Cc: "Rafael J. Wysocki" Cc: Ingo Molnar Cc: Will Deacon Cc: Waiman Long Cc: Boqun Feng Cc: Alison Schofield Cc: Vishal Verma Cc: Ira Weiny Cc: Ben Widawsky Cc: Jonathan Cameron Signed-off-by: Dan Williams --- drivers/cxl/acpi.c | 15 +++++++++++++++ include/linux/device.h | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/drivers/cxl/acpi.c b/drivers/cxl/acpi.c index d15a6aec0331..e19cea27387e 100644 --- a/drivers/cxl/acpi.c +++ b/drivers/cxl/acpi.c @@ -275,6 +275,15 @@ static int add_root_nvdimm_bridge(struct device *match, void *data) return 1; } +static struct lock_class_key cxl_root_key; + +static void cxl_acpi_lock_reset_class(void *_dev) +{ + struct device *dev = _dev; + + device_lock_reset_class(dev); +} + static int cxl_acpi_probe(struct platform_device *pdev) { int rc; @@ -283,6 +292,12 @@ static int cxl_acpi_probe(struct platform_device *pdev) struct acpi_device *adev = ACPI_COMPANION(host); struct cxl_cfmws_context ctx; + device_lock_set_class(&pdev->dev, &cxl_root_key); + rc = devm_add_action_or_reset(&pdev->dev, cxl_acpi_lock_reset_class, + &pdev->dev); + if (rc) + return rc; + root_port = devm_cxl_add_port(host, host, CXL_RESOURCE_NONE, NULL); if (IS_ERR(root_port)) return PTR_ERR(root_port); diff --git a/include/linux/device.h b/include/linux/device.h index 93459724dcde..82c9d307e7bd 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -850,6 +850,31 @@ static inline bool device_supports_offline(struct device *dev) return dev->bus && dev->bus->offline && dev->bus->online; } +#define __device_lock_set_class(dev, name, key) \ + lock_set_class(&(dev)->mutex.dep_map, name, key, 0, _THIS_IP_) + +/** + * device_lock_set_class - Specify a temporary lock class while a device + * is attached to a driver + * @dev: device to modify + * @key: lock class key data + * + * This must be called with the device_lock() already held, for example + * from driver ->probe(). + */ +#define device_lock_set_class(dev, key) \ + __device_lock_set_class(dev, #key, key) + +/** + * device_lock_reset_class - Return a device to the default lockdep novalidate state + * @dev: device to modify + * + * This must be called with the device_lock() already held, for example + * from driver ->remove(). + */ +#define device_lock_reset_class(dev) \ + device_lock_set_class(dev, &__lockdep_no_validate__) + void lock_device_hotplug(void); void unlock_device_hotplug(void); int lock_device_hotplug_sysfs(void);