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 X-Spam-Level: X-Spam-Status: No, score=-1.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS 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 4ED14C43381 for ; Fri, 1 Mar 2019 16:07:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 27A712084F for ; Fri, 1 Mar 2019 16:07:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388962AbfCAQHU (ORCPT ); Fri, 1 Mar 2019 11:07:20 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:60352 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727952AbfCAQHU (ORCPT ); Fri, 1 Mar 2019 11:07:20 -0500 Received: from localhost (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 1397327DC83; Fri, 1 Mar 2019 16:07:18 +0000 (GMT) Date: Fri, 1 Mar 2019 17:07:15 +0100 From: Boris Brezillon To: "Tokunori Ikegami" Cc: "'liujian \(CE\)'" , "'Tokunori Ikegami'" , , , , , , , , , , Subject: Re: [PATCH v3] cfi: fix deadloop in cfi_cmdset_0002.c do_write_buffer Message-ID: <20190301170715.68d89e84@collabora.com> In-Reply-To: <005a01d4d03e$39b0e0f0$ad12a2d0$@yahoo.co.jp> References: <1551189648-58073-1-git-send-email-liujian56@huawei.com> <016001d4cf71$865e7b60$931b7220$@gmail.com> <4F88C5DDA1E80143B232E89585ACE27D0264F137@DGGEMM528-MBX.china.huawei.com> <20190228164228.734ede80@collabora.com> <005a01d4d03e$39b0e0f0$ad12a2d0$@yahoo.co.jp> Organization: Collabora X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Ikegami, On Fri, 1 Mar 2019 23:51:16 +0900 "Tokunori Ikegami" wrote: > > Except this version no longer does what Vignesh suggested. See how you > > no longer test if chip_good() is true if time_after() returns true. So, > > imagine the thread entering this function is preempted just after the > > first chip_good() test, and resumed a few ms later. time_after() will > > return true, but chip_good() might also return true, and you ignore it. > > I think that the following 3 versions will be worked for time_after() as a same result and follow the Vignesh-san suggestion. Let me show you how they are different: > > 1. Original Vignesh-san suggestion > > if (chip_good(map, adr, datum)) { > xip_enable(map, chip, adr); > goto op_done; > } --> thread preempted here ==> chip_good() test becomes valid here --> thread resumed here, but timeout has expired > > if (time_after(jiffies, timeo)) { you enter this branch > /* Test chip_good() if TRUE incorrectly again so write failure by time_after() can be avoided. */ > if (chip_good(map, adr, datum)) { chip_good() returns true > xip_enable(map, chip, adr); > goto op_done; > } > break; > } > > 2. Liujian-san v3 patch > > /* Test chip_good() if FALSE correctly so write failure by time_after() can be avoided. */ --> thread preempted here ==> chip_good() test becomes valid here --> thread resumed here, but timeout has expired > if (time_after(jiffies, timeo) && !chip_good(map, adr)) You do not enter this branch because the chip_good() test is done once more in case of timeout. > break; > > if (chip_good(map, adr, datum)) { > xip_enable(map, chip, adr); > goto op_done; > } > > 3. My idea > > /* Save current jiffies value before chip_good() to avoid write failure by time_after() without testing chip_good() again. */ > unsigned long now = jiffies; > > if (chip_good(map, adr, datum)) { > xip_enable(map, chip, adr); > goto op_done; > } > --> thread preempted here ==> chip_good() test becomes valid here --> thread resumed here, but timeout has expired > if (time_after(now, timeo)) You do enter this branch, and erroneously report a failure. > break; > See now why your version is not correct? Regards, Boris 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 X-Spam-Level: X-Spam-Status: No, score=-1.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_PASS, URIBL_BLOCKED autolearn=unavailable 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 0D7C9C43381 for ; Fri, 1 Mar 2019 16:07:30 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id CECEB2084F for ; Fri, 1 Mar 2019 16:07:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="uWJu5nZq" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CECEB2084F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=k1zgmNVaQZYUrNISzLnFHYO6mlpEqih7JSBJr+npoGA=; b=uWJu5nZqYzywey rwGhQU0WAO9mW7v1HLhatALnolwjgWift5T3kDEYQxl/kNBfkX/c1MTl9SOwzIH9KgSR9Ym4EPXbZ DzD12QgWcyDxYIZDorx21rGo5vvXjCCeVoW0P1Ovdrjv2V6c4FhpocmFECHuC0PeI5qCRsqGPNdfI 4Jl+x8AH9vYix/59zV51uK3LueQTMfgFvGB3eC2HBP2A2yZgh4NSg1opLaPX8XFkaJtDfjRyGyy21 vSsBgjEXWEKhG7HuIV9KUDTjM88PBTcfGH76DwEm86eA4t4MQtQd9TvFKoozLHEUCCD2bHxmq+x3X LuUrVkec7imCxo75W+5g==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gzkh4-0003lf-8N; Fri, 01 Mar 2019 16:07:26 +0000 Received: from bhuna.collabora.co.uk ([46.235.227.227]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gzkh0-0003ki-J6 for linux-mtd@lists.infradead.org; Fri, 01 Mar 2019 16:07:24 +0000 Received: from localhost (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 1397327DC83; Fri, 1 Mar 2019 16:07:18 +0000 (GMT) Date: Fri, 1 Mar 2019 17:07:15 +0100 From: Boris Brezillon To: "Tokunori Ikegami" Subject: Re: [PATCH v3] cfi: fix deadloop in cfi_cmdset_0002.c do_write_buffer Message-ID: <20190301170715.68d89e84@collabora.com> In-Reply-To: <005a01d4d03e$39b0e0f0$ad12a2d0$@yahoo.co.jp> References: <1551189648-58073-1-git-send-email-liujian56@huawei.com> <016001d4cf71$865e7b60$931b7220$@gmail.com> <4F88C5DDA1E80143B232E89585ACE27D0264F137@DGGEMM528-MBX.china.huawei.com> <20190228164228.734ede80@collabora.com> <005a01d4d03e$39b0e0f0$ad12a2d0$@yahoo.co.jp> Organization: Collabora X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-redhat-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190301_080722_765377_CCCB9830 X-CRM114-Status: GOOD ( 12.73 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: 'Tokunori Ikegami' , keescook@chromium.org, bbrezillon@kernel.org, ikegami@allied-telesis.co.jp, richard@nod.at, linux-kernel@vger.kernel.org, marek.vasut@gmail.com, linux-mtd@lists.infradead.org, computersforpeace@gmail.com, dwmw2@infradead.org, "'liujian \(CE\)'" , vigneshr@ti.com Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org Hi Ikegami, On Fri, 1 Mar 2019 23:51:16 +0900 "Tokunori Ikegami" wrote: > > Except this version no longer does what Vignesh suggested. See how you > > no longer test if chip_good() is true if time_after() returns true. So, > > imagine the thread entering this function is preempted just after the > > first chip_good() test, and resumed a few ms later. time_after() will > > return true, but chip_good() might also return true, and you ignore it. > > I think that the following 3 versions will be worked for time_after() as a same result and follow the Vignesh-san suggestion. Let me show you how they are different: > > 1. Original Vignesh-san suggestion > > if (chip_good(map, adr, datum)) { > xip_enable(map, chip, adr); > goto op_done; > } --> thread preempted here ==> chip_good() test becomes valid here --> thread resumed here, but timeout has expired > > if (time_after(jiffies, timeo)) { you enter this branch > /* Test chip_good() if TRUE incorrectly again so write failure by time_after() can be avoided. */ > if (chip_good(map, adr, datum)) { chip_good() returns true > xip_enable(map, chip, adr); > goto op_done; > } > break; > } > > 2. Liujian-san v3 patch > > /* Test chip_good() if FALSE correctly so write failure by time_after() can be avoided. */ --> thread preempted here ==> chip_good() test becomes valid here --> thread resumed here, but timeout has expired > if (time_after(jiffies, timeo) && !chip_good(map, adr)) You do not enter this branch because the chip_good() test is done once more in case of timeout. > break; > > if (chip_good(map, adr, datum)) { > xip_enable(map, chip, adr); > goto op_done; > } > > 3. My idea > > /* Save current jiffies value before chip_good() to avoid write failure by time_after() without testing chip_good() again. */ > unsigned long now = jiffies; > > if (chip_good(map, adr, datum)) { > xip_enable(map, chip, adr); > goto op_done; > } > --> thread preempted here ==> chip_good() test becomes valid here --> thread resumed here, but timeout has expired > if (time_after(now, timeo)) You do enter this branch, and erroneously report a failure. > break; > See now why your version is not correct? Regards, Boris ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/