From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BEC01299959 for ; Mon, 17 Nov 2025 21:12:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763413970; cv=none; b=an0JL3+F194GFOR2AZIjsqIltYGvWgzEQCZOQa4zqP99K/Z5eFlLOVnfphzFhv8lUoqpPMuLu4+4Wf2ZrBqS8/Wh2OYOhogKaSUvItu1ot7apBDf+VjlPZ0Ka00s6/EAvKTzdlG7Cb2UpAuMnvIF1kCD2K1qnbJb17DyaeCvwyc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763413970; c=relaxed/simple; bh=06g6Ze5++elbefzL2fov8fU8vPKEBx2BVXi1ANCwzv4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=SRqQbxfvLoZnSoqzyTQy1qxWi4cqi5Ib7uSEyk2cPiuoOGfNnfBfCTWzNWT1Qq4kVgf3yAU7ciL83dIcfK8oVnaO++fTe5Tam5W0BITtzqihRScOAAYodDDeQcThItnPaqr0n7W1SSE0C7CidsPgg/HgUQyscyueke5jiryBOEg= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bDEn/AqY; arc=none smtp.client-ip=209.85.210.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bDEn/AqY" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-7b8bbf16b71so5238002b3a.2 for ; Mon, 17 Nov 2025 13:12:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1763413968; x=1764018768; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=DuXcd6ZXNfZRwCh9su49jDLB1TDteKCX2U/VlZmUj0o=; b=bDEn/AqYf3d1koz+eAKBT1KRgMPzqc3m9ZCdQQpA1SAOJUWFn9gH9WuHQyr2dosx5r sz757b1aCb5MSQ8Lmxd1m10BIOfUQV7logN4KT+hwkLWFSVZslbySi9HGRcUEddVSmzV aIsv9WnzQejK7bjYl5DZinDx5V4qg/eiheXniOJOcjIAfDn2mTs7s7oYZtiBhoVytz2i XiE97odU49sAiaadHDDey1g5uWdxQZ829Cg+grihqQPKy0I3Hh2jGFBYPGpxWW2Yhe4o xhyit8GjsC2ku6QMjKUttnViR0DqfuuyNHPeMpkmnEn3j+JnRsSLsJ6QR82d4EEeKwrL /6Gg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763413968; x=1764018768; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=DuXcd6ZXNfZRwCh9su49jDLB1TDteKCX2U/VlZmUj0o=; b=RW5WZfmpRMC7KRouyQJYJK658JU8tbMQFprshzrd5mZJQQcak2BIIj80jRmm/OAdrz z6FS2YHFpVmckA+JeE+G9bJbUqj5UbCL2dGjqMvxSA5Wpck2DgAp1M2gPpkQ8XTmE/Nf ylEO4iWUB6uSdga4aLkw6fUnAub475QkNZIyavlR8bDEBy9vEa230iGfe7yqWJMyLX5E 6scHD5svkL+z6VJEq1Brh3l8FgfWxtdffzHFwqKihzoQVz2SZ6BlgtUrdoV2sjfmgfuP ieCuuQJN8U81yOYje/seYN2ZOalm3PPcVMbXK/uSg9p1D+Sp3PvRTPhXtwQEIy+WnCqb pwQg== X-Forwarded-Encrypted: i=1; AJvYcCVyH+dz3W1Ml8Xl8z4r0w8ECU8wOuIy8Waohet1Uob9pnot2IYs6EwJ6rtlaEmzD2xwGQaosoTsFY679Aw=@vger.kernel.org X-Gm-Message-State: AOJu0YzsvXO2uVyyJwj8G1STFy/dx/m3uBAYaWs61CQFM+fr3oNNQfYf yUh8MAXfYhZUQvvLP9aSYeTf5f2NXAmfvQDzqWqsInZBAqzof2HSX693 X-Gm-Gg: ASbGnctSZWuABWVghCTbWmXjcYMxf33n/esiWvqcA9a2FlsRDY7lWB4jBPh0OGdUm1D gDwztimfjswHIUhWMpZt2DXmenWA3WCW+8nAbEEWAkRz8l1lvYmhTpd2JqcKpby78CvlotoIfFt MRlWVL6Q3KHBRIGELD7bnogWrxd1AN3MUfS5stxE8+7/5ObSA2LF4xpqf7BdMoJFtLNAs6XRvys K39BLDh5ZBuv31+o8tuowdDfCt2yTVfuz8Op4qWyPsems1BVZLJl8nUDeYR8+eHum8R2zPIK9/C RG3ihU725gxGPhxvq7tcRS7oTg/aZ3CMWSYt4vvjSRiBs8JND60RQZBgSHKDSt7pryo+y988pdN 7saTnABUguik8QpHLh9zFBAe2zTQrRXj5Ol6NTczwh50wV7fXsDu2Z5r9e4rmAwQ53NqRI1fwPW onhP5Aq9oosiMlog+sgjBgBV6HdRLoA2zAdz8= X-Google-Smtp-Source: AGHT+IFSEUgsiZktulUmeB8pXWguWvj7s6zr3OozfhUDrxizwYtKAoo18Qyw1X6M+Z13BxEn5inB/Q== X-Received: by 2002:a05:6a20:7352:b0:34f:ce39:1f42 with SMTP id adf61e73a8af0-35b9f88dec1mr14685872637.8.1763413967976; Mon, 17 Nov 2025 13:12:47 -0800 (PST) Received: from Barrys-MBP.hub ([47.72.129.29]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-bc37703a0d9sm12820297a12.31.2025.11.17.13.12.41 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 17 Nov 2025 13:12:47 -0800 (PST) From: Barry Song <21cnbao@gmail.com> To: catalin.marinas@arm.com Cc: 21cnbao@gmail.com, ada.coupriediaz@arm.com, anshuman.khandual@arm.com, ardb@kernel.org, iommu@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, m.szyprowski@samsung.com, maz@kernel.org, robin.murphy@arm.com, ryan.roberts@arm.com, surenb@google.com, v-songbaohua@oppo.com, will@kernel.org, zhengtangquan@oppo.com Subject: Re: [RFC PATCH 5/5] dma-mapping: Allow batched DMA sync operations if supported by the arch Date: Tue, 18 Nov 2025 05:12:38 +0800 Message-Id: <20251117211238.50126-1-21cnbao@gmail.com> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On Fri, Nov 14, 2025 at 2:19 AM Catalin Marinas wrote: > > On Wed, Oct 29, 2025 at 10:31:15AM +0800, Barry Song wrote: > > diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c > > index 1f9ee9759426..a0b45f84a91f 100644 > > --- a/kernel/dma/direct.c > > +++ b/kernel/dma/direct.c > > @@ -403,9 +403,16 @@ void dma_direct_sync_sg_for_device(struct device *dev, > > swiotlb_sync_single_for_device(dev, paddr, sg->length, dir); > > > > if (!dev_is_dma_coherent(dev)) > > - arch_sync_dma_for_device(paddr, sg->length, > > - dir); > > +#ifdef CONFIG_ARCH_WANT_BATCHED_DMA_SYNC > > + arch_sync_dma_for_device_batch_add(paddr, sg->length, dir); > > +#else > > + arch_sync_dma_for_device(paddr, sg->length, dir); > > +#endif > > } > > +#ifdef CONFIG_ARCH_WANT_BATCHED_DMA_SYNC > > + if (!dev_is_dma_coherent(dev)) > > + arch_sync_dma_batch_flush(); > > +#endif > > } > > #endif > > Just a high-level comment for now. I'm not opposed to the idea of > batching the DSB barriers, we do this for ptes. However, the way it's Thanks, Catalin. I agree we need batching, as phones and embedded systems could use many DMA buffers while some chips lack DMA-coherency. > implemented in the generic files, with lots of #ifdefs, makes the code > pretty unreadable. > > Can we have something like arch_sync_dma_begin/end() and let the arch > code handle the barriers as they see fit? I guess I can refactor it as below and then remove the #ifdef/#else/#endif blocks. diff --git a/include/linux/dma-map-ops.h b/include/linux/dma-map-ops.h index 8fcd0a9c1f39..73bca4d7149d 100644 --- a/include/linux/dma-map-ops.h +++ b/include/linux/dma-map-ops.h @@ -373,6 +373,20 @@ void arch_sync_dma_for_device_batch_add(phys_addr_t paddr, size_t size, void arch_sync_dma_for_cpu_batch_add(phys_addr_t paddr, size_t size, enum dma_data_direction dir); void arch_sync_dma_batch_flush(void); +#else +static inline void arch_sync_dma_for_device_batch_add(phys_addr_t paddr, size_t size, + enum dma_data_direction dir) +{ + arch_sync_dma_for_device(paddr, size, dir); +} +static inline void arch_sync_dma_for_cpu_batch_add(phys_addr_t paddr, size_t size, + enum dma_data_direction dir) +{ + arch_sync_dma_for_cpu(paddr, size, dir); +} +static inline void arch_sync_dma_batch_flush(void) +{ +} #endif #ifdef CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c index a0b45f84a91f..69b14b0c0501 100644 --- a/kernel/dma/direct.c +++ b/kernel/dma/direct.c @@ -403,16 +403,10 @@ void dma_direct_sync_sg_for_device(struct device *dev, swiotlb_sync_single_for_device(dev, paddr, sg->length, dir); if (!dev_is_dma_coherent(dev)) -#ifdef CONFIG_ARCH_WANT_BATCHED_DMA_SYNC arch_sync_dma_for_device_batch_add(paddr, sg->length, dir); -#else - arch_sync_dma_for_device(paddr, sg->length, dir); -#endif } -#ifdef CONFIG_ARCH_WANT_BATCHED_DMA_SYNC if (!dev_is_dma_coherent(dev)) arch_sync_dma_batch_flush(); -#endif } #endif @@ -429,11 +423,7 @@ void dma_direct_sync_sg_for_cpu(struct device *dev, phys_addr_t paddr = dma_to_phys(dev, sg_dma_address(sg)); if (!dev_is_dma_coherent(dev)) -#ifdef CONFIG_ARCH_WANT_BATCHED_DMA_SYNC arch_sync_dma_for_cpu_batch_add(paddr, sg->length, dir); -#else - arch_sync_dma_for_cpu(paddr, sg->length, dir); -#endif swiotlb_sync_single_for_cpu(dev, paddr, sg->length, dir); @@ -443,9 +433,7 @@ void dma_direct_sync_sg_for_cpu(struct device *dev, if (!dev_is_dma_coherent(dev)) { arch_sync_dma_for_cpu_all(); -#ifdef CONFIG_ARCH_WANT_BATCHED_DMA_SYNC arch_sync_dma_batch_flush(); -#endif } } @@ -458,29 +446,19 @@ void dma_direct_unmap_sg(struct device *dev, struct scatterlist *sgl, { struct scatterlist *sg; int i; -#ifdef CONFIG_ARCH_WANT_BATCHED_DMA_SYNC bool need_sync = false; -#endif for_each_sg(sgl, sg, nents, i) { if (sg_dma_is_bus_address(sg)) { sg_dma_unmark_bus_address(sg); } else { -#ifdef CONFIG_ARCH_WANT_BATCHED_DMA_SYNC need_sync = true; dma_direct_unmap_phys_batch_add(dev, sg->dma_address, sg_dma_len(sg), dir, attrs); - -#else - dma_direct_unmap_phys(dev, sg->dma_address, - sg_dma_len(sg), dir, attrs); -#endif } } -#ifdef CONFIG_ARCH_WANT_BATCHED_DMA_SYNC if (need_sync && !dev_is_dma_coherent(dev)) arch_sync_dma_batch_flush(); -#endif } #endif @@ -490,9 +468,7 @@ int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, int nents, struct pci_p2pdma_map_state p2pdma_state = {}; struct scatterlist *sg; int i, ret; -#ifdef CONFIG_ARCH_WANT_BATCHED_DMA_SYNC bool need_sync = false; -#endif for_each_sg(sgl, sg, nents, i) { switch (pci_p2pdma_state(&p2pdma_state, dev, sg_page(sg))) { @@ -504,14 +480,9 @@ int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, int nents, */ break; case PCI_P2PDMA_MAP_NONE: -#ifdef CONFIG_ARCH_WANT_BATCHED_DMA_SYNC need_sync = true; sg->dma_address = dma_direct_map_phys_batch_add(dev, sg_phys(sg), sg->length, dir, attrs); -#else - sg->dma_address = dma_direct_map_phys(dev, sg_phys(sg), - sg->length, dir, attrs); -#endif if (sg->dma_address == DMA_MAPPING_ERROR) { ret = -EIO; goto out_unmap; @@ -529,10 +500,8 @@ int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, int nents, sg_dma_len(sg) = sg->length; } -#ifdef CONFIG_ARCH_WANT_BATCHED_DMA_SYNC if (need_sync && !dev_is_dma_coherent(dev)) arch_sync_dma_batch_flush(); -#endif return nents; out_unmap: Thanks Barry