From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Brezillon Subject: [PATCH 0/4] scatterlist: sg_table from virtual pointer Date: Thu, 31 Mar 2016 14:29:40 +0200 Message-ID: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Cc: Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org To: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon Return-path: Sender: owner-linux-mm@kvack.org List-Id: linux-crypto.vger.kernel.org Hello, This series has been extracted from another series [1] adding support for DMA operations in a NAND driver. The reason I decided to post those patches separately is because they are touching core stuff, and I'd like to have feedback on these specific aspects. The idea is to provide a generic function creating an sg_table from a virtual pointer and a length. This operation is complicated by the different memory regions exposed in kernel space. For example, you have the lowmem region, which guarantees that buffers are physically contiguous, while the vmalloc region does not. sg_alloc_table_from_buf() detects in which memory region your buffer reside, and takes the appropriate precautions when creating the sg_table. This function also takes an extract parameter, allowing one to specify extra constraints, like the maximum DMA segment size, the required and the preferred alignment. Patch 1 and 2 are implementing sg_alloc_table_from_buf() (patch 1 is needed to properly detect buffers residing in the highmem/kmap area). Patch 3 is making use of sg_alloc_table_from_buf() in the spi_map_buf() function (hopefully, other subsystems/drivers will be able to easily switch to this function too). Patch 4 is implementing what I really need: generic functions to map/unmap a virtual buffer passed through mtd->_read/_write(). I'm not exactly a DMA or MM experts, so that would be great to have feedbacks on this approach. That's why I added so many people in Cc even if they're not directly impacted by those patches. Let me know if you want me to drop/add people from/to the recipient list. Thanks. Best Regards, Boris [1]http://www.spinics.net/lists/arm-kernel/msg493552.html Boris Brezillon (4): mm: add is_highmem_addr() helper scatterlist: add sg_alloc_table_from_buf() helper spi: use sg_alloc_table_from_buf() mtd: provide helper to prepare buffers for DMA operations drivers/mtd/mtdcore.c | 66 ++++++++++++++++ drivers/spi/spi.c | 45 ++--------- include/linux/highmem.h | 13 ++++ include/linux/mtd/mtd.h | 25 ++++++ include/linux/scatterlist.h | 24 ++++++ lib/scatterlist.c | 183 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 316 insertions(+), 40 deletions(-) -- 2.5.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Brezillon Subject: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper Date: Thu, 31 Mar 2016 14:29:42 +0200 Message-ID: <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Cc: Mark Brown , linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Vinod Koul , Dan Williams , dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Vignesh R , linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org, Joerg Roedel , iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: David Woodhouse , Brian Norris , linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Andrew Morton , Dave Gordon Return-path: In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> Sender: linux-spi-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: linux-crypto.vger.kernel.org sg_alloc_table_from_buf() provides an easy solution to create an sg_table from a virtual address pointer. This function takes care of dealing with vmallocated buffers, buffer alignment, or DMA engine limitations (maximum DMA transfer size). Signed-off-by: Boris Brezillon --- include/linux/scatterlist.h | 24 ++++++ lib/scatterlist.c | 183 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 207 insertions(+) diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 556ec1e..18d1091 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h @@ -41,6 +41,27 @@ struct sg_table { unsigned int orig_nents; /* original size of list */ }; +/** + * struct sg_constraints - SG constraints structure + * + * @max_segment_size: maximum segment length. Each SG entry has to be smaller + * than this value. Zero means no constraint. + * @required_alignment: minimum alignment. Is used for both size and pointer + * alignment. If this constraint is not met, the function + * should return -EINVAL. + * @preferred_alignment: preferred alignment. Mainly used to optimize + * throughput when the DMA engine performs better when + * doing aligned accesses. + * + * This structure is here to help sg_alloc_table_from_buf() create the optimal + * SG list based on DMA engine constraints. + */ +struct sg_constraints { + size_t max_segment_size; + size_t required_alignment; + size_t preferred_alignment; +}; + /* * Notes on SG table design. * @@ -265,6 +286,9 @@ int sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pages, unsigned int n_pages, unsigned long offset, unsigned long size, gfp_t gfp_mask); +int sg_alloc_table_from_buf(struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + gfp_t gfp_mask); size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, void *buf, size_t buflen, off_t skip, bool to_buffer); diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 004fc70..9c9746e 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -433,6 +433,189 @@ int sg_alloc_table_from_pages(struct sg_table *sgt, } EXPORT_SYMBOL(sg_alloc_table_from_pages); +static size_t sg_buf_chunk_len(const void *buf, size_t len, + const struct sg_constraints *cons) +{ + size_t chunk_len = len; + + if (cons->max_segment_size) + chunk_len = min_t(size_t, chunk_len, cons->max_segment_size); + + if (is_vmalloc_addr(buf)) { + unsigned long offset_in_page = offset_in_page(buf); + size_t contig_len = PAGE_SIZE - offset_in_page; + unsigned long phys = vmalloc_to_pfn(buf) - offset_in_page; + const void *contig_ptr = buf + contig_len; + + /* + * Vmalloced buffer might be composed of several physically + * contiguous pages. Avoid extra scattergather entries in + * this case. + */ + while (contig_len < chunk_len) { + if (phys + PAGE_SIZE != vmalloc_to_pfn(contig_ptr)) + break; + + contig_len += PAGE_SIZE; + contig_ptr += PAGE_SIZE; + phys += PAGE_SIZE; + } + + chunk_len = min_t(size_t, chunk_len, contig_len); + } + + if (!IS_ALIGNED((unsigned long)buf, cons->preferred_alignment)) { + const void *aligned_buf = PTR_ALIGN(buf, + cons->preferred_alignment); + size_t unaligned_len = (unsigned long)(aligned_buf - buf); + + chunk_len = min_t(size_t, chunk_len, unaligned_len); + } else if (chunk_len > cons->preferred_alignment) { + chunk_len &= ~(cons->preferred_alignment - 1); + } + + return chunk_len; +} + +#define sg_for_each_chunk_in_buf(buf, len, chunk_len, constraints) \ + for (chunk_len = sg_buf_chunk_len(buf, len, constraints); \ + len; \ + len -= chunk_len, buf += chunk_len, \ + chunk_len = sg_buf_chunk_len(buf, len, constraints)) + +static int sg_check_constraints(struct sg_constraints *cons, + const void *buf, size_t len) +{ + /* + * We only accept buffers coming from the lowmem, vmalloc and + * highmem regions. + */ + if (!virt_addr_valid(buf) && !is_vmalloc_addr(buf) && + !is_highmem_addr(buf)) + return -EINVAL; + + if (!cons->required_alignment) + cons->required_alignment = 1; + + if (!cons->preferred_alignment) + cons->preferred_alignment = cons->required_alignment; + + /* Test if buf and len are properly aligned. */ + if (!IS_ALIGNED((unsigned long)buf, cons->required_alignment) || + !IS_ALIGNED(len, cons->required_alignment)) + return -EINVAL; + + /* + * if the buffer has been vmallocated or kmapped and required_alignment + * is more than PAGE_SIZE we cannot guarantee it. + */ + if (!virt_addr_valid(buf) && cons->required_alignment > PAGE_SIZE) + return -EINVAL; + + /* + * max_segment_size has to be aligned to required_alignment to + * guarantee that all buffer chunks are aligned correctly. + */ + if (!IS_ALIGNED(cons->max_segment_size, cons->required_alignment)) + return -EINVAL; + + /* + * preferred_alignment has to be aligned to required_alignment + * to avoid misalignment of buffer chunks. + */ + if (!IS_ALIGNED(cons->preferred_alignment, cons->required_alignment)) + return -EINVAL; + + return 0; +} + +/** + * sg_alloc_table_from_buf - create an SG table from a buffer + * + * @sgt: SG table + * @buf: buffer you want to create this SG table from + * @len: length of buf + * @constraints: optional constraints to take into account when creating + * the SG table. Can be NULL if no specific constraints are + * required. + * @gfp_mask: type of allocation to use when creating the table + * + * This function creates an SG table from a buffer, its length and some + * SG constraints. + * + * Note: This function supports buffers coming from the lowmem, vmalloc or + * highmem region. + */ +int sg_alloc_table_from_buf(struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + gfp_t gfp_mask) +{ + struct sg_constraints cons = { }; + size_t remaining, chunk_len; + const void *sg_buf; + int i, ret; + + if (constraints) + cons = *constraints; + + ret = sg_check_constraints(&cons, buf, len); + if (ret) + return ret; + + sg_buf = buf; + remaining = len; + i = 0; + sg_for_each_chunk_in_buf(sg_buf, remaining, chunk_len, &cons) + i++; + + ret = sg_alloc_table(sgt, i, gfp_mask); + if (ret) + return ret; + + sg_buf = buf; + remaining = len; + i = 0; + sg_for_each_chunk_in_buf(sg_buf, remaining, chunk_len, &cons) { + if (virt_addr_valid(buf)) { + /* + * Buffer is in lowmem, we can safely call + * sg_set_buf(). + */ + sg_set_buf(&sgt->sgl[i], sg_buf, chunk_len); + } else { + struct page *vm_page; + + /* + * Buffer has been obtained with vmalloc() or kmap(). + * In this case we have to extract the page information + * and use sg_set_page(). + */ + if (is_vmalloc_addr(sg_buf)) + vm_page = vmalloc_to_page(sg_buf); + else + vm_page = kmap_to_page((void *)sg_buf); + + if (!vm_page) { + ret = -ENOMEM; + goto err_free_table; + } + + sg_set_page(&sgt->sgl[i], vm_page, chunk_len, + offset_in_page(sg_buf)); + } + + i++; + } + + return 0; + +err_free_table: + sg_free_table(sgt); + + return ret; +} +EXPORT_SYMBOL(sg_alloc_table_from_buf); + void __sg_page_iter_start(struct sg_page_iter *piter, struct scatterlist *sglist, unsigned int nents, unsigned long pgoffset) -- 2.5.0 -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Brezillon Subject: [PATCH 1/4] mm: add is_highmem_addr() helper Date: Thu, 31 Mar 2016 14:29:41 +0200 Message-ID: <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Cc: Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org To: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon Return-path: In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Sender: owner-linux-mm@kvack.org List-Id: linux-crypto.vger.kernel.org Add an helper to check if a virtual address is in the highmem region. Signed-off-by: Boris Brezillon --- include/linux/highmem.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/linux/highmem.h b/include/linux/highmem.h index bb3f329..13dff37 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -41,6 +41,14 @@ void kmap_flush_unused(void); struct page *kmap_to_page(void *addr); +static inline bool is_highmem_addr(const void *x) +{ + unsigned long vaddr = (unsigned long)x; + + return vaddr >= PKMAP_BASE && + vaddr < ((PKMAP_BASE + LAST_PKMAP) * PAGE_SIZE); +} + #else /* CONFIG_HIGHMEM */ static inline unsigned int nr_free_highpages(void) { return 0; } @@ -50,6 +58,11 @@ static inline struct page *kmap_to_page(void *addr) return virt_to_page(addr); } +static inline bool is_highmem_addr(const void *x) +{ + return false; +} + #define totalhigh_pages 0UL #ifndef ARCH_HAS_KMAP -- 2.5.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Brezillon Subject: [PATCH 3/4] spi: use sg_alloc_table_from_buf() Date: Thu, 31 Mar 2016 14:29:43 +0200 Message-ID: <1459427384-21374-4-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Cc: Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org To: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon Return-path: In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Sender: owner-linux-mm@kvack.org List-Id: linux-crypto.vger.kernel.org Replace custom implementation of sg_alloc_table_from_buf() by a call to sg_alloc_table_from_buf(). Signed-off-by: Boris Brezillon --- drivers/spi/spi.c | 45 +++++---------------------------------------- 1 file changed, 5 insertions(+), 40 deletions(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index de2f2f9..eed461d 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -705,49 +705,14 @@ static int spi_map_buf(struct spi_master *master, struct device *dev, struct sg_table *sgt, void *buf, size_t len, enum dma_data_direction dir) { - const bool vmalloced_buf = is_vmalloc_addr(buf); - unsigned int max_seg_size = dma_get_max_seg_size(dev); - int desc_len; - int sgs; - struct page *vm_page; - void *sg_buf; - size_t min; - int i, ret; - - if (vmalloced_buf) { - desc_len = min_t(int, max_seg_size, PAGE_SIZE); - sgs = DIV_ROUND_UP(len + offset_in_page(buf), desc_len); - } else { - desc_len = min_t(int, max_seg_size, master->max_dma_len); - sgs = DIV_ROUND_UP(len, desc_len); - } + struct sg_constraints constraints = { }; + int ret; - ret = sg_alloc_table(sgt, sgs, GFP_KERNEL); - if (ret != 0) + constraints.max_segment_size = dma_get_max_seg_size(dev); + ret = sg_alloc_table_from_buf(sgt, buf, len, &constraints, GFP_KERNEL); + if (ret) return ret; - for (i = 0; i < sgs; i++) { - - if (vmalloced_buf) { - min = min_t(size_t, - len, desc_len - offset_in_page(buf)); - vm_page = vmalloc_to_page(buf); - if (!vm_page) { - sg_free_table(sgt); - return -ENOMEM; - } - sg_set_page(&sgt->sgl[i], vm_page, - min, offset_in_page(buf)); - } else { - min = min_t(size_t, len, desc_len); - sg_buf = buf; - sg_set_buf(&sgt->sgl[i], sg_buf, min); - } - - buf += min; - len -= min; - } - ret = dma_map_sg(dev, sgt->sgl, sgt->nents, dir); if (!ret) ret = -ENOMEM; -- 2.5.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Brezillon Subject: [PATCH 4/4] mtd: provide helper to prepare buffers for DMA operations Date: Thu, 31 Mar 2016 14:29:44 +0200 Message-ID: <1459427384-21374-5-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Cc: Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org To: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon Return-path: In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Sender: owner-linux-mm@kvack.org List-Id: linux-crypto.vger.kernel.org Some NAND controller drivers are making use of DMA to transfer data from the controller to the buffer passed by the MTD user. Provide a generic mtd_map/unmap_buf() implementation to avoid open coded (and sometime erroneous) implementations. Signed-off-by: Boris Brezillon --- drivers/mtd/mtdcore.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/mtd/mtd.h | 25 +++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 3096251..4c20f33 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c @@ -1253,6 +1253,72 @@ void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size) } EXPORT_SYMBOL_GPL(mtd_kmalloc_up_to); +#ifdef CONFIG_HAS_DMA +/** + * mtd_map_buf - create an SG table and prepare it for DMA operations + * + * @mtd: mtd device description object pointer + * @dev: device handling the DMA operation + * @buf: buf used to create the SG table + * @len: length of buf + * @constraints: optional constraints to take into account when creating + * the SG table. Can be NULL if no specific constraints + * are required. + * @dir: direction of the DMA operation + * + * This function should be used when an MTD driver wants to do DMA operations + * on a buffer passed by the MTD layer. This functions takes care of + * vmallocated buffer constraints, and return and sg_table that you can safely + * use. + */ +int mtd_map_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + enum dma_data_direction dir) +{ + int ret; + + ret = sg_alloc_table_from_buf(sgt, buf, len, constraints, GFP_KERNEL); + if (ret) + return ret; + + ret = dma_map_sg(dev, sgt->sgl, sgt->nents, dir); + if (!ret) + ret = -ENOMEM; + + if (ret < 0) { + sg_free_table(sgt); + return ret; + } + + sgt->nents = ret; + + return 0; +} +EXPORT_SYMBOL_GPL(mtd_map_buf); + +/** + * mtd_unmap_buf - unmap an SG table and release its resources + * + * @mtd: mtd device description object pointer + * @dev: device handling the DMA operation + * @sgt: SG table + * @dir: direction of the DMA operation + * + * This function unmaps a previously mapped SG table and release SG table + * resources. Should be called when your DMA operation is done. + */ +void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, enum dma_data_direction dir) +{ + if (sgt->orig_nents) { + dma_unmap_sg(dev, sgt->sgl, sgt->orig_nents, dir); + sg_free_table(sgt); + } +} +EXPORT_SYMBOL_GPL(mtd_unmap_buf); +#endif /* !CONFIG_HAS_DMA */ + #ifdef CONFIG_PROC_FS /*====================================================================*/ diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 7712721..15cff85 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -410,6 +411,30 @@ extern void register_mtd_user (struct mtd_notifier *new); extern int unregister_mtd_user (struct mtd_notifier *old); void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size); +#ifdef CONFIG_HAS_DMA +int mtd_map_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + enum dma_data_direction dir); +void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, enum dma_data_direction dir); +#else +static inline int mtd_map_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, const void *buf, + size_t len, + const struct sg_constraints *constraints + enum dma_data_direction dir) +{ + return -ENOTSUPP; +} + +static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, enum dma_data_direction dir) +{ + return -ENOTSUPP; +} +#endif + void mtd_erase_callback(struct erase_info *instr); static inline int mtd_is_bitflip(int err) { -- 2.5.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 From: Russell King - ARM Linux Subject: Re: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper Date: Thu, 31 Mar 2016 15:14:13 +0100 Message-ID: <20160331141412.GK19428@n2100.arm.linux.org.uk> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon , linux-crypto@vger.kernel.org, Herbert Xu , Vinod Koul , Richard Weinberger , Joerg Roedel , linux-kernel@vger.kernel.org, linux-spi@vger.kernel.org, Vignesh R , linux-mm@kvack.org, iommu@lists.linux-foundation.org, Mark Brown , Hans Verkuil , Laurent Pinchart , dmaengine@vger.kernel.org, Dan Williams , linux-media@vger.kernel.org, "David S. Miller" , linux-arm-kernel@lists.infradead.org, Mauro Carvalho Chehab To: Boris Brezillon Return-path: Received: from pandora.arm.linux.org.uk ([78.32.30.218]:44795 "EHLO pandora.arm.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751500AbcCaOOn (ORCPT ); Thu, 31 Mar 2016 10:14:43 -0400 Content-Disposition: inline In-Reply-To: <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> Sender: linux-crypto-owner@vger.kernel.org List-ID: On Thu, Mar 31, 2016 at 02:29:42PM +0200, Boris Brezillon wrote: > sg_alloc_table_from_buf() provides an easy solution to create an sg_table > from a virtual address pointer. This function takes care of dealing with > vmallocated buffers, buffer alignment, or DMA engine limitations (maximum > DMA transfer size). Please note that the DMA API does not take account of coherency of memory regions other than non-high/lowmem - there are specific extensions to deal with this. What this means is that having an API that takes any virtual address pointer, converts it to a scatterlist which is then DMA mapped, is unsafe. It'll be okay for PIPT and non-aliasing VIPT cache architectures, but for other cache architectures this will hide this problem and make review harder. -- RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/ FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up according to speedtest.net. From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Brezillon Subject: Re: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper Date: Thu, 31 Mar 2016 16:45:57 +0200 Message-ID: <20160331164557.544ed780@bbrezillon> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> <20160331141412.GK19428@n2100.arm.linux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Cc: David Woodhouse , Brian Norris , linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Andrew Morton , Dave Gordon , linux-crypto-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Herbert Xu , Vinod Koul , Richard Weinberger , Joerg Roedel , linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Vignesh R , linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, Mark Brown , Hans Verkuil , Laurent Pinchart , dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Dan Williams , linux-media-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, "David S. Miller" , linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Mauro Carvalho Chehab To: Russell King - ARM Linux Return-path: In-Reply-To: <20160331141412.GK19428-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org> Sender: linux-spi-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: linux-crypto.vger.kernel.org Hi Russell, On Thu, 31 Mar 2016 15:14:13 +0100 Russell King - ARM Linux wrote: > On Thu, Mar 31, 2016 at 02:29:42PM +0200, Boris Brezillon wrote: > > sg_alloc_table_from_buf() provides an easy solution to create an sg_table > > from a virtual address pointer. This function takes care of dealing with > > vmallocated buffers, buffer alignment, or DMA engine limitations (maximum > > DMA transfer size). > > Please note that the DMA API does not take account of coherency of memory > regions other than non-high/lowmem - there are specific extensions to > deal with this. Ok, you said 'non-high/lowmem', this means vmalloced and kmapped buffers already fall in this case, right? Could you tell me more about those specific extensions? > > What this means is that having an API that takes any virtual address > pointer, converts it to a scatterlist which is then DMA mapped, is > unsafe. Which means some implementations already get this wrong (see spi_map_buf(), and I'm pretty sure it's not the only one). > > It'll be okay for PIPT and non-aliasing VIPT cache architectures, but > for other cache architectures this will hide this problem and make > review harder. > Ok, you lost me. I'll have to do my homework and try to understand what this means :). Thanks for your valuable inputs. Best Regards, Boris -- Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html From mboxrd@z Thu Jan 1 00:00:00 1970 From: Russell King - ARM Linux Subject: Re: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper Date: Thu, 31 Mar 2016 16:09:23 +0100 Message-ID: <20160331150923.GL19428@n2100.arm.linux.org.uk> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> <20160331141412.GK19428@n2100.arm.linux.org.uk> <20160331164557.544ed780@bbrezillon> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon , linux-crypto@vger.kernel.org, Herbert Xu , Vinod Koul , Richard Weinberger , Joerg Roedel , linux-kernel@vger.kernel.org, linux-spi@vger.kernel.org, Vignesh R , linux-mm@kvack.org, iommu@lists.linux-foundation.org, Mark Brown , Hans Verkuil , Laurent Pinchart , dmaengine@vger.kernel.org, Dan Williams , linux-media@vger.kernel.org, "David S. Miller" , linux-arm-kernel@lists.infradead.org, Mauro Carvalho Chehab To: Boris Brezillon Return-path: Content-Disposition: inline In-Reply-To: <20160331164557.544ed780@bbrezillon> Sender: owner-linux-mm@kvack.org List-Id: linux-crypto.vger.kernel.org On Thu, Mar 31, 2016 at 04:45:57PM +0200, Boris Brezillon wrote: > Hi Russell, > > On Thu, 31 Mar 2016 15:14:13 +0100 > Russell King - ARM Linux wrote: > > > On Thu, Mar 31, 2016 at 02:29:42PM +0200, Boris Brezillon wrote: > > > sg_alloc_table_from_buf() provides an easy solution to create an sg_table > > > from a virtual address pointer. This function takes care of dealing with > > > vmallocated buffers, buffer alignment, or DMA engine limitations (maximum > > > DMA transfer size). > > > > Please note that the DMA API does not take account of coherency of memory > > regions other than non-high/lowmem - there are specific extensions to > > deal with this. > > Ok, you said 'non-high/lowmem', this means vmalloced and kmapped buffers > already fall in this case, right? > > Could you tell me more about those specific extensions? I was slightly confused - the extensions I was thinking of are those listed at the bottom of Documentation/cachetlb.txt, which have nothing to do with DMA. However, it's probably worth reading Documentation/DMA-API-HOWTO.txt to read up on what kinds of memory are considered to be DMA-able in the kernel. > > What this means is that having an API that takes any virtual address > > pointer, converts it to a scatterlist which is then DMA mapped, is > > unsafe. > > Which means some implementations already get this wrong (see > spi_map_buf(), and I'm pretty sure it's not the only one). Quite possible, but that is driver stuff, and driver stuff gets things wrong all the time. :) > > It'll be okay for PIPT and non-aliasing VIPT cache architectures, but > > for other cache architectures this will hide this problem and make > > review harder. > > > > Ok, you lost me. I'll have to do my homework and try to understand what > this means :). P = physical address V = virtual address I = indexed T = tag The tag is held in each cache line. When a location is looked up in the cache, an index is used to locate a set of cache lines and the tag is compared to check which cache line in the set is the correct one (or whether the address even exists in the cache.) How the index and tag are derived varies between cache architectures. PIPT = indexed by physical address, tagged with physical address. Never aliases with itself in the presence of multiple virtual mappings. VIPT = indexed by virtual address, tagged with physical address. If the bits from the virtual address do not overlap the MMU page size, it is also alias free, otherwise aliases can exist, but can be eliminated by "cache colouring" - ensuring that a physical address is always mapped with the same overlapping bits. VIVT = indexed by virtual address, tagged with virtual address. The worst kind of cache, since every different mapping of the same physical address is guaranteed by design to alias with other mappings. There is little cache colouring between different kernel mappings (eg, between lowmem and vmalloc space.) What this means is that, while the DMA API takes care of DMA aliases in the lowmem mappings, an alias-prone VIPT cache will remain incoherent with DMA if it is remapped into vmalloc space, and the mapping happens to have a different cache colour. In other words, this is a data corruption issue. Hence, taking a range of vmalloc() addresses, converting them into a scatterlist, then using the DMA API on the scatterlist _only_ guarantees that the lowmem (and kmap'd highmem mappings) are coherent with DMA. There is no way for the DMA API to know that other mappings exist, and obviously flushing every possible cache line just because a mapping might exist multiplies the expense of the DMA API: not only in terms of time spent running through all the possibilities, which doubles for every aliasing bit of VIPT, but also TLB pressure since you'd have to create a mapping for each alias and tear it back down. VIVT is even worse, since there is no other virtual mapping which is coherent, would need to be known, and each mapping would need to be individually flushed. -- RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/ FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up according to speedtest.net. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark Brown Subject: Re: [PATCH 3/4] spi: use sg_alloc_table_from_buf() Date: Thu, 31 Mar 2016 10:23:53 -0700 Message-ID: <20160331172353.GJ2350@sirena.org.uk> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-4-git-send-email-boris.brezillon@free-electrons.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1828128484583474438==" Cc: Vignesh R , linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org, linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Laurent Pinchart , Herbert Xu , Vinod Koul , Richard Weinberger , Hans Verkuil , linux-media-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Dan Williams , linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Dave Gordon , linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, linux-crypto-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Andrew Morton , Brian Norris , David Woodhouse , "David S. Miller" , Mauro Carvalho Chehab To: Boris Brezillon Return-path: In-Reply-To: <1459427384-21374-4-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org Errors-To: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org List-Id: linux-crypto.vger.kernel.org --===============1828128484583474438== Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="HHj6mHPeUinss9N+" Content-Disposition: inline --HHj6mHPeUinss9N+ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, Mar 31, 2016 at 02:29:43PM +0200, Boris Brezillon wrote: > Replace custom implementation of sg_alloc_table_from_buf() by a call to > sg_alloc_table_from_buf(). Acked-by: Mark Brown --HHj6mHPeUinss9N+ Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAEBCAAGBQJW/V0aAAoJECTWi3JdVIfQuGEH+wdaKEhHxJuIIwseLFy64w88 sFhI2BJSaVk6ppdvYIdf67ku24WUoLyYEApHSGXfhntu00xAlzBh8YZjvg6F41Yg 7Ql/wnd5YumDVMT72a9Cv1OlJ+dsUdBJuQl7/A952W53l4IR2AcBDrJ/zBWQDtOc bbohxZsXJP+Qou2Q9x8OebYsFr3p2Hw3XjteAVB6jwA9gINwDDLj05HgRCKbotHe 5bMQ3pj2I1ruS4wN44SWj7YOMvLzR3nE4xVOdHV+iaFhcVTkaYn7fuWi1fdSRChk tCB1auoxNjAIsfnsvj6nnzAOcW/kPwKzOKIgz58DZPFkgiRKDM9wuDnN2AlMPBI= =uMgt -----END PGP SIGNATURE----- --HHj6mHPeUinss9N+-- --===============1828128484583474438== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline --===============1828128484583474438==-- From mboxrd@z Thu Jan 1 00:00:00 1970 From: kbuild test robot Subject: Re: [PATCH 4/4] mtd: provide helper to prepare buffers for DMA operations Date: Fri, 1 Apr 2016 11:13:43 +0800 Message-ID: <201604011151.adkPJgri%fengguang.wu@intel.com> References: <1459427384-21374-5-git-send-email-boris.brezillon@free-electrons.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="bg08WKrSYDhXBjb5" Cc: kbuild-all@01.org, David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon , Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@l To: Boris Brezillon Return-path: Content-Disposition: inline In-Reply-To: <1459427384-21374-5-git-send-email-boris.brezillon@free-electrons.com> Sender: owner-linux-mm@kvack.org List-Id: linux-crypto.vger.kernel.org --bg08WKrSYDhXBjb5 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Boris, [auto build test ERROR on spi/for-next] [also build test ERROR on v4.6-rc1 next-20160331] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Boris-Brezillon/scatterlist-sg_table-from-virtual-pointer/20160331-203118 base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi for-next config: m32r-m32104ut_defconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=m32r All error/warnings (new ones prefixed by >>): In file included from include/linux/mtd/super.h:17:0, from fs/romfs/storage.c:13: >> include/linux/mtd/mtd.h:426:10: error: expected ';', ',' or ')' before 'enum' enum dma_data_direction dir) ^ include/linux/mtd/mtd.h: In function 'mtd_unmap_buf': >> include/linux/mtd/mtd.h:434:2: warning: 'return' with a value, in function returning void return -ENOTSUPP; ^ fs/romfs/storage.c: At top level: include/linux/mtd/mtd.h:431:13: warning: 'mtd_unmap_buf' defined but not used [-Wunused-function] static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, ^ -- In file included from include/linux/mtd/super.h:17:0, from fs/romfs/super.c:72: >> include/linux/mtd/mtd.h:426:10: error: expected ';', ',' or ')' before 'enum' enum dma_data_direction dir) ^ include/linux/mtd/mtd.h: In function 'mtd_unmap_buf': >> include/linux/mtd/mtd.h:434:2: warning: 'return' with a value, in function returning void return -ENOTSUPP; ^ fs/romfs/super.c: At top level: include/linux/mtd/mtd.h:431:13: warning: 'mtd_unmap_buf' defined but not used [-Wunused-function] static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, ^ vim +426 include/linux/mtd/mtd.h 420 struct sg_table *sgt, enum dma_data_direction dir); 421 #else 422 static inline int mtd_map_buf(struct mtd_info *mtd, struct device *dev, 423 struct sg_table *sgt, const void *buf, 424 size_t len, 425 const struct sg_constraints *constraints > 426 enum dma_data_direction dir) 427 { 428 return -ENOTSUPP; 429 } 430 431 static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, 432 struct sg_table *sgt, enum dma_data_direction dir) 433 { > 434 return -ENOTSUPP; 435 } 436 #endif 437 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation --bg08WKrSYDhXBjb5 Content-Type: application/octet-stream Content-Disposition: attachment; filename=".config.gz" Content-Transfer-Encoding: base64 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 --bg08WKrSYDhXBjb5-- -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vignesh R Subject: Re: [PATCH 1/4] mm: add is_highmem_addr() helper Date: Mon, 4 Apr 2016 13:44:11 +0530 Message-ID: <57022253.70400@ti.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> Mime-Version: 1.0 Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit Cc: Mark Brown , , , Vinod Koul , Dan Williams , , Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , , Richard Weinberger , Herbert Xu , "David S. Miller" , , , Joerg Roedel , , To: Boris Brezillon , David Woodhouse , Brian Norris , , Andrew Morton , Dave Gordon Return-path: In-Reply-To: <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> Sender: owner-linux-mm@kvack.org List-Id: linux-crypto.vger.kernel.org Hi, On 03/31/2016 05:59 PM, Boris Brezillon wrote: > Add an helper to check if a virtual address is in the highmem region. > > Signed-off-by: Boris Brezillon > --- > include/linux/highmem.h | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/include/linux/highmem.h b/include/linux/highmem.h > index bb3f329..13dff37 100644 > --- a/include/linux/highmem.h > +++ b/include/linux/highmem.h > @@ -41,6 +41,14 @@ void kmap_flush_unused(void); > > struct page *kmap_to_page(void *addr); > > +static inline bool is_highmem_addr(const void *x) > +{ > + unsigned long vaddr = (unsigned long)x; > + > + return vaddr >= PKMAP_BASE && > + vaddr < ((PKMAP_BASE + LAST_PKMAP) * PAGE_SIZE); Shouldn't this be: vaddr < (PKMAP_BASE + (LAST_PKMAP * PAGE_SIZE)) ? -- Regards Vignesh -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Brezillon Subject: Re: [PATCH 1/4] mm: add is_highmem_addr() helper Date: Mon, 4 Apr 2016 17:05:58 +0200 Message-ID: <20160404170558.0e3278b5@bbrezillon> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> <57022253.70400@ti.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Cc: David Woodhouse , Brian Norris , , Andrew Morton , Dave Gordon , Mark Brown , , , Vinod Koul , Dan Williams , , Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , , Richard Weinberger , Herbert Xu , "David S. Miller" , , , Joerg Roedel , , To: Vignesh R Return-path: In-Reply-To: <57022253.70400-l0cyMroinI0@public.gmane.org> Sender: linux-spi-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: linux-crypto.vger.kernel.org On Mon, 4 Apr 2016 13:44:11 +0530 Vignesh R wrote: > Hi, > > On 03/31/2016 05:59 PM, Boris Brezillon wrote: > > Add an helper to check if a virtual address is in the highmem region. > > > > Signed-off-by: Boris Brezillon > > --- > > include/linux/highmem.h | 13 +++++++++++++ > > 1 file changed, 13 insertions(+) > > > > diff --git a/include/linux/highmem.h b/include/linux/highmem.h > > index bb3f329..13dff37 100644 > > --- a/include/linux/highmem.h > > +++ b/include/linux/highmem.h > > @@ -41,6 +41,14 @@ void kmap_flush_unused(void); > > > > struct page *kmap_to_page(void *addr); > > > > +static inline bool is_highmem_addr(const void *x) > > +{ > > + unsigned long vaddr = (unsigned long)x; > > + > > + return vaddr >= PKMAP_BASE && > > + vaddr < ((PKMAP_BASE + LAST_PKMAP) * PAGE_SIZE); > > > Shouldn't this be: > vaddr < (PKMAP_BASE + (LAST_PKMAP * PAGE_SIZE)) ? Oops, yes indeed. Anyway, given Russell's feedback I don't think I'm gonna follow up on this series. Sorry. Boris -- Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756786AbcCaMaA (ORCPT ); Thu, 31 Mar 2016 08:30:00 -0400 Received: from down.free-electrons.com ([37.187.137.238]:41988 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753691AbcCaM3v (ORCPT ); Thu, 31 Mar 2016 08:29:51 -0400 From: Boris Brezillon To: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon Cc: Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/4] spi: use sg_alloc_table_from_buf() Date: Thu, 31 Mar 2016 14:29:43 +0200 Message-Id: <1459427384-21374-4-git-send-email-boris.brezillon@free-electrons.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Replace custom implementation of sg_alloc_table_from_buf() by a call to sg_alloc_table_from_buf(). Signed-off-by: Boris Brezillon --- drivers/spi/spi.c | 45 +++++---------------------------------------- 1 file changed, 5 insertions(+), 40 deletions(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index de2f2f9..eed461d 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -705,49 +705,14 @@ static int spi_map_buf(struct spi_master *master, struct device *dev, struct sg_table *sgt, void *buf, size_t len, enum dma_data_direction dir) { - const bool vmalloced_buf = is_vmalloc_addr(buf); - unsigned int max_seg_size = dma_get_max_seg_size(dev); - int desc_len; - int sgs; - struct page *vm_page; - void *sg_buf; - size_t min; - int i, ret; - - if (vmalloced_buf) { - desc_len = min_t(int, max_seg_size, PAGE_SIZE); - sgs = DIV_ROUND_UP(len + offset_in_page(buf), desc_len); - } else { - desc_len = min_t(int, max_seg_size, master->max_dma_len); - sgs = DIV_ROUND_UP(len, desc_len); - } + struct sg_constraints constraints = { }; + int ret; - ret = sg_alloc_table(sgt, sgs, GFP_KERNEL); - if (ret != 0) + constraints.max_segment_size = dma_get_max_seg_size(dev); + ret = sg_alloc_table_from_buf(sgt, buf, len, &constraints, GFP_KERNEL); + if (ret) return ret; - for (i = 0; i < sgs; i++) { - - if (vmalloced_buf) { - min = min_t(size_t, - len, desc_len - offset_in_page(buf)); - vm_page = vmalloc_to_page(buf); - if (!vm_page) { - sg_free_table(sgt); - return -ENOMEM; - } - sg_set_page(&sgt->sgl[i], vm_page, - min, offset_in_page(buf)); - } else { - min = min_t(size_t, len, desc_len); - sg_buf = buf; - sg_set_buf(&sgt->sgl[i], sg_buf, min); - } - - buf += min; - len -= min; - } - ret = dma_map_sg(dev, sgt->sgl, sgt->nents, dir); if (!ret) ret = -ENOMEM; -- 2.5.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756756AbcCaM37 (ORCPT ); Thu, 31 Mar 2016 08:29:59 -0400 Received: from down.free-electrons.com ([37.187.137.238]:41971 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753669AbcCaM3u (ORCPT ); Thu, 31 Mar 2016 08:29:50 -0400 From: Boris Brezillon To: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon Cc: Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper Date: Thu, 31 Mar 2016 14:29:42 +0200 Message-Id: <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org sg_alloc_table_from_buf() provides an easy solution to create an sg_table from a virtual address pointer. This function takes care of dealing with vmallocated buffers, buffer alignment, or DMA engine limitations (maximum DMA transfer size). Signed-off-by: Boris Brezillon --- include/linux/scatterlist.h | 24 ++++++ lib/scatterlist.c | 183 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 207 insertions(+) diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 556ec1e..18d1091 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h @@ -41,6 +41,27 @@ struct sg_table { unsigned int orig_nents; /* original size of list */ }; +/** + * struct sg_constraints - SG constraints structure + * + * @max_segment_size: maximum segment length. Each SG entry has to be smaller + * than this value. Zero means no constraint. + * @required_alignment: minimum alignment. Is used for both size and pointer + * alignment. If this constraint is not met, the function + * should return -EINVAL. + * @preferred_alignment: preferred alignment. Mainly used to optimize + * throughput when the DMA engine performs better when + * doing aligned accesses. + * + * This structure is here to help sg_alloc_table_from_buf() create the optimal + * SG list based on DMA engine constraints. + */ +struct sg_constraints { + size_t max_segment_size; + size_t required_alignment; + size_t preferred_alignment; +}; + /* * Notes on SG table design. * @@ -265,6 +286,9 @@ int sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pages, unsigned int n_pages, unsigned long offset, unsigned long size, gfp_t gfp_mask); +int sg_alloc_table_from_buf(struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + gfp_t gfp_mask); size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, void *buf, size_t buflen, off_t skip, bool to_buffer); diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 004fc70..9c9746e 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -433,6 +433,189 @@ int sg_alloc_table_from_pages(struct sg_table *sgt, } EXPORT_SYMBOL(sg_alloc_table_from_pages); +static size_t sg_buf_chunk_len(const void *buf, size_t len, + const struct sg_constraints *cons) +{ + size_t chunk_len = len; + + if (cons->max_segment_size) + chunk_len = min_t(size_t, chunk_len, cons->max_segment_size); + + if (is_vmalloc_addr(buf)) { + unsigned long offset_in_page = offset_in_page(buf); + size_t contig_len = PAGE_SIZE - offset_in_page; + unsigned long phys = vmalloc_to_pfn(buf) - offset_in_page; + const void *contig_ptr = buf + contig_len; + + /* + * Vmalloced buffer might be composed of several physically + * contiguous pages. Avoid extra scattergather entries in + * this case. + */ + while (contig_len < chunk_len) { + if (phys + PAGE_SIZE != vmalloc_to_pfn(contig_ptr)) + break; + + contig_len += PAGE_SIZE; + contig_ptr += PAGE_SIZE; + phys += PAGE_SIZE; + } + + chunk_len = min_t(size_t, chunk_len, contig_len); + } + + if (!IS_ALIGNED((unsigned long)buf, cons->preferred_alignment)) { + const void *aligned_buf = PTR_ALIGN(buf, + cons->preferred_alignment); + size_t unaligned_len = (unsigned long)(aligned_buf - buf); + + chunk_len = min_t(size_t, chunk_len, unaligned_len); + } else if (chunk_len > cons->preferred_alignment) { + chunk_len &= ~(cons->preferred_alignment - 1); + } + + return chunk_len; +} + +#define sg_for_each_chunk_in_buf(buf, len, chunk_len, constraints) \ + for (chunk_len = sg_buf_chunk_len(buf, len, constraints); \ + len; \ + len -= chunk_len, buf += chunk_len, \ + chunk_len = sg_buf_chunk_len(buf, len, constraints)) + +static int sg_check_constraints(struct sg_constraints *cons, + const void *buf, size_t len) +{ + /* + * We only accept buffers coming from the lowmem, vmalloc and + * highmem regions. + */ + if (!virt_addr_valid(buf) && !is_vmalloc_addr(buf) && + !is_highmem_addr(buf)) + return -EINVAL; + + if (!cons->required_alignment) + cons->required_alignment = 1; + + if (!cons->preferred_alignment) + cons->preferred_alignment = cons->required_alignment; + + /* Test if buf and len are properly aligned. */ + if (!IS_ALIGNED((unsigned long)buf, cons->required_alignment) || + !IS_ALIGNED(len, cons->required_alignment)) + return -EINVAL; + + /* + * if the buffer has been vmallocated or kmapped and required_alignment + * is more than PAGE_SIZE we cannot guarantee it. + */ + if (!virt_addr_valid(buf) && cons->required_alignment > PAGE_SIZE) + return -EINVAL; + + /* + * max_segment_size has to be aligned to required_alignment to + * guarantee that all buffer chunks are aligned correctly. + */ + if (!IS_ALIGNED(cons->max_segment_size, cons->required_alignment)) + return -EINVAL; + + /* + * preferred_alignment has to be aligned to required_alignment + * to avoid misalignment of buffer chunks. + */ + if (!IS_ALIGNED(cons->preferred_alignment, cons->required_alignment)) + return -EINVAL; + + return 0; +} + +/** + * sg_alloc_table_from_buf - create an SG table from a buffer + * + * @sgt: SG table + * @buf: buffer you want to create this SG table from + * @len: length of buf + * @constraints: optional constraints to take into account when creating + * the SG table. Can be NULL if no specific constraints are + * required. + * @gfp_mask: type of allocation to use when creating the table + * + * This function creates an SG table from a buffer, its length and some + * SG constraints. + * + * Note: This function supports buffers coming from the lowmem, vmalloc or + * highmem region. + */ +int sg_alloc_table_from_buf(struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + gfp_t gfp_mask) +{ + struct sg_constraints cons = { }; + size_t remaining, chunk_len; + const void *sg_buf; + int i, ret; + + if (constraints) + cons = *constraints; + + ret = sg_check_constraints(&cons, buf, len); + if (ret) + return ret; + + sg_buf = buf; + remaining = len; + i = 0; + sg_for_each_chunk_in_buf(sg_buf, remaining, chunk_len, &cons) + i++; + + ret = sg_alloc_table(sgt, i, gfp_mask); + if (ret) + return ret; + + sg_buf = buf; + remaining = len; + i = 0; + sg_for_each_chunk_in_buf(sg_buf, remaining, chunk_len, &cons) { + if (virt_addr_valid(buf)) { + /* + * Buffer is in lowmem, we can safely call + * sg_set_buf(). + */ + sg_set_buf(&sgt->sgl[i], sg_buf, chunk_len); + } else { + struct page *vm_page; + + /* + * Buffer has been obtained with vmalloc() or kmap(). + * In this case we have to extract the page information + * and use sg_set_page(). + */ + if (is_vmalloc_addr(sg_buf)) + vm_page = vmalloc_to_page(sg_buf); + else + vm_page = kmap_to_page((void *)sg_buf); + + if (!vm_page) { + ret = -ENOMEM; + goto err_free_table; + } + + sg_set_page(&sgt->sgl[i], vm_page, chunk_len, + offset_in_page(sg_buf)); + } + + i++; + } + + return 0; + +err_free_table: + sg_free_table(sgt); + + return ret; +} +EXPORT_SYMBOL(sg_alloc_table_from_buf); + void __sg_page_iter_start(struct sg_page_iter *piter, struct scatterlist *sglist, unsigned int nents, unsigned long pgoffset) -- 2.5.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756710AbcCaM35 (ORCPT ); Thu, 31 Mar 2016 08:29:57 -0400 Received: from down.free-electrons.com ([37.187.137.238]:41946 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752504AbcCaM3u (ORCPT ); Thu, 31 Mar 2016 08:29:50 -0400 From: Boris Brezillon To: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon Cc: Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/4] mm: add is_highmem_addr() helper Date: Thu, 31 Mar 2016 14:29:41 +0200 Message-Id: <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add an helper to check if a virtual address is in the highmem region. Signed-off-by: Boris Brezillon --- include/linux/highmem.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/linux/highmem.h b/include/linux/highmem.h index bb3f329..13dff37 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -41,6 +41,14 @@ void kmap_flush_unused(void); struct page *kmap_to_page(void *addr); +static inline bool is_highmem_addr(const void *x) +{ + unsigned long vaddr = (unsigned long)x; + + return vaddr >= PKMAP_BASE && + vaddr < ((PKMAP_BASE + LAST_PKMAP) * PAGE_SIZE); +} + #else /* CONFIG_HIGHMEM */ static inline unsigned int nr_free_highpages(void) { return 0; } @@ -50,6 +58,11 @@ static inline struct page *kmap_to_page(void *addr) return virt_to_page(addr); } +static inline bool is_highmem_addr(const void *x) +{ + return false; +} + #define totalhigh_pages 0UL #ifndef ARCH_HAS_KMAP -- 2.5.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756611AbcCaM3y (ORCPT ); Thu, 31 Mar 2016 08:29:54 -0400 Received: from down.free-electrons.com ([37.187.137.238]:41934 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751038AbcCaM3u (ORCPT ); Thu, 31 Mar 2016 08:29:50 -0400 From: Boris Brezillon To: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon Cc: Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 0/4] scatterlist: sg_table from virtual pointer Date: Thu, 31 Mar 2016 14:29:40 +0200 Message-Id: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> X-Mailer: git-send-email 2.5.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello, This series has been extracted from another series [1] adding support for DMA operations in a NAND driver. The reason I decided to post those patches separately is because they are touching core stuff, and I'd like to have feedback on these specific aspects. The idea is to provide a generic function creating an sg_table from a virtual pointer and a length. This operation is complicated by the different memory regions exposed in kernel space. For example, you have the lowmem region, which guarantees that buffers are physically contiguous, while the vmalloc region does not. sg_alloc_table_from_buf() detects in which memory region your buffer reside, and takes the appropriate precautions when creating the sg_table. This function also takes an extract parameter, allowing one to specify extra constraints, like the maximum DMA segment size, the required and the preferred alignment. Patch 1 and 2 are implementing sg_alloc_table_from_buf() (patch 1 is needed to properly detect buffers residing in the highmem/kmap area). Patch 3 is making use of sg_alloc_table_from_buf() in the spi_map_buf() function (hopefully, other subsystems/drivers will be able to easily switch to this function too). Patch 4 is implementing what I really need: generic functions to map/unmap a virtual buffer passed through mtd->_read/_write(). I'm not exactly a DMA or MM experts, so that would be great to have feedbacks on this approach. That's why I added so many people in Cc even if they're not directly impacted by those patches. Let me know if you want me to drop/add people from/to the recipient list. Thanks. Best Regards, Boris [1]http://www.spinics.net/lists/arm-kernel/msg493552.html Boris Brezillon (4): mm: add is_highmem_addr() helper scatterlist: add sg_alloc_table_from_buf() helper spi: use sg_alloc_table_from_buf() mtd: provide helper to prepare buffers for DMA operations drivers/mtd/mtdcore.c | 66 ++++++++++++++++ drivers/spi/spi.c | 45 ++--------- include/linux/highmem.h | 13 ++++ include/linux/mtd/mtd.h | 25 ++++++ include/linux/scatterlist.h | 24 ++++++ lib/scatterlist.c | 183 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 316 insertions(+), 40 deletions(-) -- 2.5.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756398AbcCaMbR (ORCPT ); Thu, 31 Mar 2016 08:31:17 -0400 Received: from down.free-electrons.com ([37.187.137.238]:42009 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754429AbcCaM3w (ORCPT ); Thu, 31 Mar 2016 08:29:52 -0400 From: Boris Brezillon To: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon Cc: Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/4] mtd: provide helper to prepare buffers for DMA operations Date: Thu, 31 Mar 2016 14:29:44 +0200 Message-Id: <1459427384-21374-5-git-send-email-boris.brezillon@free-electrons.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some NAND controller drivers are making use of DMA to transfer data from the controller to the buffer passed by the MTD user. Provide a generic mtd_map/unmap_buf() implementation to avoid open coded (and sometime erroneous) implementations. Signed-off-by: Boris Brezillon --- drivers/mtd/mtdcore.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/mtd/mtd.h | 25 +++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 3096251..4c20f33 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c @@ -1253,6 +1253,72 @@ void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size) } EXPORT_SYMBOL_GPL(mtd_kmalloc_up_to); +#ifdef CONFIG_HAS_DMA +/** + * mtd_map_buf - create an SG table and prepare it for DMA operations + * + * @mtd: mtd device description object pointer + * @dev: device handling the DMA operation + * @buf: buf used to create the SG table + * @len: length of buf + * @constraints: optional constraints to take into account when creating + * the SG table. Can be NULL if no specific constraints + * are required. + * @dir: direction of the DMA operation + * + * This function should be used when an MTD driver wants to do DMA operations + * on a buffer passed by the MTD layer. This functions takes care of + * vmallocated buffer constraints, and return and sg_table that you can safely + * use. + */ +int mtd_map_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + enum dma_data_direction dir) +{ + int ret; + + ret = sg_alloc_table_from_buf(sgt, buf, len, constraints, GFP_KERNEL); + if (ret) + return ret; + + ret = dma_map_sg(dev, sgt->sgl, sgt->nents, dir); + if (!ret) + ret = -ENOMEM; + + if (ret < 0) { + sg_free_table(sgt); + return ret; + } + + sgt->nents = ret; + + return 0; +} +EXPORT_SYMBOL_GPL(mtd_map_buf); + +/** + * mtd_unmap_buf - unmap an SG table and release its resources + * + * @mtd: mtd device description object pointer + * @dev: device handling the DMA operation + * @sgt: SG table + * @dir: direction of the DMA operation + * + * This function unmaps a previously mapped SG table and release SG table + * resources. Should be called when your DMA operation is done. + */ +void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, enum dma_data_direction dir) +{ + if (sgt->orig_nents) { + dma_unmap_sg(dev, sgt->sgl, sgt->orig_nents, dir); + sg_free_table(sgt); + } +} +EXPORT_SYMBOL_GPL(mtd_unmap_buf); +#endif /* !CONFIG_HAS_DMA */ + #ifdef CONFIG_PROC_FS /*====================================================================*/ diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 7712721..15cff85 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -410,6 +411,30 @@ extern void register_mtd_user (struct mtd_notifier *new); extern int unregister_mtd_user (struct mtd_notifier *old); void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size); +#ifdef CONFIG_HAS_DMA +int mtd_map_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + enum dma_data_direction dir); +void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, enum dma_data_direction dir); +#else +static inline int mtd_map_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, const void *buf, + size_t len, + const struct sg_constraints *constraints + enum dma_data_direction dir) +{ + return -ENOTSUPP; +} + +static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, enum dma_data_direction dir) +{ + return -ENOTSUPP; +} +#endif + void mtd_erase_callback(struct erase_info *instr); static inline int mtd_is_bitflip(int err) { -- 2.5.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757303AbcCaOqO (ORCPT ); Thu, 31 Mar 2016 10:46:14 -0400 Received: from down.free-electrons.com ([37.187.137.238]:46606 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1757185AbcCaOqL (ORCPT ); Thu, 31 Mar 2016 10:46:11 -0400 Date: Thu, 31 Mar 2016 16:45:57 +0200 From: Boris Brezillon To: Russell King - ARM Linux Cc: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon , linux-crypto@vger.kernel.org, Herbert Xu , Vinod Koul , Richard Weinberger , Joerg Roedel , linux-kernel@vger.kernel.org, linux-spi@vger.kernel.org, Vignesh R , linux-mm@kvack.org, iommu@lists.linux-foundation.org, Mark Brown , Hans Verkuil , Laurent Pinchart , dmaengine@vger.kernel.org, Dan Williams , linux-media@vger.kernel.org, "David S. Miller" , linux-arm-kernel@lists.infradead.org, Mauro Carvalho Chehab Subject: Re: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper Message-ID: <20160331164557.544ed780@bbrezillon> In-Reply-To: <20160331141412.GK19428@n2100.arm.linux.org.uk> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> <20160331141412.GK19428@n2100.arm.linux.org.uk> X-Mailer: Claws Mail 3.12.0 (GTK+ 2.24.28; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Russell, On Thu, 31 Mar 2016 15:14:13 +0100 Russell King - ARM Linux wrote: > On Thu, Mar 31, 2016 at 02:29:42PM +0200, Boris Brezillon wrote: > > sg_alloc_table_from_buf() provides an easy solution to create an sg_table > > from a virtual address pointer. This function takes care of dealing with > > vmallocated buffers, buffer alignment, or DMA engine limitations (maximum > > DMA transfer size). > > Please note that the DMA API does not take account of coherency of memory > regions other than non-high/lowmem - there are specific extensions to > deal with this. Ok, you said 'non-high/lowmem', this means vmalloced and kmapped buffers already fall in this case, right? Could you tell me more about those specific extensions? > > What this means is that having an API that takes any virtual address > pointer, converts it to a scatterlist which is then DMA mapped, is > unsafe. Which means some implementations already get this wrong (see spi_map_buf(), and I'm pretty sure it's not the only one). > > It'll be okay for PIPT and non-aliasing VIPT cache architectures, but > for other cache architectures this will hide this problem and make > review harder. > Ok, you lost me. I'll have to do my homework and try to understand what this means :). Thanks for your valuable inputs. Best Regards, Boris -- Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757684AbcCaPMp (ORCPT ); Thu, 31 Mar 2016 11:12:45 -0400 Received: from pandora.arm.linux.org.uk ([78.32.30.218]:44904 "EHLO pandora.arm.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757412AbcCaPJz (ORCPT ); Thu, 31 Mar 2016 11:09:55 -0400 Date: Thu, 31 Mar 2016 16:09:23 +0100 From: Russell King - ARM Linux To: Boris Brezillon Cc: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon , linux-crypto@vger.kernel.org, Herbert Xu , Vinod Koul , Richard Weinberger , Joerg Roedel , linux-kernel@vger.kernel.org, linux-spi@vger.kernel.org, Vignesh R , linux-mm@kvack.org, iommu@lists.linux-foundation.org, Mark Brown , Hans Verkuil , Laurent Pinchart , dmaengine@vger.kernel.org, Dan Williams , linux-media@vger.kernel.org, "David S. Miller" , linux-arm-kernel@lists.infradead.org, Mauro Carvalho Chehab Subject: Re: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper Message-ID: <20160331150923.GL19428@n2100.arm.linux.org.uk> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> <20160331141412.GK19428@n2100.arm.linux.org.uk> <20160331164557.544ed780@bbrezillon> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160331164557.544ed780@bbrezillon> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Mar 31, 2016 at 04:45:57PM +0200, Boris Brezillon wrote: > Hi Russell, > > On Thu, 31 Mar 2016 15:14:13 +0100 > Russell King - ARM Linux wrote: > > > On Thu, Mar 31, 2016 at 02:29:42PM +0200, Boris Brezillon wrote: > > > sg_alloc_table_from_buf() provides an easy solution to create an sg_table > > > from a virtual address pointer. This function takes care of dealing with > > > vmallocated buffers, buffer alignment, or DMA engine limitations (maximum > > > DMA transfer size). > > > > Please note that the DMA API does not take account of coherency of memory > > regions other than non-high/lowmem - there are specific extensions to > > deal with this. > > Ok, you said 'non-high/lowmem', this means vmalloced and kmapped buffers > already fall in this case, right? > > Could you tell me more about those specific extensions? I was slightly confused - the extensions I was thinking of are those listed at the bottom of Documentation/cachetlb.txt, which have nothing to do with DMA. However, it's probably worth reading Documentation/DMA-API-HOWTO.txt to read up on what kinds of memory are considered to be DMA-able in the kernel. > > What this means is that having an API that takes any virtual address > > pointer, converts it to a scatterlist which is then DMA mapped, is > > unsafe. > > Which means some implementations already get this wrong (see > spi_map_buf(), and I'm pretty sure it's not the only one). Quite possible, but that is driver stuff, and driver stuff gets things wrong all the time. :) > > It'll be okay for PIPT and non-aliasing VIPT cache architectures, but > > for other cache architectures this will hide this problem and make > > review harder. > > > > Ok, you lost me. I'll have to do my homework and try to understand what > this means :). P = physical address V = virtual address I = indexed T = tag The tag is held in each cache line. When a location is looked up in the cache, an index is used to locate a set of cache lines and the tag is compared to check which cache line in the set is the correct one (or whether the address even exists in the cache.) How the index and tag are derived varies between cache architectures. PIPT = indexed by physical address, tagged with physical address. Never aliases with itself in the presence of multiple virtual mappings. VIPT = indexed by virtual address, tagged with physical address. If the bits from the virtual address do not overlap the MMU page size, it is also alias free, otherwise aliases can exist, but can be eliminated by "cache colouring" - ensuring that a physical address is always mapped with the same overlapping bits. VIVT = indexed by virtual address, tagged with virtual address. The worst kind of cache, since every different mapping of the same physical address is guaranteed by design to alias with other mappings. There is little cache colouring between different kernel mappings (eg, between lowmem and vmalloc space.) What this means is that, while the DMA API takes care of DMA aliases in the lowmem mappings, an alias-prone VIPT cache will remain incoherent with DMA if it is remapped into vmalloc space, and the mapping happens to have a different cache colour. In other words, this is a data corruption issue. Hence, taking a range of vmalloc() addresses, converting them into a scatterlist, then using the DMA API on the scatterlist _only_ guarantees that the lowmem (and kmap'd highmem mappings) are coherent with DMA. There is no way for the DMA API to know that other mappings exist, and obviously flushing every possible cache line just because a mapping might exist multiplies the expense of the DMA API: not only in terms of time spent running through all the possibilities, which doubles for every aliasing bit of VIPT, but also TLB pressure since you'd have to create a mapping for each alias and tear it back down. VIVT is even worse, since there is no other virtual mapping which is coherent, would need to be known, and each mapping would need to be individually flushed. -- RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/ FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up according to speedtest.net. From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757484AbcCaRYp (ORCPT ); Thu, 31 Mar 2016 13:24:45 -0400 Received: from mezzanine.sirena.org.uk ([106.187.55.193]:60902 "EHLO mezzanine.sirena.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751938AbcCaRYn (ORCPT ); Thu, 31 Mar 2016 13:24:43 -0400 Date: Thu, 31 Mar 2016 10:23:53 -0700 From: Mark Brown To: Boris Brezillon Cc: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org Message-ID: <20160331172353.GJ2350@sirena.org.uk> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-4-git-send-email-boris.brezillon@free-electrons.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="HHj6mHPeUinss9N+" Content-Disposition: inline In-Reply-To: <1459427384-21374-4-git-send-email-boris.brezillon@free-electrons.com> X-Cookie: If anything can go wrong, it will. User-Agent: Mutt/1.5.24 (2015-08-30) X-SA-Exim-Connect-IP: 64.55.107.4 X-SA-Exim-Mail-From: broonie@sirena.org.uk Subject: Re: [PATCH 3/4] spi: use sg_alloc_table_from_buf() X-SA-Exim-Version: 4.2.1 (built Mon, 26 Dec 2011 16:24:06 +0000) X-SA-Exim-Scanned: Yes (on mezzanine.sirena.org.uk) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --HHj6mHPeUinss9N+ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, Mar 31, 2016 at 02:29:43PM +0200, Boris Brezillon wrote: > Replace custom implementation of sg_alloc_table_from_buf() by a call to > sg_alloc_table_from_buf(). Acked-by: Mark Brown --HHj6mHPeUinss9N+ Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAEBCAAGBQJW/V0aAAoJECTWi3JdVIfQuGEH+wdaKEhHxJuIIwseLFy64w88 sFhI2BJSaVk6ppdvYIdf67ku24WUoLyYEApHSGXfhntu00xAlzBh8YZjvg6F41Yg 7Ql/wnd5YumDVMT72a9Cv1OlJ+dsUdBJuQl7/A952W53l4IR2AcBDrJ/zBWQDtOc bbohxZsXJP+Qou2Q9x8OebYsFr3p2Hw3XjteAVB6jwA9gINwDDLj05HgRCKbotHe 5bMQ3pj2I1ruS4wN44SWj7YOMvLzR3nE4xVOdHV+iaFhcVTkaYn7fuWi1fdSRChk tCB1auoxNjAIsfnsvj6nnzAOcW/kPwKzOKIgz58DZPFkgiRKDM9wuDnN2AlMPBI= =uMgt -----END PGP SIGNATURE----- --HHj6mHPeUinss9N+-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932204AbcDADP3 (ORCPT ); Thu, 31 Mar 2016 23:15:29 -0400 Received: from mga09.intel.com ([134.134.136.24]:14247 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753140AbcDADP0 (ORCPT ); Thu, 31 Mar 2016 23:15:26 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,425,1455004800"; d="gz'50?scan'50,208,50";a="775895250" Date: Fri, 1 Apr 2016 11:13:43 +0800 From: kbuild test robot To: Boris Brezillon Cc: kbuild-all@01.org, David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon , Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 4/4] mtd: provide helper to prepare buffers for DMA operations Message-ID: <201604011151.adkPJgri%fengguang.wu@intel.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="bg08WKrSYDhXBjb5" Content-Disposition: inline In-Reply-To: <1459427384-21374-5-git-send-email-boris.brezillon@free-electrons.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: fengguang.wu@intel.com X-SA-Exim-Scanned: No (on bee); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --bg08WKrSYDhXBjb5 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Boris, [auto build test ERROR on spi/for-next] [also build test ERROR on v4.6-rc1 next-20160331] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Boris-Brezillon/scatterlist-sg_table-from-virtual-pointer/20160331-203118 base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi for-next config: m32r-m32104ut_defconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=m32r All error/warnings (new ones prefixed by >>): In file included from include/linux/mtd/super.h:17:0, from fs/romfs/storage.c:13: >> include/linux/mtd/mtd.h:426:10: error: expected ';', ',' or ')' before 'enum' enum dma_data_direction dir) ^ include/linux/mtd/mtd.h: In function 'mtd_unmap_buf': >> include/linux/mtd/mtd.h:434:2: warning: 'return' with a value, in function returning void return -ENOTSUPP; ^ fs/romfs/storage.c: At top level: include/linux/mtd/mtd.h:431:13: warning: 'mtd_unmap_buf' defined but not used [-Wunused-function] static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, ^ -- In file included from include/linux/mtd/super.h:17:0, from fs/romfs/super.c:72: >> include/linux/mtd/mtd.h:426:10: error: expected ';', ',' or ')' before 'enum' enum dma_data_direction dir) ^ include/linux/mtd/mtd.h: In function 'mtd_unmap_buf': >> include/linux/mtd/mtd.h:434:2: warning: 'return' with a value, in function returning void return -ENOTSUPP; ^ fs/romfs/super.c: At top level: include/linux/mtd/mtd.h:431:13: warning: 'mtd_unmap_buf' defined but not used [-Wunused-function] static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, ^ vim +426 include/linux/mtd/mtd.h 420 struct sg_table *sgt, enum dma_data_direction dir); 421 #else 422 static inline int mtd_map_buf(struct mtd_info *mtd, struct device *dev, 423 struct sg_table *sgt, const void *buf, 424 size_t len, 425 const struct sg_constraints *constraints > 426 enum dma_data_direction dir) 427 { 428 return -ENOTSUPP; 429 } 430 431 static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, 432 struct sg_table *sgt, enum dma_data_direction dir) 433 { > 434 return -ENOTSUPP; 435 } 436 #endif 437 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation --bg08WKrSYDhXBjb5 Content-Type: application/octet-stream Content-Disposition: attachment; filename=".config.gz" Content-Transfer-Encoding: base64 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 --bg08WKrSYDhXBjb5-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932092AbcDDIQF (ORCPT ); Mon, 4 Apr 2016 04:16:05 -0400 Received: from devils.ext.ti.com ([198.47.26.153]:60875 "EHLO devils.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751495AbcDDIQB (ORCPT ); Mon, 4 Apr 2016 04:16:01 -0400 Subject: Re: [PATCH 1/4] mm: add is_highmem_addr() helper To: Boris Brezillon , David Woodhouse , Brian Norris , , Andrew Morton , Dave Gordon References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> CC: Mark Brown , , , Vinod Koul , Dan Williams , , Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , , Richard Weinberger , Herbert Xu , "David S. Miller" , , , Joerg Roedel , , From: Vignesh R Message-ID: <57022253.70400@ti.com> Date: Mon, 4 Apr 2016 13:44:11 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On 03/31/2016 05:59 PM, Boris Brezillon wrote: > Add an helper to check if a virtual address is in the highmem region. > > Signed-off-by: Boris Brezillon > --- > include/linux/highmem.h | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/include/linux/highmem.h b/include/linux/highmem.h > index bb3f329..13dff37 100644 > --- a/include/linux/highmem.h > +++ b/include/linux/highmem.h > @@ -41,6 +41,14 @@ void kmap_flush_unused(void); > > struct page *kmap_to_page(void *addr); > > +static inline bool is_highmem_addr(const void *x) > +{ > + unsigned long vaddr = (unsigned long)x; > + > + return vaddr >= PKMAP_BASE && > + vaddr < ((PKMAP_BASE + LAST_PKMAP) * PAGE_SIZE); Shouldn't this be: vaddr < (PKMAP_BASE + (LAST_PKMAP * PAGE_SIZE)) ? -- Regards Vignesh From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753488AbcDDPGV (ORCPT ); Mon, 4 Apr 2016 11:06:21 -0400 Received: from down.free-electrons.com ([37.187.137.238]:43394 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751746AbcDDPGT (ORCPT ); Mon, 4 Apr 2016 11:06:19 -0400 Date: Mon, 4 Apr 2016 17:05:58 +0200 From: Boris Brezillon To: Vignesh R Cc: David Woodhouse , Brian Norris , , Andrew Morton , Dave Gordon , Mark Brown , , , Vinod Koul , Dan Williams , , Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , , Richard Weinberger , Herbert Xu , "David S. Miller" , , , Joerg Roedel , , Subject: Re: [PATCH 1/4] mm: add is_highmem_addr() helper Message-ID: <20160404170558.0e3278b5@bbrezillon> In-Reply-To: <57022253.70400@ti.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> <57022253.70400@ti.com> X-Mailer: Claws Mail 3.12.0 (GTK+ 2.24.28; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 4 Apr 2016 13:44:11 +0530 Vignesh R wrote: > Hi, > > On 03/31/2016 05:59 PM, Boris Brezillon wrote: > > Add an helper to check if a virtual address is in the highmem region. > > > > Signed-off-by: Boris Brezillon > > --- > > include/linux/highmem.h | 13 +++++++++++++ > > 1 file changed, 13 insertions(+) > > > > diff --git a/include/linux/highmem.h b/include/linux/highmem.h > > index bb3f329..13dff37 100644 > > --- a/include/linux/highmem.h > > +++ b/include/linux/highmem.h > > @@ -41,6 +41,14 @@ void kmap_flush_unused(void); > > > > struct page *kmap_to_page(void *addr); > > > > +static inline bool is_highmem_addr(const void *x) > > +{ > > + unsigned long vaddr = (unsigned long)x; > > + > > + return vaddr >= PKMAP_BASE && > > + vaddr < ((PKMAP_BASE + LAST_PKMAP) * PAGE_SIZE); > > > Shouldn't this be: > vaddr < (PKMAP_BASE + (LAST_PKMAP * PAGE_SIZE)) ? Oops, yes indeed. Anyway, given Russell's feedback I don't think I'm gonna follow up on this series. Sorry. Boris -- Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f47.google.com (mail-wm0-f47.google.com [74.125.82.47]) by kanga.kvack.org (Postfix) with ESMTP id EF2AE6B007E for ; Thu, 31 Mar 2016 10:15:01 -0400 (EDT) Received: by mail-wm0-f47.google.com with SMTP id p65so227248713wmp.1 for ; Thu, 31 Mar 2016 07:15:01 -0700 (PDT) Received: from pandora.arm.linux.org.uk (pandora.arm.linux.org.uk. [2001:4d48:ad52:3201:214:fdff:fe10:1be6]) by mx.google.com with ESMTPS id h133si12652445wmf.124.2016.03.31.07.15.00 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 31 Mar 2016 07:15:00 -0700 (PDT) Date: Thu, 31 Mar 2016 15:14:13 +0100 From: Russell King - ARM Linux Subject: Re: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper Message-ID: <20160331141412.GK19428@n2100.arm.linux.org.uk> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> Sender: owner-linux-mm@kvack.org List-ID: To: Boris Brezillon Cc: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon , linux-crypto@vger.kernel.org, Herbert Xu , Vinod Koul , Richard Weinberger , Joerg Roedel , linux-kernel@vger.kernel.org, linux-spi@vger.kernel.org, Vignesh R , linux-mm@kvack.org, iommu@lists.linux-foundation.org, Mark Brown , Hans Verkuil , Laurent Pinchart , dmaengine@vger.kernel.org, Dan Williams , linux-media@vger.kernel.org, "David S. Miller" , linux-arm-kernel@lists.infradead.org, Mauro Carvalho Chehab On Thu, Mar 31, 2016 at 02:29:42PM +0200, Boris Brezillon wrote: > sg_alloc_table_from_buf() provides an easy solution to create an sg_table > from a virtual address pointer. This function takes care of dealing with > vmallocated buffers, buffer alignment, or DMA engine limitations (maximum > DMA transfer size). Please note that the DMA API does not take account of coherency of memory regions other than non-high/lowmem - there are specific extensions to deal with this. What this means is that having an API that takes any virtual address pointer, converts it to a scatterlist which is then DMA mapped, is unsafe. It'll be okay for PIPT and non-aliasing VIPT cache architectures, but for other cache architectures this will hide this problem and make review harder. -- RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/ FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up according to speedtest.net. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f44.google.com (mail-wm0-f44.google.com [74.125.82.44]) by kanga.kvack.org (Postfix) with ESMTP id 6E2F36B025E for ; Thu, 31 Mar 2016 08:29:52 -0400 (EDT) Received: by mail-wm0-f44.google.com with SMTP id 191so124620964wmq.0 for ; Thu, 31 Mar 2016 05:29:52 -0700 (PDT) Received: from mail.free-electrons.com (down.free-electrons.com. [37.187.137.238]) by mx.google.com with ESMTP id 128si12260948wmg.38.2016.03.31.05.29.49 for ; Thu, 31 Mar 2016 05:29:49 -0700 (PDT) From: Boris Brezillon Subject: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper Date: Thu, 31 Mar 2016 14:29:42 +0200 Message-Id: <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Sender: owner-linux-mm@kvack.org List-ID: To: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon Cc: Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org sg_alloc_table_from_buf() provides an easy solution to create an sg_table from a virtual address pointer. This function takes care of dealing with vmallocated buffers, buffer alignment, or DMA engine limitations (maximum DMA transfer size). Signed-off-by: Boris Brezillon --- include/linux/scatterlist.h | 24 ++++++ lib/scatterlist.c | 183 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 207 insertions(+) diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 556ec1e..18d1091 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h @@ -41,6 +41,27 @@ struct sg_table { unsigned int orig_nents; /* original size of list */ }; +/** + * struct sg_constraints - SG constraints structure + * + * @max_segment_size: maximum segment length. Each SG entry has to be smaller + * than this value. Zero means no constraint. + * @required_alignment: minimum alignment. Is used for both size and pointer + * alignment. If this constraint is not met, the function + * should return -EINVAL. + * @preferred_alignment: preferred alignment. Mainly used to optimize + * throughput when the DMA engine performs better when + * doing aligned accesses. + * + * This structure is here to help sg_alloc_table_from_buf() create the optimal + * SG list based on DMA engine constraints. + */ +struct sg_constraints { + size_t max_segment_size; + size_t required_alignment; + size_t preferred_alignment; +}; + /* * Notes on SG table design. * @@ -265,6 +286,9 @@ int sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pages, unsigned int n_pages, unsigned long offset, unsigned long size, gfp_t gfp_mask); +int sg_alloc_table_from_buf(struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + gfp_t gfp_mask); size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, void *buf, size_t buflen, off_t skip, bool to_buffer); diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 004fc70..9c9746e 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -433,6 +433,189 @@ int sg_alloc_table_from_pages(struct sg_table *sgt, } EXPORT_SYMBOL(sg_alloc_table_from_pages); +static size_t sg_buf_chunk_len(const void *buf, size_t len, + const struct sg_constraints *cons) +{ + size_t chunk_len = len; + + if (cons->max_segment_size) + chunk_len = min_t(size_t, chunk_len, cons->max_segment_size); + + if (is_vmalloc_addr(buf)) { + unsigned long offset_in_page = offset_in_page(buf); + size_t contig_len = PAGE_SIZE - offset_in_page; + unsigned long phys = vmalloc_to_pfn(buf) - offset_in_page; + const void *contig_ptr = buf + contig_len; + + /* + * Vmalloced buffer might be composed of several physically + * contiguous pages. Avoid extra scattergather entries in + * this case. + */ + while (contig_len < chunk_len) { + if (phys + PAGE_SIZE != vmalloc_to_pfn(contig_ptr)) + break; + + contig_len += PAGE_SIZE; + contig_ptr += PAGE_SIZE; + phys += PAGE_SIZE; + } + + chunk_len = min_t(size_t, chunk_len, contig_len); + } + + if (!IS_ALIGNED((unsigned long)buf, cons->preferred_alignment)) { + const void *aligned_buf = PTR_ALIGN(buf, + cons->preferred_alignment); + size_t unaligned_len = (unsigned long)(aligned_buf - buf); + + chunk_len = min_t(size_t, chunk_len, unaligned_len); + } else if (chunk_len > cons->preferred_alignment) { + chunk_len &= ~(cons->preferred_alignment - 1); + } + + return chunk_len; +} + +#define sg_for_each_chunk_in_buf(buf, len, chunk_len, constraints) \ + for (chunk_len = sg_buf_chunk_len(buf, len, constraints); \ + len; \ + len -= chunk_len, buf += chunk_len, \ + chunk_len = sg_buf_chunk_len(buf, len, constraints)) + +static int sg_check_constraints(struct sg_constraints *cons, + const void *buf, size_t len) +{ + /* + * We only accept buffers coming from the lowmem, vmalloc and + * highmem regions. + */ + if (!virt_addr_valid(buf) && !is_vmalloc_addr(buf) && + !is_highmem_addr(buf)) + return -EINVAL; + + if (!cons->required_alignment) + cons->required_alignment = 1; + + if (!cons->preferred_alignment) + cons->preferred_alignment = cons->required_alignment; + + /* Test if buf and len are properly aligned. */ + if (!IS_ALIGNED((unsigned long)buf, cons->required_alignment) || + !IS_ALIGNED(len, cons->required_alignment)) + return -EINVAL; + + /* + * if the buffer has been vmallocated or kmapped and required_alignment + * is more than PAGE_SIZE we cannot guarantee it. + */ + if (!virt_addr_valid(buf) && cons->required_alignment > PAGE_SIZE) + return -EINVAL; + + /* + * max_segment_size has to be aligned to required_alignment to + * guarantee that all buffer chunks are aligned correctly. + */ + if (!IS_ALIGNED(cons->max_segment_size, cons->required_alignment)) + return -EINVAL; + + /* + * preferred_alignment has to be aligned to required_alignment + * to avoid misalignment of buffer chunks. + */ + if (!IS_ALIGNED(cons->preferred_alignment, cons->required_alignment)) + return -EINVAL; + + return 0; +} + +/** + * sg_alloc_table_from_buf - create an SG table from a buffer + * + * @sgt: SG table + * @buf: buffer you want to create this SG table from + * @len: length of buf + * @constraints: optional constraints to take into account when creating + * the SG table. Can be NULL if no specific constraints are + * required. + * @gfp_mask: type of allocation to use when creating the table + * + * This function creates an SG table from a buffer, its length and some + * SG constraints. + * + * Note: This function supports buffers coming from the lowmem, vmalloc or + * highmem region. + */ +int sg_alloc_table_from_buf(struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + gfp_t gfp_mask) +{ + struct sg_constraints cons = { }; + size_t remaining, chunk_len; + const void *sg_buf; + int i, ret; + + if (constraints) + cons = *constraints; + + ret = sg_check_constraints(&cons, buf, len); + if (ret) + return ret; + + sg_buf = buf; + remaining = len; + i = 0; + sg_for_each_chunk_in_buf(sg_buf, remaining, chunk_len, &cons) + i++; + + ret = sg_alloc_table(sgt, i, gfp_mask); + if (ret) + return ret; + + sg_buf = buf; + remaining = len; + i = 0; + sg_for_each_chunk_in_buf(sg_buf, remaining, chunk_len, &cons) { + if (virt_addr_valid(buf)) { + /* + * Buffer is in lowmem, we can safely call + * sg_set_buf(). + */ + sg_set_buf(&sgt->sgl[i], sg_buf, chunk_len); + } else { + struct page *vm_page; + + /* + * Buffer has been obtained with vmalloc() or kmap(). + * In this case we have to extract the page information + * and use sg_set_page(). + */ + if (is_vmalloc_addr(sg_buf)) + vm_page = vmalloc_to_page(sg_buf); + else + vm_page = kmap_to_page((void *)sg_buf); + + if (!vm_page) { + ret = -ENOMEM; + goto err_free_table; + } + + sg_set_page(&sgt->sgl[i], vm_page, chunk_len, + offset_in_page(sg_buf)); + } + + i++; + } + + return 0; + +err_free_table: + sg_free_table(sgt); + + return ret; +} +EXPORT_SYMBOL(sg_alloc_table_from_buf); + void __sg_page_iter_start(struct sg_page_iter *piter, struct scatterlist *sglist, unsigned int nents, unsigned long pgoffset) -- 2.5.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f48.google.com (mail-wm0-f48.google.com [74.125.82.48]) by kanga.kvack.org (Postfix) with ESMTP id 7DE1A6B007E for ; Thu, 31 Mar 2016 10:46:15 -0400 (EDT) Received: by mail-wm0-f48.google.com with SMTP id p65so228558596wmp.1 for ; Thu, 31 Mar 2016 07:46:15 -0700 (PDT) Received: from mail.free-electrons.com (down.free-electrons.com. [37.187.137.238]) by mx.google.com with ESMTP id u185si2537736wmu.83.2016.03.31.07.46.09 for ; Thu, 31 Mar 2016 07:46:09 -0700 (PDT) Date: Thu, 31 Mar 2016 16:45:57 +0200 From: Boris Brezillon Subject: Re: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper Message-ID: <20160331164557.544ed780@bbrezillon> In-Reply-To: <20160331141412.GK19428@n2100.arm.linux.org.uk> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> <20160331141412.GK19428@n2100.arm.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: owner-linux-mm@kvack.org List-ID: To: Russell King - ARM Linux Cc: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon , linux-crypto@vger.kernel.org, Herbert Xu , Vinod Koul , Richard Weinberger , Joerg Roedel , linux-kernel@vger.kernel.org, linux-spi@vger.kernel.org, Vignesh R , linux-mm@kvack.org, iommu@lists.linux-foundation.org, Mark Brown , Hans Verkuil , Laurent Pinchart , dmaengine@vger.kernel.org, Dan Williams , linux-media@vger.kernel.org, "David S. Miller" , linux-arm-kernel@lists.infradead.org, Mauro Carvalho Chehab Hi Russell, On Thu, 31 Mar 2016 15:14:13 +0100 Russell King - ARM Linux wrote: > On Thu, Mar 31, 2016 at 02:29:42PM +0200, Boris Brezillon wrote: > > sg_alloc_table_from_buf() provides an easy solution to create an sg_table > > from a virtual address pointer. This function takes care of dealing with > > vmallocated buffers, buffer alignment, or DMA engine limitations (maximum > > DMA transfer size). > > Please note that the DMA API does not take account of coherency of memory > regions other than non-high/lowmem - there are specific extensions to > deal with this. Ok, you said 'non-high/lowmem', this means vmalloced and kmapped buffers already fall in this case, right? Could you tell me more about those specific extensions? > > What this means is that having an API that takes any virtual address > pointer, converts it to a scatterlist which is then DMA mapped, is > unsafe. Which means some implementations already get this wrong (see spi_map_buf(), and I'm pretty sure it's not the only one). > > It'll be okay for PIPT and non-aliasing VIPT cache architectures, but > for other cache architectures this will hide this problem and make > review harder. > Ok, you lost me. I'll have to do my homework and try to understand what this means :). Thanks for your valuable inputs. Best Regards, Boris -- Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf0-f169.google.com (mail-pf0-f169.google.com [209.85.192.169]) by kanga.kvack.org (Postfix) with ESMTP id A82206B007E for ; Thu, 31 Mar 2016 23:15:25 -0400 (EDT) Received: by mail-pf0-f169.google.com with SMTP id e128so62686117pfe.3 for ; Thu, 31 Mar 2016 20:15:25 -0700 (PDT) Received: from mga01.intel.com (mga01.intel.com. [192.55.52.88]) by mx.google.com with ESMTP id yk5si520053pab.160.2016.03.31.20.15.24 for ; Thu, 31 Mar 2016 20:15:24 -0700 (PDT) Date: Fri, 1 Apr 2016 11:13:43 +0800 From: kbuild test robot Subject: Re: [PATCH 4/4] mtd: provide helper to prepare buffers for DMA operations Message-ID: <201604011151.adkPJgri%fengguang.wu@intel.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="bg08WKrSYDhXBjb5" Content-Disposition: inline In-Reply-To: <1459427384-21374-5-git-send-email-boris.brezillon@free-electrons.com> Sender: owner-linux-mm@kvack.org List-ID: To: Boris Brezillon Cc: kbuild-all@01.org, David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon , Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org --bg08WKrSYDhXBjb5 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Boris, [auto build test ERROR on spi/for-next] [also build test ERROR on v4.6-rc1 next-20160331] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Boris-Brezillon/scatterlist-sg_table-from-virtual-pointer/20160331-203118 base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi for-next config: m32r-m32104ut_defconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=m32r All error/warnings (new ones prefixed by >>): In file included from include/linux/mtd/super.h:17:0, from fs/romfs/storage.c:13: >> include/linux/mtd/mtd.h:426:10: error: expected ';', ',' or ')' before 'enum' enum dma_data_direction dir) ^ include/linux/mtd/mtd.h: In function 'mtd_unmap_buf': >> include/linux/mtd/mtd.h:434:2: warning: 'return' with a value, in function returning void return -ENOTSUPP; ^ fs/romfs/storage.c: At top level: include/linux/mtd/mtd.h:431:13: warning: 'mtd_unmap_buf' defined but not used [-Wunused-function] static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, ^ -- In file included from include/linux/mtd/super.h:17:0, from fs/romfs/super.c:72: >> include/linux/mtd/mtd.h:426:10: error: expected ';', ',' or ')' before 'enum' enum dma_data_direction dir) ^ include/linux/mtd/mtd.h: In function 'mtd_unmap_buf': >> include/linux/mtd/mtd.h:434:2: warning: 'return' with a value, in function returning void return -ENOTSUPP; ^ fs/romfs/super.c: At top level: include/linux/mtd/mtd.h:431:13: warning: 'mtd_unmap_buf' defined but not used [-Wunused-function] static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, ^ vim +426 include/linux/mtd/mtd.h 420 struct sg_table *sgt, enum dma_data_direction dir); 421 #else 422 static inline int mtd_map_buf(struct mtd_info *mtd, struct device *dev, 423 struct sg_table *sgt, const void *buf, 424 size_t len, 425 const struct sg_constraints *constraints > 426 enum dma_data_direction dir) 427 { 428 return -ENOTSUPP; 429 } 430 431 static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, 432 struct sg_table *sgt, enum dma_data_direction dir) 433 { > 434 return -ENOTSUPP; 435 } 436 #endif 437 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation --bg08WKrSYDhXBjb5 Content-Type: application/octet-stream Content-Disposition: attachment; filename=".config.gz" Content-Transfer-Encoding: base64 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 --bg08WKrSYDhXBjb5-- -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-yw0-f180.google.com (mail-yw0-f180.google.com [209.85.161.180]) by kanga.kvack.org (Postfix) with ESMTP id 9E56E6B0005 for ; Mon, 4 Apr 2016 04:15:29 -0400 (EDT) Received: by mail-yw0-f180.google.com with SMTP id g3so243389257ywa.3 for ; Mon, 04 Apr 2016 01:15:29 -0700 (PDT) Received: from devils.ext.ti.com (devils.ext.ti.com. [198.47.26.153]) by mx.google.com with ESMTPS id j128si7013430ywd.173.2016.04.04.01.15.28 for (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 04 Apr 2016 01:15:28 -0700 (PDT) Subject: Re: [PATCH 1/4] mm: add is_highmem_addr() helper References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> From: Vignesh R Message-ID: <57022253.70400@ti.com> Date: Mon, 4 Apr 2016 13:44:11 +0530 MIME-Version: 1.0 In-Reply-To: <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit Sender: owner-linux-mm@kvack.org List-ID: To: Boris Brezillon , David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon Cc: Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org Hi, On 03/31/2016 05:59 PM, Boris Brezillon wrote: > Add an helper to check if a virtual address is in the highmem region. > > Signed-off-by: Boris Brezillon > --- > include/linux/highmem.h | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/include/linux/highmem.h b/include/linux/highmem.h > index bb3f329..13dff37 100644 > --- a/include/linux/highmem.h > +++ b/include/linux/highmem.h > @@ -41,6 +41,14 @@ void kmap_flush_unused(void); > > struct page *kmap_to_page(void *addr); > > +static inline bool is_highmem_addr(const void *x) > +{ > + unsigned long vaddr = (unsigned long)x; > + > + return vaddr >= PKMAP_BASE && > + vaddr < ((PKMAP_BASE + LAST_PKMAP) * PAGE_SIZE); Shouldn't this be: vaddr < (PKMAP_BASE + (LAST_PKMAP * PAGE_SIZE)) ? -- Regards Vignesh -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lb0-f182.google.com (mail-lb0-f182.google.com [209.85.217.182]) by kanga.kvack.org (Postfix) with ESMTP id A97D46B0284 for ; Mon, 4 Apr 2016 11:06:18 -0400 (EDT) Received: by mail-lb0-f182.google.com with SMTP id bc4so164186896lbc.2 for ; Mon, 04 Apr 2016 08:06:18 -0700 (PDT) Received: from mail.free-electrons.com (down.free-electrons.com. [37.187.137.238]) by mx.google.com with ESMTP id v71si13874383wmd.18.2016.04.04.08.06.16 for ; Mon, 04 Apr 2016 08:06:17 -0700 (PDT) Date: Mon, 4 Apr 2016 17:05:58 +0200 From: Boris Brezillon Subject: Re: [PATCH 1/4] mm: add is_highmem_addr() helper Message-ID: <20160404170558.0e3278b5@bbrezillon> In-Reply-To: <57022253.70400@ti.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> <57022253.70400@ti.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: owner-linux-mm@kvack.org List-ID: To: Vignesh R Cc: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon , Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org On Mon, 4 Apr 2016 13:44:11 +0530 Vignesh R wrote: > Hi, > > On 03/31/2016 05:59 PM, Boris Brezillon wrote: > > Add an helper to check if a virtual address is in the highmem region. > > > > Signed-off-by: Boris Brezillon > > --- > > include/linux/highmem.h | 13 +++++++++++++ > > 1 file changed, 13 insertions(+) > > > > diff --git a/include/linux/highmem.h b/include/linux/highmem.h > > index bb3f329..13dff37 100644 > > --- a/include/linux/highmem.h > > +++ b/include/linux/highmem.h > > @@ -41,6 +41,14 @@ void kmap_flush_unused(void); > > > > struct page *kmap_to_page(void *addr); > > > > +static inline bool is_highmem_addr(const void *x) > > +{ > > + unsigned long vaddr = (unsigned long)x; > > + > > + return vaddr >= PKMAP_BASE && > > + vaddr < ((PKMAP_BASE + LAST_PKMAP) * PAGE_SIZE); > > > Shouldn't this be: > vaddr < (PKMAP_BASE + (LAST_PKMAP * PAGE_SIZE)) ? Oops, yes indeed. Anyway, given Russell's feedback I don't think I'm gonna follow up on this series. Sorry. Boris -- Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 From: kbuild test robot Subject: Re: [PATCH 4/4] mtd: provide helper to prepare buffers for DMA operations Date: Fri, 1 Apr 2016 11:13:43 +0800 Message-ID: <201604011151.adkPJgri%fengguang.wu@intel.com> References: <1459427384-21374-5-git-send-email-boris.brezillon@free-electrons.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="bg08WKrSYDhXBjb5" Return-path: Content-Disposition: inline In-Reply-To: <1459427384-21374-5-git-send-email-boris.brezillon@free-electrons.com> Sender: owner-linux-mm@kvack.org Cc: kbuild-all@01.org, David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon , Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@l List-Id: iommu@lists.linux-foundation.org --bg08WKrSYDhXBjb5 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Boris, [auto build test ERROR on spi/for-next] [also build test ERROR on v4.6-rc1 next-20160331] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Boris-Brezillon/scatterlist-sg_table-from-virtual-pointer/20160331-203118 base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi for-next config: m32r-m32104ut_defconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=m32r All error/warnings (new ones prefixed by >>): In file included from include/linux/mtd/super.h:17:0, from fs/romfs/storage.c:13: >> include/linux/mtd/mtd.h:426:10: error: expected ';', ',' or ')' before 'enum' enum dma_data_direction dir) ^ include/linux/mtd/mtd.h: In function 'mtd_unmap_buf': >> include/linux/mtd/mtd.h:434:2: warning: 'return' with a value, in function returning void return -ENOTSUPP; ^ fs/romfs/storage.c: At top level: include/linux/mtd/mtd.h:431:13: warning: 'mtd_unmap_buf' defined but not used [-Wunused-function] static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, ^ -- In file included from include/linux/mtd/super.h:17:0, from fs/romfs/super.c:72: >> include/linux/mtd/mtd.h:426:10: error: expected ';', ',' or ')' before 'enum' enum dma_data_direction dir) ^ include/linux/mtd/mtd.h: In function 'mtd_unmap_buf': >> include/linux/mtd/mtd.h:434:2: warning: 'return' with a value, in function returning void return -ENOTSUPP; ^ fs/romfs/super.c: At top level: include/linux/mtd/mtd.h:431:13: warning: 'mtd_unmap_buf' defined but not used [-Wunused-function] static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, ^ vim +426 include/linux/mtd/mtd.h 420 struct sg_table *sgt, enum dma_data_direction dir); 421 #else 422 static inline int mtd_map_buf(struct mtd_info *mtd, struct device *dev, 423 struct sg_table *sgt, const void *buf, 424 size_t len, 425 const struct sg_constraints *constraints > 426 enum dma_data_direction dir) 427 { 428 return -ENOTSUPP; 429 } 430 431 static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, 432 struct sg_table *sgt, enum dma_data_direction dir) 433 { > 434 return -ENOTSUPP; 435 } 436 #endif 437 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation --bg08WKrSYDhXBjb5 Content-Type: application/octet-stream Content-Disposition: attachment; filename=".config.gz" Content-Transfer-Encoding: base64 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 --bg08WKrSYDhXBjb5-- -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Brezillon Subject: Re: [PATCH 1/4] mm: add is_highmem_addr() helper Date: Mon, 4 Apr 2016 17:05:58 +0200 Message-ID: <20160404170558.0e3278b5@bbrezillon> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> <57022253.70400@ti.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <57022253.70400-l0cyMroinI0@public.gmane.org> Sender: linux-spi-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Vignesh R Cc: David Woodhouse , Brian Norris , linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Andrew Morton , Dave Gordon , Mark Brown , linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Vinod Koul , Dan Williams , dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org, Joerg Roedel , iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: iommu@lists.linux-foundation.org On Mon, 4 Apr 2016 13:44:11 +0530 Vignesh R wrote: > Hi, > > On 03/31/2016 05:59 PM, Boris Brezillon wrote: > > Add an helper to check if a virtual address is in the highmem region. > > > > Signed-off-by: Boris Brezillon > > --- > > include/linux/highmem.h | 13 +++++++++++++ > > 1 file changed, 13 insertions(+) > > > > diff --git a/include/linux/highmem.h b/include/linux/highmem.h > > index bb3f329..13dff37 100644 > > --- a/include/linux/highmem.h > > +++ b/include/linux/highmem.h > > @@ -41,6 +41,14 @@ void kmap_flush_unused(void); > > > > struct page *kmap_to_page(void *addr); > > > > +static inline bool is_highmem_addr(const void *x) > > +{ > > + unsigned long vaddr = (unsigned long)x; > > + > > + return vaddr >= PKMAP_BASE && > > + vaddr < ((PKMAP_BASE + LAST_PKMAP) * PAGE_SIZE); > > > Shouldn't this be: > vaddr < (PKMAP_BASE + (LAST_PKMAP * PAGE_SIZE)) ? Oops, yes indeed. Anyway, given Russell's feedback I don't think I'm gonna follow up on this series. Sorry. Boris -- Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html From mboxrd@z Thu Jan 1 00:00:00 1970 From: boris.brezillon@free-electrons.com (Boris Brezillon) Date: Thu, 31 Mar 2016 14:29:41 +0200 Subject: [PATCH 1/4] mm: add is_highmem_addr() helper In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Message-ID: <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Add an helper to check if a virtual address is in the highmem region. Signed-off-by: Boris Brezillon --- include/linux/highmem.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/linux/highmem.h b/include/linux/highmem.h index bb3f329..13dff37 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -41,6 +41,14 @@ void kmap_flush_unused(void); struct page *kmap_to_page(void *addr); +static inline bool is_highmem_addr(const void *x) +{ + unsigned long vaddr = (unsigned long)x; + + return vaddr >= PKMAP_BASE && + vaddr < ((PKMAP_BASE + LAST_PKMAP) * PAGE_SIZE); +} + #else /* CONFIG_HIGHMEM */ static inline unsigned int nr_free_highpages(void) { return 0; } @@ -50,6 +58,11 @@ static inline struct page *kmap_to_page(void *addr) return virt_to_page(addr); } +static inline bool is_highmem_addr(const void *x) +{ + return false; +} + #define totalhigh_pages 0UL #ifndef ARCH_HAS_KMAP -- 2.5.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: boris.brezillon@free-electrons.com (Boris Brezillon) Date: Thu, 31 Mar 2016 14:29:43 +0200 Subject: [PATCH 3/4] spi: use sg_alloc_table_from_buf() In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Message-ID: <1459427384-21374-4-git-send-email-boris.brezillon@free-electrons.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Replace custom implementation of sg_alloc_table_from_buf() by a call to sg_alloc_table_from_buf(). Signed-off-by: Boris Brezillon --- drivers/spi/spi.c | 45 +++++---------------------------------------- 1 file changed, 5 insertions(+), 40 deletions(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index de2f2f9..eed461d 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -705,49 +705,14 @@ static int spi_map_buf(struct spi_master *master, struct device *dev, struct sg_table *sgt, void *buf, size_t len, enum dma_data_direction dir) { - const bool vmalloced_buf = is_vmalloc_addr(buf); - unsigned int max_seg_size = dma_get_max_seg_size(dev); - int desc_len; - int sgs; - struct page *vm_page; - void *sg_buf; - size_t min; - int i, ret; - - if (vmalloced_buf) { - desc_len = min_t(int, max_seg_size, PAGE_SIZE); - sgs = DIV_ROUND_UP(len + offset_in_page(buf), desc_len); - } else { - desc_len = min_t(int, max_seg_size, master->max_dma_len); - sgs = DIV_ROUND_UP(len, desc_len); - } + struct sg_constraints constraints = { }; + int ret; - ret = sg_alloc_table(sgt, sgs, GFP_KERNEL); - if (ret != 0) + constraints.max_segment_size = dma_get_max_seg_size(dev); + ret = sg_alloc_table_from_buf(sgt, buf, len, &constraints, GFP_KERNEL); + if (ret) return ret; - for (i = 0; i < sgs; i++) { - - if (vmalloced_buf) { - min = min_t(size_t, - len, desc_len - offset_in_page(buf)); - vm_page = vmalloc_to_page(buf); - if (!vm_page) { - sg_free_table(sgt); - return -ENOMEM; - } - sg_set_page(&sgt->sgl[i], vm_page, - min, offset_in_page(buf)); - } else { - min = min_t(size_t, len, desc_len); - sg_buf = buf; - sg_set_buf(&sgt->sgl[i], sg_buf, min); - } - - buf += min; - len -= min; - } - ret = dma_map_sg(dev, sgt->sgl, sgt->nents, dir); if (!ret) ret = -ENOMEM; -- 2.5.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: boris.brezillon@free-electrons.com (Boris Brezillon) Date: Thu, 31 Mar 2016 14:29:40 +0200 Subject: [PATCH 0/4] scatterlist: sg_table from virtual pointer Message-ID: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hello, This series has been extracted from another series [1] adding support for DMA operations in a NAND driver. The reason I decided to post those patches separately is because they are touching core stuff, and I'd like to have feedback on these specific aspects. The idea is to provide a generic function creating an sg_table from a virtual pointer and a length. This operation is complicated by the different memory regions exposed in kernel space. For example, you have the lowmem region, which guarantees that buffers are physically contiguous, while the vmalloc region does not. sg_alloc_table_from_buf() detects in which memory region your buffer reside, and takes the appropriate precautions when creating the sg_table. This function also takes an extract parameter, allowing one to specify extra constraints, like the maximum DMA segment size, the required and the preferred alignment. Patch 1 and 2 are implementing sg_alloc_table_from_buf() (patch 1 is needed to properly detect buffers residing in the highmem/kmap area). Patch 3 is making use of sg_alloc_table_from_buf() in the spi_map_buf() function (hopefully, other subsystems/drivers will be able to easily switch to this function too). Patch 4 is implementing what I really need: generic functions to map/unmap a virtual buffer passed through mtd->_read/_write(). I'm not exactly a DMA or MM experts, so that would be great to have feedbacks on this approach. That's why I added so many people in Cc even if they're not directly impacted by those patches. Let me know if you want me to drop/add people from/to the recipient list. Thanks. Best Regards, Boris [1]http://www.spinics.net/lists/arm-kernel/msg493552.html Boris Brezillon (4): mm: add is_highmem_addr() helper scatterlist: add sg_alloc_table_from_buf() helper spi: use sg_alloc_table_from_buf() mtd: provide helper to prepare buffers for DMA operations drivers/mtd/mtdcore.c | 66 ++++++++++++++++ drivers/spi/spi.c | 45 ++--------- include/linux/highmem.h | 13 ++++ include/linux/mtd/mtd.h | 25 ++++++ include/linux/scatterlist.h | 24 ++++++ lib/scatterlist.c | 183 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 316 insertions(+), 40 deletions(-) -- 2.5.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: boris.brezillon@free-electrons.com (Boris Brezillon) Date: Thu, 31 Mar 2016 14:29:44 +0200 Subject: [PATCH 4/4] mtd: provide helper to prepare buffers for DMA operations In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Message-ID: <1459427384-21374-5-git-send-email-boris.brezillon@free-electrons.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Some NAND controller drivers are making use of DMA to transfer data from the controller to the buffer passed by the MTD user. Provide a generic mtd_map/unmap_buf() implementation to avoid open coded (and sometime erroneous) implementations. Signed-off-by: Boris Brezillon --- drivers/mtd/mtdcore.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/mtd/mtd.h | 25 +++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 3096251..4c20f33 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c @@ -1253,6 +1253,72 @@ void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size) } EXPORT_SYMBOL_GPL(mtd_kmalloc_up_to); +#ifdef CONFIG_HAS_DMA +/** + * mtd_map_buf - create an SG table and prepare it for DMA operations + * + * @mtd: mtd device description object pointer + * @dev: device handling the DMA operation + * @buf: buf used to create the SG table + * @len: length of buf + * @constraints: optional constraints to take into account when creating + * the SG table. Can be NULL if no specific constraints + * are required. + * @dir: direction of the DMA operation + * + * This function should be used when an MTD driver wants to do DMA operations + * on a buffer passed by the MTD layer. This functions takes care of + * vmallocated buffer constraints, and return and sg_table that you can safely + * use. + */ +int mtd_map_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + enum dma_data_direction dir) +{ + int ret; + + ret = sg_alloc_table_from_buf(sgt, buf, len, constraints, GFP_KERNEL); + if (ret) + return ret; + + ret = dma_map_sg(dev, sgt->sgl, sgt->nents, dir); + if (!ret) + ret = -ENOMEM; + + if (ret < 0) { + sg_free_table(sgt); + return ret; + } + + sgt->nents = ret; + + return 0; +} +EXPORT_SYMBOL_GPL(mtd_map_buf); + +/** + * mtd_unmap_buf - unmap an SG table and release its resources + * + * @mtd: mtd device description object pointer + * @dev: device handling the DMA operation + * @sgt: SG table + * @dir: direction of the DMA operation + * + * This function unmaps a previously mapped SG table and release SG table + * resources. Should be called when your DMA operation is done. + */ +void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, enum dma_data_direction dir) +{ + if (sgt->orig_nents) { + dma_unmap_sg(dev, sgt->sgl, sgt->orig_nents, dir); + sg_free_table(sgt); + } +} +EXPORT_SYMBOL_GPL(mtd_unmap_buf); +#endif /* !CONFIG_HAS_DMA */ + #ifdef CONFIG_PROC_FS /*====================================================================*/ diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 7712721..15cff85 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -410,6 +411,30 @@ extern void register_mtd_user (struct mtd_notifier *new); extern int unregister_mtd_user (struct mtd_notifier *old); void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size); +#ifdef CONFIG_HAS_DMA +int mtd_map_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + enum dma_data_direction dir); +void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, enum dma_data_direction dir); +#else +static inline int mtd_map_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, const void *buf, + size_t len, + const struct sg_constraints *constraints + enum dma_data_direction dir) +{ + return -ENOTSUPP; +} + +static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, + struct sg_table *sgt, enum dma_data_direction dir) +{ + return -ENOTSUPP; +} +#endif + void mtd_erase_callback(struct erase_info *instr); static inline int mtd_is_bitflip(int err) { -- 2.5.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: boris.brezillon@free-electrons.com (Boris Brezillon) Date: Thu, 31 Mar 2016 14:29:42 +0200 Subject: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Message-ID: <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org sg_alloc_table_from_buf() provides an easy solution to create an sg_table from a virtual address pointer. This function takes care of dealing with vmallocated buffers, buffer alignment, or DMA engine limitations (maximum DMA transfer size). Signed-off-by: Boris Brezillon --- include/linux/scatterlist.h | 24 ++++++ lib/scatterlist.c | 183 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 207 insertions(+) diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 556ec1e..18d1091 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h @@ -41,6 +41,27 @@ struct sg_table { unsigned int orig_nents; /* original size of list */ }; +/** + * struct sg_constraints - SG constraints structure + * + * @max_segment_size: maximum segment length. Each SG entry has to be smaller + * than this value. Zero means no constraint. + * @required_alignment: minimum alignment. Is used for both size and pointer + * alignment. If this constraint is not met, the function + * should return -EINVAL. + * @preferred_alignment: preferred alignment. Mainly used to optimize + * throughput when the DMA engine performs better when + * doing aligned accesses. + * + * This structure is here to help sg_alloc_table_from_buf() create the optimal + * SG list based on DMA engine constraints. + */ +struct sg_constraints { + size_t max_segment_size; + size_t required_alignment; + size_t preferred_alignment; +}; + /* * Notes on SG table design. * @@ -265,6 +286,9 @@ int sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pages, unsigned int n_pages, unsigned long offset, unsigned long size, gfp_t gfp_mask); +int sg_alloc_table_from_buf(struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + gfp_t gfp_mask); size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, void *buf, size_t buflen, off_t skip, bool to_buffer); diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 004fc70..9c9746e 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -433,6 +433,189 @@ int sg_alloc_table_from_pages(struct sg_table *sgt, } EXPORT_SYMBOL(sg_alloc_table_from_pages); +static size_t sg_buf_chunk_len(const void *buf, size_t len, + const struct sg_constraints *cons) +{ + size_t chunk_len = len; + + if (cons->max_segment_size) + chunk_len = min_t(size_t, chunk_len, cons->max_segment_size); + + if (is_vmalloc_addr(buf)) { + unsigned long offset_in_page = offset_in_page(buf); + size_t contig_len = PAGE_SIZE - offset_in_page; + unsigned long phys = vmalloc_to_pfn(buf) - offset_in_page; + const void *contig_ptr = buf + contig_len; + + /* + * Vmalloced buffer might be composed of several physically + * contiguous pages. Avoid extra scattergather entries in + * this case. + */ + while (contig_len < chunk_len) { + if (phys + PAGE_SIZE != vmalloc_to_pfn(contig_ptr)) + break; + + contig_len += PAGE_SIZE; + contig_ptr += PAGE_SIZE; + phys += PAGE_SIZE; + } + + chunk_len = min_t(size_t, chunk_len, contig_len); + } + + if (!IS_ALIGNED((unsigned long)buf, cons->preferred_alignment)) { + const void *aligned_buf = PTR_ALIGN(buf, + cons->preferred_alignment); + size_t unaligned_len = (unsigned long)(aligned_buf - buf); + + chunk_len = min_t(size_t, chunk_len, unaligned_len); + } else if (chunk_len > cons->preferred_alignment) { + chunk_len &= ~(cons->preferred_alignment - 1); + } + + return chunk_len; +} + +#define sg_for_each_chunk_in_buf(buf, len, chunk_len, constraints) \ + for (chunk_len = sg_buf_chunk_len(buf, len, constraints); \ + len; \ + len -= chunk_len, buf += chunk_len, \ + chunk_len = sg_buf_chunk_len(buf, len, constraints)) + +static int sg_check_constraints(struct sg_constraints *cons, + const void *buf, size_t len) +{ + /* + * We only accept buffers coming from the lowmem, vmalloc and + * highmem regions. + */ + if (!virt_addr_valid(buf) && !is_vmalloc_addr(buf) && + !is_highmem_addr(buf)) + return -EINVAL; + + if (!cons->required_alignment) + cons->required_alignment = 1; + + if (!cons->preferred_alignment) + cons->preferred_alignment = cons->required_alignment; + + /* Test if buf and len are properly aligned. */ + if (!IS_ALIGNED((unsigned long)buf, cons->required_alignment) || + !IS_ALIGNED(len, cons->required_alignment)) + return -EINVAL; + + /* + * if the buffer has been vmallocated or kmapped and required_alignment + * is more than PAGE_SIZE we cannot guarantee it. + */ + if (!virt_addr_valid(buf) && cons->required_alignment > PAGE_SIZE) + return -EINVAL; + + /* + * max_segment_size has to be aligned to required_alignment to + * guarantee that all buffer chunks are aligned correctly. + */ + if (!IS_ALIGNED(cons->max_segment_size, cons->required_alignment)) + return -EINVAL; + + /* + * preferred_alignment has to be aligned to required_alignment + * to avoid misalignment of buffer chunks. + */ + if (!IS_ALIGNED(cons->preferred_alignment, cons->required_alignment)) + return -EINVAL; + + return 0; +} + +/** + * sg_alloc_table_from_buf - create an SG table from a buffer + * + * @sgt: SG table + * @buf: buffer you want to create this SG table from + * @len: length of buf + * @constraints: optional constraints to take into account when creating + * the SG table. Can be NULL if no specific constraints are + * required. + * @gfp_mask: type of allocation to use when creating the table + * + * This function creates an SG table from a buffer, its length and some + * SG constraints. + * + * Note: This function supports buffers coming from the lowmem, vmalloc or + * highmem region. + */ +int sg_alloc_table_from_buf(struct sg_table *sgt, const void *buf, size_t len, + const struct sg_constraints *constraints, + gfp_t gfp_mask) +{ + struct sg_constraints cons = { }; + size_t remaining, chunk_len; + const void *sg_buf; + int i, ret; + + if (constraints) + cons = *constraints; + + ret = sg_check_constraints(&cons, buf, len); + if (ret) + return ret; + + sg_buf = buf; + remaining = len; + i = 0; + sg_for_each_chunk_in_buf(sg_buf, remaining, chunk_len, &cons) + i++; + + ret = sg_alloc_table(sgt, i, gfp_mask); + if (ret) + return ret; + + sg_buf = buf; + remaining = len; + i = 0; + sg_for_each_chunk_in_buf(sg_buf, remaining, chunk_len, &cons) { + if (virt_addr_valid(buf)) { + /* + * Buffer is in lowmem, we can safely call + * sg_set_buf(). + */ + sg_set_buf(&sgt->sgl[i], sg_buf, chunk_len); + } else { + struct page *vm_page; + + /* + * Buffer has been obtained with vmalloc() or kmap(). + * In this case we have to extract the page information + * and use sg_set_page(). + */ + if (is_vmalloc_addr(sg_buf)) + vm_page = vmalloc_to_page(sg_buf); + else + vm_page = kmap_to_page((void *)sg_buf); + + if (!vm_page) { + ret = -ENOMEM; + goto err_free_table; + } + + sg_set_page(&sgt->sgl[i], vm_page, chunk_len, + offset_in_page(sg_buf)); + } + + i++; + } + + return 0; + +err_free_table: + sg_free_table(sgt); + + return ret; +} +EXPORT_SYMBOL(sg_alloc_table_from_buf); + void __sg_page_iter_start(struct sg_page_iter *piter, struct scatterlist *sglist, unsigned int nents, unsigned long pgoffset) -- 2.5.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: linux@arm.linux.org.uk (Russell King - ARM Linux) Date: Thu, 31 Mar 2016 15:14:13 +0100 Subject: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper In-Reply-To: <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> Message-ID: <20160331141412.GK19428@n2100.arm.linux.org.uk> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Thu, Mar 31, 2016 at 02:29:42PM +0200, Boris Brezillon wrote: > sg_alloc_table_from_buf() provides an easy solution to create an sg_table > from a virtual address pointer. This function takes care of dealing with > vmallocated buffers, buffer alignment, or DMA engine limitations (maximum > DMA transfer size). Please note that the DMA API does not take account of coherency of memory regions other than non-high/lowmem - there are specific extensions to deal with this. What this means is that having an API that takes any virtual address pointer, converts it to a scatterlist which is then DMA mapped, is unsafe. It'll be okay for PIPT and non-aliasing VIPT cache architectures, but for other cache architectures this will hide this problem and make review harder. -- RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/ FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up according to speedtest.net. From mboxrd@z Thu Jan 1 00:00:00 1970 From: linux@arm.linux.org.uk (Russell King - ARM Linux) Date: Thu, 31 Mar 2016 16:09:23 +0100 Subject: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper In-Reply-To: <20160331164557.544ed780@bbrezillon> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> <20160331141412.GK19428@n2100.arm.linux.org.uk> <20160331164557.544ed780@bbrezillon> Message-ID: <20160331150923.GL19428@n2100.arm.linux.org.uk> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Thu, Mar 31, 2016 at 04:45:57PM +0200, Boris Brezillon wrote: > Hi Russell, > > On Thu, 31 Mar 2016 15:14:13 +0100 > Russell King - ARM Linux wrote: > > > On Thu, Mar 31, 2016 at 02:29:42PM +0200, Boris Brezillon wrote: > > > sg_alloc_table_from_buf() provides an easy solution to create an sg_table > > > from a virtual address pointer. This function takes care of dealing with > > > vmallocated buffers, buffer alignment, or DMA engine limitations (maximum > > > DMA transfer size). > > > > Please note that the DMA API does not take account of coherency of memory > > regions other than non-high/lowmem - there are specific extensions to > > deal with this. > > Ok, you said 'non-high/lowmem', this means vmalloced and kmapped buffers > already fall in this case, right? > > Could you tell me more about those specific extensions? I was slightly confused - the extensions I was thinking of are those listed at the bottom of Documentation/cachetlb.txt, which have nothing to do with DMA. However, it's probably worth reading Documentation/DMA-API-HOWTO.txt to read up on what kinds of memory are considered to be DMA-able in the kernel. > > What this means is that having an API that takes any virtual address > > pointer, converts it to a scatterlist which is then DMA mapped, is > > unsafe. > > Which means some implementations already get this wrong (see > spi_map_buf(), and I'm pretty sure it's not the only one). Quite possible, but that is driver stuff, and driver stuff gets things wrong all the time. :) > > It'll be okay for PIPT and non-aliasing VIPT cache architectures, but > > for other cache architectures this will hide this problem and make > > review harder. > > > > Ok, you lost me. I'll have to do my homework and try to understand what > this means :). P = physical address V = virtual address I = indexed T = tag The tag is held in each cache line. When a location is looked up in the cache, an index is used to locate a set of cache lines and the tag is compared to check which cache line in the set is the correct one (or whether the address even exists in the cache.) How the index and tag are derived varies between cache architectures. PIPT = indexed by physical address, tagged with physical address. Never aliases with itself in the presence of multiple virtual mappings. VIPT = indexed by virtual address, tagged with physical address. If the bits from the virtual address do not overlap the MMU page size, it is also alias free, otherwise aliases can exist, but can be eliminated by "cache colouring" - ensuring that a physical address is always mapped with the same overlapping bits. VIVT = indexed by virtual address, tagged with virtual address. The worst kind of cache, since every different mapping of the same physical address is guaranteed by design to alias with other mappings. There is little cache colouring between different kernel mappings (eg, between lowmem and vmalloc space.) What this means is that, while the DMA API takes care of DMA aliases in the lowmem mappings, an alias-prone VIPT cache will remain incoherent with DMA if it is remapped into vmalloc space, and the mapping happens to have a different cache colour. In other words, this is a data corruption issue. Hence, taking a range of vmalloc() addresses, converting them into a scatterlist, then using the DMA API on the scatterlist _only_ guarantees that the lowmem (and kmap'd highmem mappings) are coherent with DMA. There is no way for the DMA API to know that other mappings exist, and obviously flushing every possible cache line just because a mapping might exist multiplies the expense of the DMA API: not only in terms of time spent running through all the possibilities, which doubles for every aliasing bit of VIPT, but also TLB pressure since you'd have to create a mapping for each alias and tear it back down. VIVT is even worse, since there is no other virtual mapping which is coherent, would need to be known, and each mapping would need to be individually flushed. -- RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/ FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up according to speedtest.net. From mboxrd@z Thu Jan 1 00:00:00 1970 From: boris.brezillon@free-electrons.com (Boris Brezillon) Date: Thu, 31 Mar 2016 16:45:57 +0200 Subject: [PATCH 2/4] scatterlist: add sg_alloc_table_from_buf() helper In-Reply-To: <20160331141412.GK19428@n2100.arm.linux.org.uk> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-3-git-send-email-boris.brezillon@free-electrons.com> <20160331141412.GK19428@n2100.arm.linux.org.uk> Message-ID: <20160331164557.544ed780@bbrezillon> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Russell, On Thu, 31 Mar 2016 15:14:13 +0100 Russell King - ARM Linux wrote: > On Thu, Mar 31, 2016 at 02:29:42PM +0200, Boris Brezillon wrote: > > sg_alloc_table_from_buf() provides an easy solution to create an sg_table > > from a virtual address pointer. This function takes care of dealing with > > vmallocated buffers, buffer alignment, or DMA engine limitations (maximum > > DMA transfer size). > > Please note that the DMA API does not take account of coherency of memory > regions other than non-high/lowmem - there are specific extensions to > deal with this. Ok, you said 'non-high/lowmem', this means vmalloced and kmapped buffers already fall in this case, right? Could you tell me more about those specific extensions? > > What this means is that having an API that takes any virtual address > pointer, converts it to a scatterlist which is then DMA mapped, is > unsafe. Which means some implementations already get this wrong (see spi_map_buf(), and I'm pretty sure it's not the only one). > > It'll be okay for PIPT and non-aliasing VIPT cache architectures, but > for other cache architectures this will hide this problem and make > review harder. > Ok, you lost me. I'll have to do my homework and try to understand what this means :). Thanks for your valuable inputs. Best Regards, Boris -- Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com From mboxrd@z Thu Jan 1 00:00:00 1970 From: broonie@kernel.org (Mark Brown) Date: Thu, 31 Mar 2016 10:23:53 -0700 Subject: [PATCH 3/4] spi: use sg_alloc_table_from_buf() In-Reply-To: <1459427384-21374-4-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-4-git-send-email-boris.brezillon@free-electrons.com> Message-ID: <20160331172353.GJ2350@sirena.org.uk> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Thu, Mar 31, 2016 at 02:29:43PM +0200, Boris Brezillon wrote: > Replace custom implementation of sg_alloc_table_from_buf() by a call to > sg_alloc_table_from_buf(). Acked-by: Mark Brown -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 473 bytes Desc: not available URL: From mboxrd@z Thu Jan 1 00:00:00 1970 From: vigneshr@ti.com (Vignesh R) Date: Mon, 4 Apr 2016 13:44:11 +0530 Subject: [PATCH 1/4] mm: add is_highmem_addr() helper In-Reply-To: <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> Message-ID: <57022253.70400@ti.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi, On 03/31/2016 05:59 PM, Boris Brezillon wrote: > Add an helper to check if a virtual address is in the highmem region. > > Signed-off-by: Boris Brezillon > --- > include/linux/highmem.h | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/include/linux/highmem.h b/include/linux/highmem.h > index bb3f329..13dff37 100644 > --- a/include/linux/highmem.h > +++ b/include/linux/highmem.h > @@ -41,6 +41,14 @@ void kmap_flush_unused(void); > > struct page *kmap_to_page(void *addr); > > +static inline bool is_highmem_addr(const void *x) > +{ > + unsigned long vaddr = (unsigned long)x; > + > + return vaddr >= PKMAP_BASE && > + vaddr < ((PKMAP_BASE + LAST_PKMAP) * PAGE_SIZE); Shouldn't this be: vaddr < (PKMAP_BASE + (LAST_PKMAP * PAGE_SIZE)) ? -- Regards Vignesh From mboxrd@z Thu Jan 1 00:00:00 1970 From: boris.brezillon@free-electrons.com (Boris Brezillon) Date: Mon, 4 Apr 2016 17:05:58 +0200 Subject: [PATCH 1/4] mm: add is_highmem_addr() helper In-Reply-To: <57022253.70400@ti.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> <1459427384-21374-2-git-send-email-boris.brezillon@free-electrons.com> <57022253.70400@ti.com> Message-ID: <20160404170558.0e3278b5@bbrezillon> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Mon, 4 Apr 2016 13:44:11 +0530 Vignesh R wrote: > Hi, > > On 03/31/2016 05:59 PM, Boris Brezillon wrote: > > Add an helper to check if a virtual address is in the highmem region. > > > > Signed-off-by: Boris Brezillon > > --- > > include/linux/highmem.h | 13 +++++++++++++ > > 1 file changed, 13 insertions(+) > > > > diff --git a/include/linux/highmem.h b/include/linux/highmem.h > > index bb3f329..13dff37 100644 > > --- a/include/linux/highmem.h > > +++ b/include/linux/highmem.h > > @@ -41,6 +41,14 @@ void kmap_flush_unused(void); > > > > struct page *kmap_to_page(void *addr); > > > > +static inline bool is_highmem_addr(const void *x) > > +{ > > + unsigned long vaddr = (unsigned long)x; > > + > > + return vaddr >= PKMAP_BASE && > > + vaddr < ((PKMAP_BASE + LAST_PKMAP) * PAGE_SIZE); > > > Shouldn't this be: > vaddr < (PKMAP_BASE + (LAST_PKMAP * PAGE_SIZE)) ? Oops, yes indeed. Anyway, given Russell's feedback I don't think I'm gonna follow up on this series. Sorry. Boris -- Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com From mboxrd@z Thu Jan 1 00:00:00 1970 From: lkp@intel.com (kbuild test robot) Date: Fri, 1 Apr 2016 11:13:43 +0800 Subject: [PATCH 4/4] mtd: provide helper to prepare buffers for DMA operations In-Reply-To: <1459427384-21374-5-git-send-email-boris.brezillon@free-electrons.com> Message-ID: <201604011151.adkPJgri%fengguang.wu@intel.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Boris, [auto build test ERROR on spi/for-next] [also build test ERROR on v4.6-rc1 next-20160331] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Boris-Brezillon/scatterlist-sg_table-from-virtual-pointer/20160331-203118 base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi for-next config: m32r-m32104ut_defconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=m32r All error/warnings (new ones prefixed by >>): In file included from include/linux/mtd/super.h:17:0, from fs/romfs/storage.c:13: >> include/linux/mtd/mtd.h:426:10: error: expected ';', ',' or ')' before 'enum' enum dma_data_direction dir) ^ include/linux/mtd/mtd.h: In function 'mtd_unmap_buf': >> include/linux/mtd/mtd.h:434:2: warning: 'return' with a value, in function returning void return -ENOTSUPP; ^ fs/romfs/storage.c: At top level: include/linux/mtd/mtd.h:431:13: warning: 'mtd_unmap_buf' defined but not used [-Wunused-function] static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, ^ -- In file included from include/linux/mtd/super.h:17:0, from fs/romfs/super.c:72: >> include/linux/mtd/mtd.h:426:10: error: expected ';', ',' or ')' before 'enum' enum dma_data_direction dir) ^ include/linux/mtd/mtd.h: In function 'mtd_unmap_buf': >> include/linux/mtd/mtd.h:434:2: warning: 'return' with a value, in function returning void return -ENOTSUPP; ^ fs/romfs/super.c: At top level: include/linux/mtd/mtd.h:431:13: warning: 'mtd_unmap_buf' defined but not used [-Wunused-function] static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, ^ vim +426 include/linux/mtd/mtd.h 420 struct sg_table *sgt, enum dma_data_direction dir); 421 #else 422 static inline int mtd_map_buf(struct mtd_info *mtd, struct device *dev, 423 struct sg_table *sgt, const void *buf, 424 size_t len, 425 const struct sg_constraints *constraints > 426 enum dma_data_direction dir) 427 { 428 return -ENOTSUPP; 429 } 430 431 static void mtd_unmap_buf(struct mtd_info *mtd, struct device *dev, 432 struct sg_table *sgt, enum dma_data_direction dir) 433 { > 434 return -ENOTSUPP; 435 } 436 #endif 437 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation -------------- next part -------------- A non-text attachment was scrubbed... Name: .config.gz Type: application/octet-stream Size: 10416 bytes Desc: not available URL: