Received: by 2002:a05:6358:16cc:b0:ea:6187:17c9 with SMTP id r12csp9015669rwl; Tue, 10 Jan 2023 23:46:48 -0800 (PST) X-Google-Smtp-Source: AMrXdXvq+Po9SF9Km0fM8CQ3yDQG7SNY9NhE4aeOLO4XkIXH43Mz1p1/6UNoTCW/savSH75Z+itS X-Received: by 2002:a17:902:ab96:b0:192:8d52:45e6 with SMTP id f22-20020a170902ab9600b001928d5245e6mr1716260plr.11.1673423208548; Tue, 10 Jan 2023 23:46:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673423208; cv=none; d=google.com; s=arc-20160816; b=QL5hH/rZONLleYvJTQy5qHq+1pVAqRd9rAOO3/EXOaw7hhtNqj5xSdgWLV/13Ro2Y/ EgzaWRhOsASA+Ut4wDgR1W13t9+y2YIEgNDWuY05yFGGIL4htGbgV8/KLcqUCNWLqRxx NeM8NfuTeMgRAclKq3B7bdTE0Rn8P8Zf8x1j5jf2EayBen5hXDvXNhQtSFcHU1PIrf8g TF4/EcVF0GfGDokHO7cXLLMkQ6WseTtLEV3iEZdrLefX9YFI0hA2HoxANQ4R4iAsI3S8 HO97p5IGZn1iXWmskgXawKcAIXVeQRVYeUg8qIM3YMvtWUM9ERaiCTKAvMflKmWwmVNu Lhkw== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=91Hl8ALzV5o3Qqh2oJ2f58Tkievk2YyNfJYPWLBG5zY=; b=UvwfxlmkCQunISts7OObEdOdvmVYrozJrZ4tFXt7OE5RASEEaGWfem7TzSsF3taLIW Y55+gTLeunRW+l+JEbNlkPhGlsPAjQfap8A1s6QGPm3uaLcPxCgUhJCU4Z+Cr/J7+XTG Xn3YYczw8NlPOueBwgc03d8CZIAGtXhOER6qECXRDT3IBlnOYzEUNSGEgGqf4KvMh6va VT1BssnmzN7wspKmhUFKmxnWIuwC9NdeHfasJyc/5TNiGG6guABnBxSJOP6hpAXlZgj7 jLU4ZP1MMyoYPgpl9h9Rxh1LjfjTpKmvhwe4S7XGSoweNYr0EU0z8sacb9W84RPlDWww ONkA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=KOC8hIBS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ba9-20020a170902720900b00192972afbc5si13145094plb.459.2023.01.10.23.46.42; Tue, 10 Jan 2023 23:46:48 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=KOC8hIBS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231294AbjAKHly (ORCPT + 53 others); Wed, 11 Jan 2023 02:41:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49526 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230283AbjAKHlw (ORCPT ); Wed, 11 Jan 2023 02:41:52 -0500 Received: from mail-pj1-x102f.google.com (mail-pj1-x102f.google.com [IPv6:2607:f8b0:4864:20::102f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 11EABB7F3 for ; Tue, 10 Jan 2023 23:41:51 -0800 (PST) Received: by mail-pj1-x102f.google.com with SMTP id cp9-20020a17090afb8900b00226a934e0e5so3053724pjb.1 for ; Tue, 10 Jan 2023 23:41:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=91Hl8ALzV5o3Qqh2oJ2f58Tkievk2YyNfJYPWLBG5zY=; b=KOC8hIBS7gHa/z1x6KYK3seu/8QGIKV7MfnUR3HhqTKq5quWCtTXmOpFs/TdNvU8uR mjl+orXvITfxVIQt2xarBTgcMbyUZOjQuCH2nOsjUlkxK+0SaQfcCiuK5DGGxoAal+7B aZ7byKYIBQMPIxd2sgt0BaQ5n7c3sBbGpe28k= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=91Hl8ALzV5o3Qqh2oJ2f58Tkievk2YyNfJYPWLBG5zY=; b=h/lkEg/SST+2cLy0rpwQTkO3vJupCAJeNsSJZzA2EXNWL4Wk3aDWu0epRAC/xaiSLr a8d6CzpyYp5b4sokPcWud69bGJm/gSNbV+RYdutmjHrteHWH5JirpM7T3pkIjU30Yhtd OOIr3A0bLiDB8WQnbPtb4ZkfmbLjpciPln6Otyi3c8LHJwa39KxgBPxhdcExQajiRNZr FmN0ByWrSIxsrpl4ekdfnp7L1wbDxF5lo+jRs4c69gZPNw428+UQgZqnMw4gue8dQrVL S2uKYt5ZDrXFA9beYTXwjvdlO0D+BEolZXRURbm/foz3o4qyh23I+ju0ek2LDXSODAaz 8WXw== X-Gm-Message-State: AFqh2kpbz5Z9l3OdufAdmpnQTYM0mNh4T9FLK+qTCRJOj4ccYmTlTgUh nYBApzPh1xvwgTnhXnMEz6yKPQ== X-Received: by 2002:a17:902:ccc1:b0:191:3098:8b with SMTP id z1-20020a170902ccc100b001913098008bmr1723052ple.58.1673422910505; Tue, 10 Jan 2023 23:41:50 -0800 (PST) Received: from wenstp920.tpe.corp.google.com ([2401:fa00:1:10:70b3:ecc:72b:d324]) by smtp.gmail.com with ESMTPSA id e2-20020a170902784200b0019309be03e7sm9428091pln.66.2023.01.10.23.41.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Jan 2023 23:41:50 -0800 (PST) From: Chen-Yu Tsai To: Benson Leung , Guenter Roeck Cc: Chen-Yu Tsai , Tzung-Bi Shih , AngeloGioacchino Del Regno , chrome-platform@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH v2] platform/chrome: cros_ec: Use per-device lockdep key Date: Wed, 11 Jan 2023 15:41:46 +0800 Message-Id: <20230111074146.2624496-1-wenst@chromium.org> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=ham 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 Lockdep reports a bogus possible deadlock on MT8192 Chromebooks due to the following lock sequences: 1. lock(i2c_register_adapter) [1]; lock(&ec_dev->lock) 2. lock(&ec_dev->lock); lock(prepare_lock); The actual dependency chains are much longer. The shortened version looks somewhat like: 1. cros-ec-rpmsg on mtk-scp ec_dev->lock -> prepare_lock 2. In rt5682_i2c_probe() on native I2C bus: prepare_lock -> regmap->lock -> (possibly) i2c_adapter->bus_lock 3. In rt5682_i2c_probe() on native I2C bus: regmap->lock -> i2c_adapter->bus_lock 4. In sbs_probe() on i2c-cros-ec-tunnel I2C bus attached on cros-ec: i2c_adapter->bus_lock -> ec_dev->lock While lockdep is correct that the shared lockdep classes have a circular dependency, it is bogus because a) 2+3 happen on a native I2C bus b) 4 happens on the actual EC on ChromeOS devices c) 1 happens on the SCP coprocessor on MediaTek Chromebooks that just happens to expose a cros-ec interface, but does not have an i2c-cros-ec-tunnel I2C bus In short, the "dependencies" are actually on different devices. Setup a per-device lockdep key for cros_ec devices so lockdep can tell the two instances apart. This helps with getting rid of the bogus lockdep warning. For ChromeOS devices that only have one cros-ec instance this doesn't change anything. Also add a missing mutex_destroy, just to make the teardown complete. [1] This is likely the per I2C bus lock with shared lockdep class Signed-off-by: Chen-Yu Tsai --- Changes since v1: - Changed subject prefix from "chromeos" to "chrome" - Changed "passthrough I2C bus" to exact name, i2c-cros-ec-tunnel - Added kerneldoc for new "lockdep_key" field drivers/platform/chrome/cros_ec.c | 14 +++++++++++--- include/linux/platform_data/cros_ec_proto.h | 4 ++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/platform/chrome/cros_ec.c b/drivers/platform/chrome/cros_ec.c index ec733f683f34..4ae57820afd5 100644 --- a/drivers/platform/chrome/cros_ec.c +++ b/drivers/platform/chrome/cros_ec.c @@ -198,12 +198,14 @@ int cros_ec_register(struct cros_ec_device *ec_dev) if (!ec_dev->dout) return -ENOMEM; + lockdep_register_key(&ec_dev->lockdep_key); mutex_init(&ec_dev->lock); + lockdep_set_class(&ec_dev->lock, &ec_dev->lockdep_key); err = cros_ec_query_all(ec_dev); if (err) { dev_err(dev, "Cannot identify the EC: error %d\n", err); - return err; + goto destroy_mutex; } if (ec_dev->irq > 0) { @@ -215,7 +217,7 @@ int cros_ec_register(struct cros_ec_device *ec_dev) if (err) { dev_err(dev, "Failed to request IRQ %d: %d\n", ec_dev->irq, err); - return err; + goto destroy_mutex; } } @@ -226,7 +228,8 @@ int cros_ec_register(struct cros_ec_device *ec_dev) if (IS_ERR(ec_dev->ec)) { dev_err(ec_dev->dev, "Failed to create CrOS EC platform device\n"); - return PTR_ERR(ec_dev->ec); + err = PTR_ERR(ec_dev->ec); + goto destroy_mutex; } if (ec_dev->max_passthru) { @@ -292,6 +295,9 @@ int cros_ec_register(struct cros_ec_device *ec_dev) exit: platform_device_unregister(ec_dev->ec); platform_device_unregister(ec_dev->pd); +destroy_mutex: + mutex_destroy(&ec_dev->lock); + lockdep_unregister_key(&ec_dev->lockdep_key); return err; } EXPORT_SYMBOL(cros_ec_register); @@ -309,6 +315,8 @@ void cros_ec_unregister(struct cros_ec_device *ec_dev) if (ec_dev->pd) platform_device_unregister(ec_dev->pd); platform_device_unregister(ec_dev->ec); + mutex_destroy(&ec_dev->lock); + lockdep_unregister_key(&ec_dev->lockdep_key); } EXPORT_SYMBOL(cros_ec_unregister); diff --git a/include/linux/platform_data/cros_ec_proto.h b/include/linux/platform_data/cros_ec_proto.h index 017d502ed66e..3db26c891d5c 100644 --- a/include/linux/platform_data/cros_ec_proto.h +++ b/include/linux/platform_data/cros_ec_proto.h @@ -9,6 +9,7 @@ #define __LINUX_CROS_EC_PROTO_H #include +#include #include #include @@ -122,6 +123,8 @@ struct cros_ec_command { * command. The caller should check msg.result for the EC's result * code. * @pkt_xfer: Send packet to EC and get response. + * @lockdep_key: Lockdep class for each instance. Unused if CONFIG_LOCKDEP is + * not enabled. * @lock: One transaction at a time. * @mkbp_event_supported: 0 if MKBP not supported. Otherwise its value is * the maximum supported version of the MKBP host event @@ -166,6 +169,7 @@ struct cros_ec_device { struct cros_ec_command *msg); int (*pkt_xfer)(struct cros_ec_device *ec, struct cros_ec_command *msg); + struct lock_class_key lockdep_key; struct mutex lock; u8 mkbp_event_supported; bool host_sleep_v1; -- 2.39.0.314.g84b9a713c41-goog