Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp8379711ybl; Thu, 16 Jan 2020 15:42:07 -0800 (PST) X-Google-Smtp-Source: APXvYqzHGwGqQ68flM+rG3Rrxq+bzSTdiPf1Fa8O3y05VcXSG0RyY8D+d7iYhJ1gm5ldq30IHxrY X-Received: by 2002:a05:6808:aba:: with SMTP id r26mr1344537oij.4.1579218127807; Thu, 16 Jan 2020 15:42:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579218127; cv=none; d=google.com; s=arc-20160816; b=Cu2gGrKwR9VqczuZaV6xIbeiXPtetcUbWzmkiCbMZCzcBuMRmk0i5QZB8/pDNIut/k E/rAgrB1u7sLkFTOesTcvdxPKeAsPc3qey51Llgxbbmzatw+Pq5a2IoWnm1wgO7Y7izO bzci2bEOb/8qY5Uzbk4/6q/ARnHBySxwVOMC9HaC1vTQtfMs/1F6dfiKwD+ygJBpVbmo BbcLbDu4J52PcdpSP4nsJr8Kp5y8s8ngHCUdmu9W5az0QAKX755ClTfMxY4na6kOVVTH OwQ2smdmsZuhPkw0IjQpOvRu7VoHR+tJUrqHEue1JqA0/c14Gh1+iPK9ZGqy3fKev/yJ vWzA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=WR7RktCbdbvZxLCValkQdqh54JRkNUI+zKUDU/heOOY=; b=1Ftz4fNKsJ2pypTD73yxrIvMGYn3dd+C8FqW7dv7DtKiAB9n2TOln11+0MfcVd9+Sh +v4BSmaNxEvK5Ho8oyJPNOlAV4tjYqygOm0Hy7ZuDByTUeQf8B9Ond5gCcDdWQE98CXk 7k+fQMk4f0EwqU0OC5VbhmFhCugY2cWhpq/h5g8ENdahkGj6DyTtGoU65UWM4cfatTOT rYBRvCcqsWT5+sfYPd70v9tZsarA12Jgs/oqKZEfQst+7rBUPHpyEnMXtxQmdkXL1HLQ wD4SUtbfCTbwZ8qyyXo+ifscAjGcXCnBvcxR/DCDlKtLjzxro44LYoQQE6n+C01ufrjn N8ig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=mJveuqFK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 94si14306037ott.8.2020.01.16.15.41.55; Thu, 16 Jan 2020 15:42:07 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=mJveuqFK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388600AbgAPXjf (ORCPT + 99 others); Thu, 16 Jan 2020 18:39:35 -0500 Received: from mail.kernel.org ([198.145.29.99]:60730 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389592AbgAPX2J (ORCPT ); Thu, 16 Jan 2020 18:28:09 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 889AE20684; Thu, 16 Jan 2020 23:28:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579217289; bh=Vv5RyghxI+e62Ubg8liNy/1QrWWU3ugVXiPsjGGf0Sg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mJveuqFK6izK21HIIp6W8pBQqmNS8zdZ9sXrEJosvS9R6fMBofS5AF13qrXt+agIg Dbjk+Qaevw2jD7ivwXqSPkMK9StFzNjMMawP+vy07bTNHwCINq2kjk12wD5qPUrmJH Zga2LEOg8J4b3uCDYY4NfCXiKSy1s4k6PQ5jemQ4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Olivier Moysan , Mark Brown Subject: [PATCH 4.19 21/84] ASoC: stm32: spdifrx: fix inconsistent lock state Date: Fri, 17 Jan 2020 00:17:55 +0100 Message-Id: <20200116231716.172793007@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200116231713.087649517@linuxfoundation.org> References: <20200116231713.087649517@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Olivier Moysan commit 2859b1784031b5709446af8f6039c467f136e67d upstream. In current spdifrx driver locks may be requested as follows: - request lock on iec capture control, when starting synchronization. - request lock in interrupt context, when spdifrx stop is called from IRQ handler. Take lock with IRQs disabled, to avoid the possible deadlock. Lockdep report: [ 74.278059] ================================ [ 74.282306] WARNING: inconsistent lock state [ 74.290120] -------------------------------- ... [ 74.314373] CPU0 [ 74.314377] ---- [ 74.314381] lock(&(&spdifrx->lock)->rlock); [ 74.314396] [ 74.314400] lock(&(&spdifrx->lock)->rlock); Fixes: 03e4d5d56fa5 ("ASoC: stm32: Add SPDIFRX support") Signed-off-by: Olivier Moysan Link: https://lore.kernel.org/r/20191204154333.7152-2-olivier.moysan@st.com Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- sound/soc/stm/stm32_spdifrx.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) --- a/sound/soc/stm/stm32_spdifrx.c +++ b/sound/soc/stm/stm32_spdifrx.c @@ -313,6 +313,7 @@ static void stm32_spdifrx_dma_ctrl_stop( static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx) { int cr, cr_mask, imr, ret; + unsigned long flags; /* Enable IRQs */ imr = SPDIFRX_IMR_IFEIE | SPDIFRX_IMR_SYNCDIE | SPDIFRX_IMR_PERRIE; @@ -320,7 +321,7 @@ static int stm32_spdifrx_start_sync(stru if (ret) return ret; - spin_lock(&spdifrx->lock); + spin_lock_irqsave(&spdifrx->lock, flags); spdifrx->refcount++; @@ -353,7 +354,7 @@ static int stm32_spdifrx_start_sync(stru "Failed to start synchronization\n"); } - spin_unlock(&spdifrx->lock); + spin_unlock_irqrestore(&spdifrx->lock, flags); return ret; } @@ -361,11 +362,12 @@ static int stm32_spdifrx_start_sync(stru static void stm32_spdifrx_stop(struct stm32_spdifrx_data *spdifrx) { int cr, cr_mask, reg; + unsigned long flags; - spin_lock(&spdifrx->lock); + spin_lock_irqsave(&spdifrx->lock, flags); if (--spdifrx->refcount) { - spin_unlock(&spdifrx->lock); + spin_unlock_irqrestore(&spdifrx->lock, flags); return; } @@ -384,7 +386,7 @@ static void stm32_spdifrx_stop(struct st regmap_read(spdifrx->regmap, STM32_SPDIFRX_DR, ®); regmap_read(spdifrx->regmap, STM32_SPDIFRX_CSR, ®); - spin_unlock(&spdifrx->lock); + spin_unlock_irqrestore(&spdifrx->lock, flags); } static int stm32_spdifrx_dma_ctrl_register(struct device *dev,