From patchwork Thu Jun 15 14:12:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Fitzgerald X-Patchwork-Id: 108562 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp683941vqr; Thu, 15 Jun 2023 07:37:10 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7WK9ea0HBc8eNpAzQvPcGZGIeYeZzC9P8z5LP8l2fPOy7T7a3cMHGh3RTOuVFM7rP9TXcQ X-Received: by 2002:a05:6870:d450:b0:180:857:d47d with SMTP id j16-20020a056870d45000b001800857d47dmr12834136oag.57.1686839830416; Thu, 15 Jun 2023 07:37:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686839830; cv=none; d=google.com; s=arc-20160816; b=QLKv95uqXdJPZHUJRpbGb5nZ3/+0nhEw0Ot2umJHHwpliMTFF+2Y7tjxwKMGuTnPsg St0ICNV49HVqw30pNe4J6dR62oo/GGraeNuvoP3txAODu5EBJbyTGq8LlD7OdesdnoUa p5lulp+UwjmYjs1GObk6Kw9VEISoaiqGZARzw1KXvK0emN+WG6+fet3dPt3im0buI73C ApDDe61DhJGbB8TVn35xaCUt4QaPLUKXeRSN7u49uk8acQM1YpMuXkkfQUz56eRosYw9 IPUs63KYKGSbPf+4oD7+Xx9IYFEezvMcyxU8Z28ZyrXmcV00iqHE1BJadBQXWxolshmV I0ug== 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 Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l4-20020a17090a384400b0025bfcf82dffsi6596490pjf.82.2023.06.15.07.36.54; Thu, 15 Jun 2023 07:37:10 -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 S1344964AbjFOONH (ORCPT + 99 others); Thu, 15 Jun 2023 10:13:07 -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 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1768779761962627377?= X-GMAIL-MSGID: =?utf-8?q?1768779761962627377?= 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 Reviewed-by: Pierre-Louis Bossart --- 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;