From patchwork Sat Aug 20 12:56:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tudor Ambarus X-Patchwork-Id: 12949671 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 25AECC32792 for ; Sat, 20 Aug 2022 12:59:02 +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:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date:Subject:To :From: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=RrNtqFq3UH3z6QwKPfWz04m9u2savlerHRGBOVuC21Y=; b=49YkTDK3+EIOcR rYMpI8NE77tJkhcKqigXIh6M1BisU+3KnoGtX/su717/HP1fwDCN2RXPlb2hhiEglSpfXy6NAgvhY yvEiqWAlK36ubNH9KU1wfJiMrOdkosjzXTNTBmnNvnhrFBtcUdmn54laYIQ0N8DiHIYfIY9iWbjQF eAip3VFq9yO5rvz8R5Pgxmd9BbE91KgpoGfE+2Wt/sQpREac45vhex1IKRcSZwMOCBEBl01fnj0o0 Na8tZTMPiGaeXnFX7zB6tXjKbANKRvXPJbOBKrzqZImmbiGUsa1IZRMVgQ33rZQAHmRMOOBcbOXEj oVJAX5ea5NJbwKz2yzuQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oPO2e-00ACQF-0T; Sat, 20 Aug 2022 12:57:32 +0000 Received: from esa.microchip.iphmx.com ([68.232.153.233]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oPO2Z-00ACNx-Qt for linux-arm-kernel@lists.infradead.org; Sat, 20 Aug 2022 12:57:30 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1661000247; x=1692536247; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=OCV3OM/a3X2mfO+t0BGgOheZWzie85uQFCEZzowl7JE=; b=yAY/K1WN9DJ/xOPRRmLpSJw9RTyZje0xfbCQw63sIEAF4LGXzDjD6JjY nomE2c1tVsDFpGzCC8G37lp/XfTATwqKdbWDB4zUnWbLXzIgIIVpwLfX2 xGQSqNxDpsIijH7Gp+t8l6uoZEqSDnxds9wyxu9RqgOxlXbBrtpCtdstZ hgBBcWsaqOl2rqYH5wgWxDvlDnRmq3XgtF4l3VKo4A8jDBJrLz4YBPC7l U0578OEaDO5A1Sm9PWUAB+CKmiW5jninlf7aF/FpOTXyh8cQG4KXLarlZ Gz8wPho27SA1XYgFzbMjfoEk1hx0pz/6PGm2D4oJkPkd9+s8ktrliTpqJ w==; X-IronPort-AV: E=Sophos;i="5.93,251,1654585200"; d="scan'208";a="177187997" Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa3.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 20 Aug 2022 05:57:22 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.85.144) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.12; Sat, 20 Aug 2022 05:57:22 -0700 Received: from ROB-ULT-M18064N.mchp-main.com (10.10.115.15) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server id 15.1.2507.12 via Frontend Transport; Sat, 20 Aug 2022 05:57:19 -0700 From: Tudor Ambarus To: , , , Subject: [PATCH 00/33] dmaengine: at_hdmac: Fix concurrency bugs and then convert to virt-dma Date: Sat, 20 Aug 2022 15:56:44 +0300 Message-ID: <20220820125717.588722-1-tudor.ambarus@microchip.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-20220820_055727_922350_D987CE2B X-CRM114-Status: GOOD ( 15.68 ) 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: , Cc: tudor.ambarus@microchip.com, linux-kernel@vger.kernel.org, maciej.sosnowski@intel.com, mripard@kernel.org, torfl6749@gmail.com, ludovic.desroches@microchip.com, dmaengine@vger.kernel.org, dan.j.williams@intel.com, linux-arm-kernel@lists.infradead.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Peter Rosin reported a memory corryption bug on Atmel SAMA5D31 that happened under high CPU load and low memory resources. See: https://lore.kernel.org/lkml/13c6c9a2-6db5-c3bf-349b-4c127ad3496a@axentia.se/ The problem was two fold: 1/ The atmel nand driver uses dma_map_single() but failed to call its dma_unmap_single() counterpart. As the DMA address space is a shared resource, one could render the machine unusable by consuming all DMA addresses. Also, failing to call dma_unmap_single translated to failing to invalidate the data cache withing that specific region. Since SAMA5D3 uses VIPT (Virtually Indexed Physically Tagged) cache model, cache aliases occured. The issue occurs when a physical memory page is mapped twice (or more) in the virtual memory space. With VIPT models, the choice of the cache line depends on the virtual address so even if two different virtual addresses are mapped to point to the very same physical address, they may use two different cache lines. Then dma_map_single() or dma_map_sg() functions, only cleans / invalidates the data cache lines associated to their virtual address argument. The cache lines used by the second virtual memory address won't be cleaned / invalidated hence cache coherency issues may occur. This was fixed at: https://lore.kernel.org/linux-mtd/20220728074014.145406-1-tudor.ambarus@microchip.com/ 2/ at_hdmac driver had poor list handling and concurrency bugs. We experienced calling of the completion call twice for the same descriptor. Fix all the concurrency bugs in at_hdmac driver and then convert the driver to use virt-dma. The series was tested with NAND (prep_dma_memcpy), MMC (prep_dma_slave_sg), usart (cyclic mode), dmatest (memcpy, memset). All went fine. With the conversion to virt-dma I replaced the election of a new transfer in the tasklet with the election of the new transfer in the interrupt handler. We should have a shorter idle window as we remove the scheduling latency of the tasklet. Using mtd_speedtest showed similar performances when using NAND with DMA. There are other some cosmetic patches that could facelift this 13 years old driver, but I'll let those for another series. Tudor Ambarus (33): dmaengine: at_hdmac: Keep register definitions and structures private to at_hdmac.c dmaengine: at_hdmac: Use bitfield access macros dmaengine: at_hdmac: Rename "dma_common" to "dma_device" dmaengine: at_hdmac: Rename "chan_common" to "dma_chan" dmaengine: at_hdmac: Remove unused member of at_dma_chan dmaengine: at_hdmac: Return dma_cookie_status()'s ret code when txstate is NULL dmaengine: at_hdmac: Fix at_lli struct definition dmaengine: at_hdmac: Don't start transactions at tx_submit level dmaengine: at_hdmac: Start transfer for cyclic channels in issue_pending dmaengine: at_hdmac: Fix premature completion of desc in issue_pending dmaengine: at_hdmac: Do not call the complete callback on device_terminate_all dmaengine: at_hdmac: Protect atchan->status with the channel lock dmaengine: at_hdmac: Fix concurrency problems by removing atc_complete_all() dmaengine: at_hdmac: Fix concurrency over descriptor dmaengine: at_hdmac: Free the memset buf without holding the chan lock dmaengine: at_hdmac: Fix concurrency over the active list dmaengine: at_hdmac: Fix descriptor handling when issuing it to hardware dmaengine: at_hdmac: Fix completion of unissued descriptor in case of errors dmaengine: at_hdmac: Don't allow CPU to reorder channel enable dmaengine: at_hdmac: Do not print messages on console while holding the lock dmaengine: at_hdmac: Fix impossible condition dmaengine: at_hdmac: Pass residue by address to avoid unneccessary implicit casts dmaengine: at_hdmac: s/atc_get_bytes_left/atc_get_residue dmaengine: at_hdmac: Introduce atc_get_llis_residue() dmaengine: at_hdmac: Remove superfluous cast dmaengine: at_hdmac: Use devm_kzalloc() and struct_size() dmaengine: at_hdmac: Use devm_platform_ioremap_resource dmaengine: at_hdmac: Use devm_request_irq() dmaengine: at_hdmac: Use devm_clk_get() dmaengine: at_hdmac: Check return code of dma_async_device_register dmaengine: at_hdmac: Use pm_ptr() dmaengine: at_hdmac: Set include entries in alphabetic order dmaengine: at_hdmac: Convert driver to use virt-dma MAINTAINERS | 1 - drivers/dma/Kconfig | 1 + drivers/dma/at_hdmac.c | 1901 ++++++++++++++++++----------------- drivers/dma/at_hdmac_regs.h | 478 --------- 4 files changed, 985 insertions(+), 1396 deletions(-) delete mode 100644 drivers/dma/at_hdmac_regs.h