Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1397930pxb; Thu, 4 Mar 2021 10:14:48 -0800 (PST) X-Google-Smtp-Source: ABdhPJw+xPzInW7hXwWc8Y/aLO28ed9uLa6LuqJsZUMMSzINF4pzMldcY2FmiMjQtfLEcqO31yde X-Received: by 2002:a05:6402:1d92:: with SMTP id dk18mr5761861edb.161.1614881688743; Thu, 04 Mar 2021 10:14:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614881688; cv=none; d=google.com; s=arc-20160816; b=FqCmYI44xBFYlzRUQVs6KLW2cppf2232vXMfkmKuYBbT28y3JoPYkuO7AIys9cT/6i p3rk0gXu80gfrMTxoPruUD3mP2elp0a3exFNlJSkqaMUYjm12c5ZsubvxFAh8zEKqhXN IwLyTSUXpRpLnXDqxI3WgH9avlite/bH6j20kCvypi4Sa+S4LowzhBUGD7ZeL7FOuYBg mUUuSJQVnZJTKKN5YDSsK/5LrnPFAsZfSeUrKJImx1hzEyECXDD92a33Pv94Xf2EqIW6 xAuCf1CTOajx1SN2bBGdaZ522Dj1F7QgLgCp51oTNhpOklgU+EjtI3Zc3thUFcF0kTGy 1LEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=SjDCRvLNvCvRh7LGL+F6JAoKAAhnKtu1+jdqaFqpzsM=; b=OF/YVNlO2DyLpHMZqOOvIUC4CH9uak7dglVKkiK/qGm9pnfPmvvNy0ZrftHRkMCALQ 1/ZoZEwfNJvcBHandcozal54v1mNsTFYKog8O06THi/oG4/jJXex/KhTRHGRC1joS17h y8AgKrQ0QKosrOjVXtgfzWNHZSHRNDJZSWwuI5GD83uttZs0x/PO9K2Jel8lA2NYr5GW f1fSSCaDTzYWH7jsthg682WwVKfcpNr5u0kbX+f4ZRVIhwDMpdZwQAZ0K6J+E/1HkDqa dkWFjIxUBktaxf07k+bbLTyFmgM7jl8FbPk3hAYWuaGamBIXaH0+7aLw07B3B5Xy+Ci2 xTJw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@foss.st.com header.s=selector1 header.b="D/067wg+"; 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=foss.st.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p2si96919edr.107.2021.03.04.10.14.25; Thu, 04 Mar 2021 10:14:48 -0800 (PST) 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=@foss.st.com header.s=selector1 header.b="D/067wg+"; 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=foss.st.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237146AbhCDQYX (ORCPT + 99 others); Thu, 4 Mar 2021 11:24:23 -0500 Received: from mx07-00178001.pphosted.com ([185.132.182.106]:39522 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237012AbhCDQYG (ORCPT ); Thu, 4 Mar 2021 11:24:06 -0500 Received: from pps.filterd (m0241204.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 124GBHJ1003785; Thu, 4 Mar 2021 17:23:17 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=SjDCRvLNvCvRh7LGL+F6JAoKAAhnKtu1+jdqaFqpzsM=; b=D/067wg+6Gyi60dQiQnF+quPXhpINaNi8Y1NXsslT6fk3GVAbwJu8E0MnK1ToEmbbhml a+YrO8EW2NviadvkaOGdVPP/bP9mmg8Vhu+Q/jr27KXAJpslS5rW2w5CniqtkIIllDtu I8ByQT9YLUlPEeVHr6dzu5KrdPI8r30lyPDXZ/fVhYjNDxKAXG8It7KoQATjrXjrEWfn NCvD/HFjBvEzQcTHbITQozRcgQ4OAqrnUG9y210twutcZZnY+cYf1PXRFW5iSXeo7Ztl 4xJArgW4GjgQj6UzsryfTHI5JdmbQQSDjQV3TmM/xKH1hWIrsl0I+r5SAQP6LIALmAXc NA== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 370xej5ayb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 04 Mar 2021 17:23:17 +0100 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 36321100034; Thu, 4 Mar 2021 17:23:17 +0100 (CET) Received: from Webmail-eu.st.com (sfhdag2node3.st.com [10.75.127.6]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id 28E2320741B; Thu, 4 Mar 2021 17:23:17 +0100 (CET) Received: from localhost (10.75.127.48) by SFHDAG2NODE3.st.com (10.75.127.6) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Thu, 4 Mar 2021 17:23:16 +0100 From: Erwan Le Ray To: Greg Kroah-Hartman , Jiri Slaby , Maxime Coquelin , Alexandre Torgue CC: , , , , Erwan Le Ray , Fabrice Gasnier , Valentin Caron Subject: [PATCH v2 07/13] serial: stm32: fix a deadlock in set_termios Date: Thu, 4 Mar 2021 17:23:02 +0100 Message-ID: <20210304162308.8984-8-erwan.leray@foss.st.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210304162308.8984-1-erwan.leray@foss.st.com> References: <20210304162308.8984-1-erwan.leray@foss.st.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.75.127.48] X-ClientProxiedBy: SFHDAG2NODE1.st.com (10.75.127.4) To SFHDAG2NODE3.st.com (10.75.127.6) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.369,18.0.761 definitions=2021-03-04_05:2021-03-03,2021-03-04 signatures=0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org CTS/RTS GPIOs support that has been added recently to STM32 UART driver has introduced scheduled code in a set_termios part protected by a spin lock. This generates a potential deadlock scenario: Chain exists of: &irq_desc_lock_class --> console_owner --> &port_lock_key Possible unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&port_lock_key); lock(console_owner); lock(&port_lock_key); lock(&irq_desc_lock_class); *** DEADLOCK *** 4 locks held by stty/766: Move the scheduled code after the spinlock. Fixes: 6cf61b9bd7cc ("tty: serial: Add modem control gpio support for STM32 UART") Signed-off-by: Erwan Le Ray diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c index 326f300dd410..a381ee52168a 100644 --- a/drivers/tty/serial/stm32-usart.c +++ b/drivers/tty/serial/stm32-usart.c @@ -829,12 +829,6 @@ static void stm32_usart_set_termios(struct uart_port *port, cr3 |= USART_CR3_CTSE | USART_CR3_RTSE; } - /* Handle modem control interrupts */ - if (UART_ENABLE_MS(port, termios->c_cflag)) - stm32_usart_enable_ms(port); - else - stm32_usart_disable_ms(port); - usartdiv = DIV_ROUND_CLOSEST(port->uartclk, baud); /* @@ -916,6 +910,12 @@ static void stm32_usart_set_termios(struct uart_port *port, stm32_usart_set_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit)); spin_unlock_irqrestore(&port->lock, flags); + + /* Handle modem control interrupts */ + if (UART_ENABLE_MS(port, termios->c_cflag)) + stm32_usart_enable_ms(port); + else + stm32_usart_disable_ms(port); } static const char *stm32_usart_type(struct uart_port *port) -- 2.17.1