From patchwork Mon Oct 12 13:26:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg KH X-Patchwork-Id: 270196 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 59D9DC43467 for ; Mon, 12 Oct 2020 14:08:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1ABC420E65 for ; Mon, 12 Oct 2020 14:08:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1602511712; bh=aIYYaIhEzQZRF+zi3njBCJesd8nzD6h8LV9Bb70iIHU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=ulUGiFq10WdbjY8lpQGYl/WrUC8TXGKsn1oroofuGUHBrTLsGqLN/fTa6gD7NHcyt jzlmShVYXr5IziMoZRNLYCbBkW5o6SbpZmj2hmFynB+GWm5XerlgXiboVkxWL18EbF zEt+uVcbjC1LLnsB8MYGFGTRueoyN+iN+kaHYuWc= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731205AbgJLOIb (ORCPT ); Mon, 12 Oct 2020 10:08:31 -0400 Received: from mail.kernel.org ([198.145.29.99]:35552 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730234AbgJLNdZ (ORCPT ); Mon, 12 Oct 2020 09:33:25 -0400 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B896620678; Mon, 12 Oct 2020 13:33:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1602509605; bh=aIYYaIhEzQZRF+zi3njBCJesd8nzD6h8LV9Bb70iIHU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YDYjfhWK3pSHyfbLiuhRvRdbTjk6K3H5HKaSOMer/Vt2mNTvVyhK/0k331JlcYBPW 1Ct/rmboffYJIQGZgKzCtE3ONwRqSL4ERoYB55lQ7dTKHj3+DFyPEM5f4TVMiZtjcT NFhEOJfP2JQK4LvJBmHZ9+mYbZ2HP/y0oNIBScrM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, syzbot , Geert Uytterhoeven , Tetsuo Handa , stable , "Nobuhiro Iwamatsu (CIP)" Subject: [PATCH 4.4 25/39] driver core: Fix probe_count imbalance in really_probe() Date: Mon, 12 Oct 2020 15:26:55 +0200 Message-Id: <20201012132629.340739665@linuxfoundation.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201012132628.130632267@linuxfoundation.org> References: <20201012132628.130632267@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org From: Tetsuo Handa commit b292b50b0efcc7095d8bf15505fba6909bb35dce upstream. syzbot is reporting hung task in wait_for_device_probe() [1]. At least, we always need to decrement probe_count if we incremented probe_count in really_probe(). However, since I can't find "Resources present before probing" message in the console log, both "this message simply flowed off" and "syzbot is not hitting this path" will be possible. Therefore, while we are at it, let's also prepare for concurrent wait_for_device_probe() calls by replacing wake_up() with wake_up_all(). [1] https://syzkaller.appspot.com/bug?id=25c833f1983c9c1d512f4ff860dd0d7f5a2e2c0f Reported-by: syzbot Fixes: 7c35e699c88bd607 ("driver core: Print device when resources present in really_probe()") Cc: Geert Uytterhoeven Signed-off-by: Tetsuo Handa Cc: stable Link: https://lore.kernel.org/r/20200713021254.3444-1-penguin-kernel@I-love.SAKURA.ne.jp [iwamatsu: Drop patch for deferred_probe_timeout_work_func()] Signed-off-by: Nobuhiro Iwamatsu (CIP) Signed-off-by: Greg Kroah-Hartman --- drivers/base/dd.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -285,7 +285,8 @@ static int really_probe(struct device *d drv->bus->name, __func__, drv->name, dev_name(dev)); if (!list_empty(&dev->devres_head)) { dev_crit(dev, "Resources present before probing\n"); - return -EBUSY; + ret = -EBUSY; + goto done; } dev->driver = drv; @@ -363,7 +364,7 @@ probe_failed: ret = 0; done: atomic_dec(&probe_count); - wake_up(&probe_waitqueue); + wake_up_all(&probe_waitqueue); return ret; }