From nobody Sun Sep 22 07:33:16 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E36C4C433EF for ; Wed, 16 Mar 2022 07:43:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1354277AbiCPHoz (ORCPT ); Wed, 16 Mar 2022 03:44:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54562 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1354269AbiCPHoy (ORCPT ); Wed, 16 Mar 2022 03:44:54 -0400 Received: from mailgw02.mediatek.com (unknown [210.61.82.184]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3F7DE329AA for ; Wed, 16 Mar 2022 00:43:38 -0700 (PDT) X-UUID: b8b9268005924c798f11d488ea397757-20220316 X-UUID: b8b9268005924c798f11d488ea397757-20220316 Received: from mtkmbs10n2.mediatek.inc [(172.21.101.183)] by mailgw02.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1666183484; Wed, 16 Mar 2022 15:43:31 +0800 Received: from mtkcas10.mediatek.inc (172.21.101.39) by mtkmbs10n2.mediatek.inc (172.21.101.183) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.2.792.3; Wed, 16 Mar 2022 15:43:29 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by mtkcas10.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 16 Mar 2022 15:43:29 +0800 From: Mark-PK Tsai To: , CC: , , , , , Subject: [PATCH] driver core: Prevent overriding async driver of a device before it probe Date: Wed, 16 Mar 2022 15:43:28 +0800 Message-ID: <20220316074328.1801-1-mark-pk.tsai@mediatek.com> X-Mailer: git-send-email 2.18.0 MIME-Version: 1.0 X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When there are 2 matched drivers for a device using async probe mechanism, the dev->p->async_driver might be overridden by the last attached driver. So just skip the later one if the previous matched driver was not handled by async thread yet. Below is my use case which having this problem. Make both driver mmcblk and mmc_test allow async probe, the dev->p->async_driver will be overridden by the later driver mmc_test and bind to the device then claim it for testing. When it happen, mmcblk will never do probe again. Signed-off-by: Mark-PK Tsai --- drivers/base/dd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/base/dd.c b/drivers/base/dd.c index f47cab21430f..f0bd779a4696 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -1085,6 +1085,7 @@ static void __driver_attach_async_helper(void *_dev, = async_cookie_t cookie) =20 __device_driver_lock(dev, dev->parent); drv =3D dev->p->async_driver; + dev->p->async_driver =3D NULL; ret =3D driver_probe_device(drv, dev); __device_driver_unlock(dev, dev->parent); =20 @@ -1131,7 +1132,7 @@ static int __driver_attach(struct device *dev, void *= data) */ dev_dbg(dev, "probing driver %s asynchronously\n", drv->name); device_lock(dev); - if (!dev->driver) { + if (!dev->driver && !dev->p->async_driver) { get_device(dev); dev->p->async_driver =3D drv; async_schedule_dev(__driver_attach_async_helper, dev); --=20 2.18.0