Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp1189554rwd; Thu, 15 Jun 2023 07:27:37 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6bxi2iv/OqaK+m25LiIPtMK5wOaedONiM1+tLF1tUUJNgzTcgIv7ryC9BoLvlhiL63feeE X-Received: by 2002:a17:907:3681:b0:982:7545:efb6 with SMTP id bi1-20020a170907368100b009827545efb6mr4468426ejc.66.1686839257447; Thu, 15 Jun 2023 07:27:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686839257; cv=none; d=google.com; s=arc-20160816; b=bbc+CBZb1KGZe6X41wOEkKCtgmPNzuWq+ulzouIPjCESgn8mCLXJWeGUJwZLJc5g+J 0tkIrTCpd6SUzWPLRWqv8+DkF4bRa38Tyy6HxbWqT9irMDDyV1sLhMYmcyUk3y3JbD+C uwAMFms5QgJqMrM5tolHQZ87A36L2ygRZV7bzDeySna/xn8VxLZy0a9cq5D2zhc7QBCM ln6eUXuQECg/8MemddlIa8qM74dWyv3QSNNHP1AdhMJiD/pWhibKe37IZp5ZNgjCJr14 Oyeensq6MHK6RmGsNxjdNGWpoelqMEe6UtbVp4QC842jywIBrfKSRSmn4GBtiK2pLXFx eX7Q== 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=EhJys9uuBbtQEZ3Oj5s1X5sALPRgYIm5gNpiZJZVlEY=; b=eMFMFAhDi2/togQHhUisJzqMdyBBqUr2DxvhAzRgdzEkJ95cP4j7asFHVMkganACAl ApZ2FlK2jvD28aTVGIMoQ+MQ7IWr/tMOlAaBajOxxVLoo7nWHQkLZ4HEPR8Gzg90RiEp /KTal3qUVGTjArMuIrJdz383Bhe7wL5/ZyK+mBTC7oy6AhZuxpVZQhvL4N3hRIuf2px0 w6titSCRP6QqnNtbPKdeqnVnxWpQz9PqQjJZqet6nNhZ47/vS6VcEtrSF5txWzRO2yf4 1q7hc355oQiFMNVS9OEesqapbQvK8srZHcfNZ6FtClKCZ7J/jA9PYg81J5vU8kjT3Uq2 gQOg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cirrus.com header.s=PODMain02222019 header.b=SEUYuhvp; 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=REJECT sp=REJECT dis=NONE) header.from=cirrus.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ka11-20020a170907990b00b00978ae651cacsi10217869ejc.0.2023.06.15.07.27.12; Thu, 15 Jun 2023 07:27:37 -0700 (PDT) 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=@cirrus.com header.s=PODMain02222019 header.b=SEUYuhvp; 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=REJECT sp=REJECT dis=NONE) header.from=cirrus.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344962AbjFOONG (ORCPT + 99 others); Thu, 15 Jun 2023 10:13:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42286 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344911AbjFOOMz (ORCPT ); Thu, 15 Jun 2023 10:12:55 -0400 Received: from mx0b-001ae601.pphosted.com (mx0b-001ae601.pphosted.com [67.231.152.168]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B6D8F273E for ; Thu, 15 Jun 2023 07:12:47 -0700 (PDT) Received: from pps.filterd (m0077474.ppops.net [127.0.0.1]) by mx0b-001ae601.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 35FE3pF5025945; Thu, 15 Jun 2023 09:12:10 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h=from : to : cc : subject : date : message-id : mime-version : content-transfer-encoding : content-type; s=PODMain02222019; bh=EhJys9uuBbtQEZ3Oj5s1X5sALPRgYIm5gNpiZJZVlEY=; b=SEUYuhvpEVlIMtL9a036T+B+GcrI7aU8S7BT3DI254P+KskeJ+Mj0ytg44z4SeAfgN6o 2Mw9xXB9ZLOXrA864u95Elffgw64iG92hl3NCjtNUaID+3bxTdpnsnmG9duPd0KxSfI6 baufsgvQ6d/W5MQGVnr/atgJpSSyi0WCqTY3HkYmgdMC7KXiRcDpwy5pGPgN+TuD4IMj vxH7Ysp6BVkXEYoZcbCYEQdg6BFuLYUeAXd5eZlfNHndqZbH3Pjbyr2sFBWHqdQHnYur zvxY6Olw0IEXWZ1j9WoEBW3/6JPYNE77bg12U5vAPVUppr0xQqwG2Fa9Gv1frZfqLRo0 5g== Received: from ediex01.ad.cirrus.com ([84.19.233.68]) by mx0b-001ae601.pphosted.com (PPS) with ESMTPS id 3r75nu9xmp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 15 Jun 2023 09:12:09 -0500 Received: from ediex01.ad.cirrus.com (198.61.84.80) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.26; Thu, 15 Jun 2023 15:12:08 +0100 Received: from ediswmail.ad.cirrus.com (198.61.86.93) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server id 15.2.1118.26 via Frontend Transport; Thu, 15 Jun 2023 15:12:08 +0100 Received: from edi-sw-dsktp-006.ad.cirrus.com (edi-sw-dsktp-006.ad.cirrus.com [198.90.251.127]) by ediswmail.ad.cirrus.com (Postfix) with ESMTP id 21AB911D4; Thu, 15 Jun 2023 14:12:08 +0000 (UTC) From: Richard Fitzgerald To: , , CC: , , , Richard Fitzgerald Subject: [PATCH 1/2] soundwire: bus: Prevent lockdep asserts when stream has multiple buses Date: Thu, 15 Jun 2023 15:12:07 +0100 Message-ID: <20230615141208.679011-1-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Proofpoint-ORIG-GUID: C-MgO0yxO_bhSMFH9VvY9RiYw3ycGICJ X-Proofpoint-GUID: C-MgO0yxO_bhSMFH9VvY9RiYw3ycGICJ X-Proofpoint-Spam-Reason: safe X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE 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 Give the bus_lock and msg_lock of each bus a different unique key so that it is possible to acquire the locks of multiple buses without lockdep asserting a possible deadlock. Using mutex_init() to initialize a mutex gives all those mutexes the same lock class. Lockdep checking treats it as an error to attempt to take a mutex while already holding a mutex of the same class. This causes a lockdep assert when sdw_acquire_bus_lock() attempts to lock multiple buses, and when do_bank_switch() takes multiple msg_lock. [ 138.697350] WARNING: possible recursive locking detected [ 138.697366] 6.3.0-test #1 Tainted: G E [ 138.697380] -------------------------------------------- [ 138.697394] play/903 is trying to acquire lock: [ 138.697409] ffff99b8c41aa8c8 (&bus->bus_lock){+.+.}-{3:3}, at: sdw_prepare_stream+0x52/0x2e0 [ 138.697443] but task is already holding lock: [ 138.697468] ffff99b8c41af8c8 (&bus->bus_lock){+.+.}-{3:3}, at: sdw_prepare_stream+0x52/0x2e0 [ 138.697493] other info that might help us debug this: [ 138.697521] Possible unsafe locking scenario: [ 138.697540] CPU0 [ 138.697550] ---- [ 138.697559] lock(&bus->bus_lock); [ 138.697570] lock(&bus->bus_lock); [ 138.697581] *** DEADLOCK *** Giving each mutex a unique key allows multiple to be held without triggering a lockdep assert. But note that it does not allow them to be taken in one order then a different order. If two mutexes are taken in the order A, B then they must always be taken in that order otherwise they could deadlock. Signed-off-by: Richard Fitzgerald --- drivers/soundwire/bus.c | 15 +++++++++++++-- include/linux/soundwire/sdw.h | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c index b44f8d0affa6..dba920ec88f6 100644 --- a/drivers/soundwire/bus.c +++ b/drivers/soundwire/bus.c @@ -69,8 +69,17 @@ int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent, return -EINVAL; } - mutex_init(&bus->msg_lock); - mutex_init(&bus->bus_lock); + /* + * Give each bus_lock and msg_lock a unique key so that lockdep won't + * trigger a deadlock warning when the locks of several buses are + * grabbed during configuration of a multi-bus stream. + */ + lockdep_register_key(&bus->msg_lock_key); + __mutex_init(&bus->msg_lock, "msg_lock", &bus->msg_lock_key); + + lockdep_register_key(&bus->bus_lock_key); + __mutex_init(&bus->bus_lock, "bus_lock", &bus->bus_lock_key); + INIT_LIST_HEAD(&bus->slaves); INIT_LIST_HEAD(&bus->m_rt_list); @@ -181,6 +190,8 @@ void sdw_bus_master_delete(struct sdw_bus *bus) sdw_master_device_del(bus); sdw_bus_debugfs_exit(bus); + lockdep_unregister_key(&bus->bus_lock_key); + lockdep_unregister_key(&bus->msg_lock_key); ida_free(&sdw_bus_ida, bus->id); } EXPORT_SYMBOL(sdw_bus_master_delete); diff --git a/include/linux/soundwire/sdw.h b/include/linux/soundwire/sdw.h index c076a3f879b3..f523ceabd059 100644 --- a/include/linux/soundwire/sdw.h +++ b/include/linux/soundwire/sdw.h @@ -5,6 +5,7 @@ #define __SOUNDWIRE_H #include +#include #include #include @@ -907,7 +908,9 @@ struct sdw_bus { struct list_head slaves; DECLARE_BITMAP(assigned, SDW_MAX_DEVICES); struct mutex bus_lock; + struct lock_class_key bus_lock_key; struct mutex msg_lock; + struct lock_class_key msg_lock_key; int (*compute_params)(struct sdw_bus *bus); const struct sdw_master_ops *ops; const struct sdw_master_port_ops *port_ops; -- 2.30.2