Received: by 2002:a05:6a10:d5a5:0:0:0:0 with SMTP id gn37csp131628pxb; Wed, 6 Oct 2021 01:15:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw6xUqduIc8zmHRajxbKBt5LTJKBdEmSL1IUprygqBoWEu9isCx2/vMe3+dTOjIKddtgbKJ X-Received: by 2002:a17:902:a70e:b0:13e:1274:c352 with SMTP id w14-20020a170902a70e00b0013e1274c352mr9573215plq.58.1633508145829; Wed, 06 Oct 2021 01:15:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1633508145; cv=none; d=google.com; s=arc-20160816; b=tp4xY8p+X3Duyplfb3zD5BmzfSrWYM8+QiID1Uy2jzPtzekwvaUkPMUS0vtgya8nJz V7xgbGVOMD0Jm9ieIY8KIA3A8c7aYyRtvC7XzcW3D2ZMf9nspzCzZjvuCqP2F6ewnJGE TTzrY37j/gH+0RGcYakai73Llhs3yUUMI/AxVHy2pZli6CLF9zQ0aVqu1CDfHvSzEFbG IxqWgxEoMgyXCq72bn/M4u2Y/Hczox5hXeOH0DbfBFIxZFYgkv8fUQmD9vZP1a0Zn0bE jypsA3FX2Bhkdo7ZFxGPDo4TPXkmk3rtnxIYa2k+wwUrEiFf8Zz73el13WoaJzP8mAj5 8bxw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=dUCT/qGoriMZ9grjkZ9rD4acc1jLKgIcEPMEQTHikms=; b=WVH7YuPA1FO7KsxDjtrVrR5UjqMrneAdrOtJD9GlD0Zcm32ZBpjxXb66Lv/fv9rTpa elpnPd4MlwHefmP6srfu1vqRIue6XyMqe/fa0Do8x1eQ95v0pRJPMCVo7TnGV5p521L9 khzkLodrVLFqdgPdnUTFBRyJEoXCML5Ob2NKC7RDWKcCEKValEo6LRezP+ncnpWBUlDD hGM/ko2PmJhe4ZygRuHUMCFaTc5OVZsLQH1CuQNzPgBg6KujittXhjAbbOQcG1G+c7Ts VHyBWR0VIgJg7mvZqxcTGC9HHuSC0hufiDwAVSuLy/4OcntBkr/hafK+c52gqP5F3JB2 GBfw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=FLeAHFkM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id t2si25218151plr.243.2021.10.06.01.15.22; Wed, 06 Oct 2021 01:15:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=FLeAHFkM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237744AbhJFIOR (ORCPT + 99 others); Wed, 6 Oct 2021 04:14:17 -0400 Received: from mail.kernel.org ([198.145.29.99]:39958 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237771AbhJFIOP (ORCPT ); Wed, 6 Oct 2021 04:14:15 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id D721960F9D; Wed, 6 Oct 2021 08:12:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1633507943; bh=aJyTVkoBDT25cCj9K161A8klU5lEuxkvGK6eMdnsbKM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FLeAHFkMAjVAlwbAS8mJEu0Escwr0IctrL+9zn5ePsnJijA69oN7nkf/XsTOb1amz WLUiZqUozao1QXB4ucQXDGcM9tIp96qFy9SL+WqI2nrZ1g2ibAnCLL1xuD9180+Xor R1Q7Vz9RtQvUKewh0W3EzliNov81WwiLCr1WNHsXaAG/VXLVcXKNHE/yw+4aoJiPcr UxR8icm+iNTYCASy/C+65/lTAyY7GtXdzaaWr8jLcLxpq+3zMW1+8HJ81O6mbK10BO zHzRmWWxULuSWiuB8CDqFzdoFXyZwNzAFvimy7AT/eVFEo73cIiPtNBzStqqPi0fHb 5Wh5I/5Mj2nUg== Received: from johan by xi.lan with local (Exim 4.94.2) (envelope-from ) id 1mY22K-0005L3-DB; Wed, 06 Oct 2021 10:12:24 +0200 From: Johan Hovold To: Tejun Heo Cc: Lai Jiangshan , Petr Mladek , Sergey Senozhatsky , Steven Rostedt , John Ogness , Greg Kroah-Hartman , Fabio Estevam , linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold , stable@vger.kernel.org Subject: [PATCH] workqueue: fix state-dump console deadlock Date: Wed, 6 Oct 2021 10:11:15 +0200 Message-Id: <20211006081115.20451-1-johan@kernel.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Console drivers often queue work while holding locks also taken in their console write paths, something which can lead to deadlocks on SMP when dumping workqueue state (e.g. sysrq-t or on suspend failures). For serial console drivers this could look like: CPU0 CPU1 ---- ---- show_workqueue_state(); lock(&pool->lock); lock(&port->lock); schedule_work(); lock(&pool->lock); printk(); lock(console_owner); lock(&port->lock); where workqueues are, for example, used to push data to the line discipline, process break signals and handle modem-status changes. Line disciplines and serdev drivers can also queue work on write-wakeup notifications, etc. Reworking every console driver to avoid queuing work while holding locks also taken in their write paths would complicate drivers and is neither desirable or feasible. Instead use the deferred-printk mechanism to avoid printing while holding pool locks when dumping workqueue state. Note that there are a few WARN_ON() assertions in the workqueue code which could potentially also trigger a deadlock. Hopefully the ongoing printk rework will provide a general solution for this eventually. This was originally reported after a lockdep splat when executing sysrq-t with the imx serial driver. Fixes: 3494fc30846d ("workqueue: dump workqueues on sysrq-t") Cc: stable@vger.kernel.org # 4.0 Reported-by: Fabio Estevam Signed-off-by: Johan Hovold --- kernel/workqueue.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 33a6b4a2443d..fded64b48b96 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -4830,8 +4830,16 @@ void show_workqueue_state(void) for_each_pwq(pwq, wq) { raw_spin_lock_irqsave(&pwq->pool->lock, flags); - if (pwq->nr_active || !list_empty(&pwq->inactive_works)) + if (pwq->nr_active || !list_empty(&pwq->inactive_works)) { + /* + * Defer printing to avoid deadlocks in console + * drivers that queue work while holding locks + * also taken in their write paths. + */ + printk_deferred_enter(); show_pwq(pwq); + printk_deferred_exit(); + } raw_spin_unlock_irqrestore(&pwq->pool->lock, flags); /* * We could be printing a lot from atomic context, e.g. -- 2.32.0