From mboxrd@z Thu Jan 1 00:00:00 1970 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id AC495C433FE for ; Fri, 30 Sep 2022 02:16:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Date:Subject:Cc:To:From: Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=Kg3qqH4cCJJbVVaQVNHNDy7OHHtEqR8/FUUsVcN6kI0=; b=exOCR/++gMUKQz mZocOSypoOsA4csR+AwF1p/kwZ+vfoh3ziyvxJDArL7rJ2fLXxHX6qFvgItETh0nmu4/iVzM2swD0 +kmNZPXEdbSRx+cA43UMCcaTEf06bhkxjiBn1h7oeYI1GPCtGalq9I896NLC8+0Tb7g/BA5Lt6s5N iSzNq3vvTz+XZCHAov1IqMUQEA/9/KvWgmy2qIjy9J2JcLKa1Ov0zjappf4nMToeH/YiprghmwE8A ifbrM+ix+vRRGhu1ZJkI3NlbknbqwpdSpP4Hwm0UA2QpDzSd9JKHzp2O2TF/7lBQcSmDtu7PBciN8 n0c+OfHRyyrcJ4ot5syg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oe5YR-006hSG-JP; Fri, 30 Sep 2022 02:15:07 +0000 Received: from out203-205-221-231.mail.qq.com ([203.205.221.231]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oe5YN-006hPp-7g for linux-arm-kernel@lists.infradead.org; Fri, 30 Sep 2022 02:15:06 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512; t=1664504095; bh=GzhmJ8UCgk7On/BwM0rIJOfieBK85zSbfdTeQraLZL4=; h=From:To:Cc:Subject:Date; b=kuGKX0AaujvzpgMmJe0Ui22Mj9HWV78hNilP0AJ5FG+Jn+DEaQyJxOX9bUYFO2C1c w3B04Yif06O+JHHfhQJ/DzXREAzH6RbwK9fU8wvJs241vuRpoE5sVny/PBrcMycLaS 06SgO6tnz8Y+fp4zcz5sm8/lMTDa0c04i4RFxABw= Received: from kylin.58.20.127.238 ([116.128.244.169]) by newxmesmtplogicsvrszc13.qq.com (NewEsmtp) with SMTP id 3B40C4CD; Fri, 30 Sep 2022 10:14:52 +0800 X-QQ-mid: xmsmtpt1664504092tbdm3cu9c Message-ID: X-QQ-XMAILINFO: MRw/zKT/0BpPb8C6WhFrN1qwKAO6qgLWXvig24RE1Be8FFT0vNilnJIccFUpJN iBIerKS3iCeZn8q4cE9ik2uzp9fKr/Uyv0OQjUM59XG2cj0xsZv70pjpR9nX55yNcBzmjqgRWNR5 66UHZ4VcyQzU0lg/JparIFlPWcExWSmznepBuRkQRAvc9A+pWdE1strUkNVglTAKx5nPg3Ibazpd XRrD5KdnI6lClxumAZLK3WaWe7uF9BsPruw2ouC+1lh19JYfZfAV/llvQdRR9Q2+6ZY99tytZ/BG fsuuKuvP0RtqcUe/BSBfGpQCn8uzi4nOBOWpTwmTe+Lmoxru3i2a3aSwmTDUC0zMuI1mYZ8bpbgn cVzsUwT4oUjoah1UjeLSPEFIapv0m0iZefy/Kuk52RQuU/J7Xy94lD3d4IEzoacvCx/2ssgzcIZM n4CYtwXhVVAqJfzcFbx6GQoAA/oErKQEuoVe/QIoDyEogUmtZZSM9GLIZ96Guse2sLbhbQP3ENba JfTUJSi2sSdNzobsphkshzmjYxwwKXmPIizAIM+kt/IfKx4g4EsZQoRnhRgq5kCanUV2Ei3E0+9A RvKnIDH4T9zOH8Xvidzkno/0SHT8wC6DZ8duBsZ6aAHTKPE9HCOBXpo2gCbmjYviSgU8f/w0CdjV +zTsZTye9nKjtWuDw+mdk12fhiyfXDLgukwl1ZCC2qOJTcLY+O1jq2edghxSRNZOLuNizfySrsGw T6ezTDmPrAIhxL80+C2Vg4Z4lmfqCIGxHPWmXdUL3hI2TBvWHNZ5nb3gxCr6Eyd+gb6XVWf+KP/M 1y4In+ShFPIuWHICW0ev1owBcnDxY7WnhmEX9P5qSyZPpSzntAIpbiSufjeqKsYw/RuVeR/DvsMX 9QTnncw6Qi+PGRJJBP9IJGRdwXNNvtWHDOcxJNevQLyfCO0VY9On2F1mhBnotvsA1ePauNnpFkkH RntClmuT96BYGua+wRl26OWQ48y61oQiVw8C5R7iseCAuzE4d6CuKGRAUXIJDh8//+lRL0PdzB3/ XPNf7gT0jPG1K94gAK6QLE+i4Zd2cMkVmTlMGdiCHrJnbcQm0H From: Yaxiong Tian To: sudeep.holla@arm.com, cristian.marussi@arm.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Yaxiong Tian , stable@vger.kernel.org, Jim Quinlan Subject: [PATCH -next 1/1] firmware: arm_scmi: Fix possible deadlock in shmem_tx_prepare() Date: Fri, 30 Sep 2022 10:14:50 +0800 X-OQ-MSGID: <20220930021450.4138525-1-iambestgod@qq.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220929_191503_970256_62487A54 X-CRM114-Status: GOOD ( 11.94 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Yaxiong Tian In shmem_tx_prepare() ,it use spin_until_cond() to wait the chanel to be free. Though it can avoid risk about overwriting the old command.But when the platform has some problem in setting the chanel to free(such as Improper initialization ),it can lead to the chanel never to be free.So the os is sticked in it.In addition when shmem_tx_prepare() called,this indicates that the previous transfer has commpleted or timed out.It unsuitable for unconditional waiting the chanel to be free. So for system stablility,we can add timeout condition in waiting the chanel to be free. Fixes: 9dc34d635c67 ("firmware: arm_scmi: Check if platform has released shmem before using") Signed-off-by: Yaxiong Tian Cc: stable@vger.kernel.org Cc: Sudeep Holla Cc: Jim Quinlan --- drivers/firmware/arm_scmi/shmem.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/firmware/arm_scmi/shmem.c b/drivers/firmware/arm_scmi/shmem.c index 0e3eaea5d852..ae6110a81855 100644 --- a/drivers/firmware/arm_scmi/shmem.c +++ b/drivers/firmware/arm_scmi/shmem.c @@ -8,6 +8,7 @@ #include #include #include +#include #include "common.h" @@ -29,17 +30,27 @@ struct scmi_shared_mem { u8 msg_payload[]; }; +#define SCMI_MAX_TX_PREPARE_TIMEOUT_MS 30 + void shmem_tx_prepare(struct scmi_shared_mem __iomem *shmem, struct scmi_xfer *xfer) { + ktime_t stop = ktime_add_ms(ktime_get(), SCMI_MAX_TX_PREPARE_TIMEOUT_MS); /* * Ideally channel must be free by now unless OS timeout last * request and platform continued to process the same, wait * until it releases the shared memory, otherwise we may endup * overwriting its response with new message payload or vice-versa */ - spin_until_cond(ioread32(&shmem->channel_status) & - SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE); + spin_until_cond((ioread32(&shmem->channel_status) & + SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE) || + ktime_after(ktime_get(), stop)); + + if (unlikely(ktime_after(ktime_get(), stop))) { + pr_err("timed out in shmem_tx_prepare(caller: %pS).\n", + (void *)_RET_IP_); + } + /* Mark channel busy + clear error */ iowrite32(0x0, &shmem->channel_status); iowrite32(xfer->hdr.poll_completion ? 0 : SCMI_SHMEM_FLAG_INTR_ENABLED, -- 2.25.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel