* [PATCH dma-mapping tree] arm64: default to the direct mapping in get_arch_dma_ops
@ 2018-12-14 15:02 Christoph Hellwig
2018-12-19 16:55 ` Christoph Hellwig
2018-12-19 16:59 ` Robin Murphy
0 siblings, 2 replies; 7+ messages in thread
From: Christoph Hellwig @ 2018-12-14 15:02 UTC (permalink / raw)
To: robin.murphy, catalin.marinas, will.deacon
Cc: iommu, linux-arm-kernel, m.szyprowski
Otherwise the direct mapping won't work at all given that a NULL
dev->dma_ops causes a fallback. Note that we already explicitly set
dev->dma_ops to dma_dummy_ops for dma-incapable devices, so this
fallback should not be needed anyway.
Fixes: 356da6d0cd ("dma-mapping: bypass indirect calls for dma-direct")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
arch/arm64/include/asm/dma-mapping.h | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h
index 273e778f7de2..95dbf3ef735a 100644
--- a/arch/arm64/include/asm/dma-mapping.h
+++ b/arch/arm64/include/asm/dma-mapping.h
@@ -26,11 +26,7 @@
static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
{
- /*
- * We expect no ISA devices, and all other DMA masters are expected to
- * have someone call arch_setup_dma_ops at device creation time.
- */
- return &dma_dummy_ops;
+ return NULL;
}
void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
--
2.19.2
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH dma-mapping tree] arm64: default to the direct mapping in get_arch_dma_ops 2018-12-14 15:02 [PATCH dma-mapping tree] arm64: default to the direct mapping in get_arch_dma_ops Christoph Hellwig @ 2018-12-19 16:55 ` Christoph Hellwig 2018-12-28 17:30 ` Liviu Dudau 2018-12-19 16:59 ` Robin Murphy 1 sibling, 1 reply; 7+ messages in thread From: Christoph Hellwig @ 2018-12-19 16:55 UTC (permalink / raw) To: robin.murphy, catalin.marinas, will.deacon; +Cc: iommu, linux-arm-kernel As all maintainers seem to be off to their holidays already I've applied this now given that I don't want to leave arm64 in broken state in linux-next any longer. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH dma-mapping tree] arm64: default to the direct mapping in get_arch_dma_ops 2018-12-19 16:55 ` Christoph Hellwig @ 2018-12-28 17:30 ` Liviu Dudau 2018-12-28 17:59 ` Christoph Hellwig 0 siblings, 1 reply; 7+ messages in thread From: Liviu Dudau @ 2018-12-28 17:30 UTC (permalink / raw) To: Christoph Hellwig Cc: catalin.marinas, iommu, robin.murphy, linux-arm-kernel, will.deacon On Wed, Dec 19, 2018 at 05:55:02PM +0100, Christoph Hellwig wrote: > As all maintainers seem to be off to their holidays already I've > applied this now given that I don't want to leave arm64 in broken > state in linux-next any longer. Hi Christoph, Talking about linux-next being broken, I found out that with next-20181224 the nvme driver with an HMB NVMe SSD (Toshiba RC-100) also fails on a RK3399 board (NanoPC T4). It works with v4.20 just fine. The reason for linking it to your patchset is that I get this on next-20181224 (the DMA addresses looks the same for the allocated buffers): ....... [ 3.731134] rockchip-pcie f8000000.pcie: Looking up vpcie12v-supply from device tree [ 3.731177] rockchip-pcie f8000000.pcie: Looking up vpcie12v-supply property in node /pcie@f8000000 failed [ 3.731277] rockchip-pcie f8000000.pcie: no vpcie12v regulator found [ 3.731858] rockchip-pcie f8000000.pcie: Looking up vpcie3v3-supply from device tree [ 3.732021] rockchip-pcie f8000000.pcie: Linked as a consumer to regulator.2 [ 3.732661] rockchip-pcie f8000000.pcie: Looking up vpcie1v8-supply from device tree [ 3.732695] rockchip-pcie f8000000.pcie: Looking up vpcie1v8-supply property in node /pcie@f8000000 failed [ 3.732777] rockchip-pcie f8000000.pcie: no vpcie1v8 regulator found [ 3.733351] rockchip-pcie f8000000.pcie: Looking up vpcie0v9-supply from device tree [ 3.733384] rockchip-pcie f8000000.pcie: Looking up vpcie0v9-supply property in node /pcie@f8000000 failed [ 3.733465] rockchip-pcie f8000000.pcie: no vpcie0v9 regulator found [ 3.795175] rockchip-pcie f8000000.pcie: host bridge /pcie@f8000000 ranges: [ 3.795834] rockchip-pcie f8000000.pcie: Parsing ranges property... [ 3.795910] rockchip-pcie f8000000.pcie: MEM 0xfa000000..0xfbdfffff -> 0xfa000000 [ 3.796628] rockchip-pcie f8000000.pcie: IO 0xfbe00000..0xfbefffff -> 0xfbe00000 [ 3.797781] rockchip-pcie f8000000.pcie: PCI host bridge to bus 0000:00 [ 3.798384] pci_bus 0000:00: root bus resource [bus 00-1f] [ 3.798956] pci_bus 0000:00: root bus resource [mem 0xfa000000-0xfbdfffff] [ 3.799580] pci_bus 0000:00: root bus resource [io 0x0000-0xfffff] (bus address [0xfbe00000-0xfbefffff]) [ 3.800431] pci_bus 0000:00: scanning bus [ 3.800516] pci 0000:00:00.0: [1d87:0100] type 01 class 0x060400 [ 3.800819] pci 0000:00:00.0: supports D1 [ 3.800835] pci 0000:00:00.0: PME# supported from D0 D1 D3hot [ 3.800860] pci 0000:00:00.0: PME# disabled [ 3.808046] pci_bus 0000:00: fixups for bus [ 3.808079] pci 0000:00:00.0: scanning [bus 00-00] behind bridge, pass 0 [ 3.808097] pci 0000:00:00.0: bridge configuration invalid ([bus 00-00]), reconfiguring [ 3.808847] pci 0000:00:00.0: scanning [bus 00-00] behind bridge, pass 1 [ 3.809130] pci_bus 0000:01: scanning bus [ 3.809224] pci 0000:01:00.0: [1179:0113] type 00 class 0x010802 [ 3.809416] pci 0000:01:00.0: reg 0x10: [mem 0x00000000-0x00003fff 64bit] [ 3.809647] pci 0000:01:00.0: Upstream bridge's Max Payload Size set to 128 (was 256, max 256) [ 3.810436] pci 0000:01:00.0: Max Payload Size set to 128 (was 128, max 128) [ 3.811536] pci 0000:01:00.0: PME# supported from D0 D3hot [ 3.811569] pci 0000:01:00.0: PME# disabled [ 3.811862] pci 0000:01:00.0: 8.000 Gb/s available PCIe bandwidth, limited by 5 GT/s x2 link at 0000:00:00.0 (capable of 15.752 Gb/s with 8 GT/s x2 link) [ 3.820219] pci_bus 0000:01: fixups for bus [ 3.820239] pci_bus 0000:01: bus scan returning with max=01 [ 3.820261] pci_bus 0000:01: busn_res: [bus 01-1f] end is updated to 01 [ 3.820291] pci_bus 0000:00: bus scan returning with max=01 [ 3.820361] pci 0000:00:00.0: BAR 14: assigned [mem 0xfa000000-0xfa0fffff] [ 3.820994] pci 0000:01:00.0: BAR 0: assigned [mem 0xfa000000-0xfa003fff 64bit] [ 3.821702] pci 0000:00:00.0: PCI bridge to [bus 01] [ 3.822167] pci 0000:00:00.0: bridge window [mem 0xfa000000-0xfa0fffff] [ 3.823242] pcieport 0000:00:00.0: assign IRQ: got 229 [ 3.823281] pcieport 0000:00:00.0: enabling device (0000 -> 0002) ...... (nvme compiled as module, modprobed from shell) ..... [ 50.938888] nvme 0000:01:00.0: assign IRQ: got 229 [ 50.939441] nvme nvme0: pci function 0000:01:00.0 [ 50.940189] pcieport 0000:00:00.0: enabling bus mastering [ 50.940226] nvme 0000:01:00.0: enabling device (0000 -> 0002) [ 50.940784] nvme 0000:01:00.0: enabling bus mastering [ 51.097451] nvme nvme0: allocated 38 MiB host memory buffer. [ 51.097970] nvme nvme0: 0x000000001d8ec924 -> [0xffff000000000000, 0x400] [ 51.098609] nvme nvme0: 0x00000000bd00b691 -> [0xffff000000000000, 0x400] [ 51.099215] nvme nvme0: 0x0000000098e20ad2 -> [0xffff000000000000, 0x400] [ 51.099820] nvme nvme0: 0x000000003a390633 -> [0xffff000000000000, 0x400] [ 51.100423] nvme nvme0: 0x000000001cddf671 -> [0xffff000000000000, 0x400] [ 51.101026] nvme nvme0: 0x000000002587680f -> [0xffff000000000000, 0x400] [ 51.101629] nvme nvme0: 0x00000000bc2c89f9 -> [0xffff000000000000, 0x400] [ 51.102232] nvme nvme0: 0x000000005b3ef3ef -> [0xffff000000000000, 0x400] [ 51.102862] nvme nvme0: 0x000000004ec4a26a -> [0xffff000000000000, 0x400] [ 51.103466] nvme nvme0: 0x00000000ee7f030f -> [0xffff000000000000, 0x200] [ 111.582818] nvme nvme0: I/O 7 QID 0 timeout, disable controller [ 111.599289] nvme nvme0: failed to set host mem (err -4, flags 0x1). [ 111.599862] nvme nvme0: nvme_free_host_mem: nr_host_mem_descs = 10 [ 111.616938] nvme nvme0: Removing after probe failure status: -4 [ 111.617558] nvme nvme0: nvme_free_host_mem: nr_host_mem_descs = 0 [ 111.618270] nvme nvme0: failed to set APST feature (-19) The extra lines come from me trying to figure out what is going on with this patch: --8<-------------------------------------------------------------------------------------- diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 5a0bf6a24d507..73df69385bccd 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -1881,12 +1881,15 @@ static void nvme_free_host_mem(struct nvme_dev *dev) { int i; + dev_info(dev->ctrl.device, "%s: nr_host_mem_descs = %d\n", + __func__, dev->nr_host_mem_descs); for (i = 0; i < dev->nr_host_mem_descs; i++) { struct nvme_host_mem_buf_desc *desc = &dev->host_mem_descs[i]; size_t size = le32_to_cpu(desc->size) * dev->ctrl.page_size; - dma_free_coherent(dev->dev, size, dev->host_mem_desc_bufs[i], - le64_to_cpu(desc->addr)); + dma_free_attrs(dev->dev, size, dev->host_mem_desc_bufs[i], + le64_to_cpu(desc->addr), + DMA_ATTR_NO_KERNEL_MAPPING | DMA_ATTR_NO_WARN); } kfree(dev->host_mem_desc_bufs); @@ -1952,8 +1955,9 @@ static int __nvme_alloc_host_mem(struct nvme_dev *dev, u64 preferred, while (--i >= 0) { size_t size = le32_to_cpu(descs[i].size) * dev->ctrl.page_size; - dma_free_coherent(dev->dev, size, bufs[i], - le64_to_cpu(descs[i].addr)); + dma_free_attrs(dev->dev, size, bufs[i], + le64_to_cpu(descs[i].addr), + DMA_ATTR_NO_KERNEL_MAPPING | DMA_ATTR_NO_WARN); } kfree(bufs); @@ -2020,6 +2024,12 @@ static int nvme_setup_host_mem(struct nvme_dev *dev) dev_info(dev->ctrl.device, "allocated %lld MiB host memory buffer.\n", dev->host_mem_size >> ilog2(SZ_1M)); + for (ret = 0; ret < dev->nr_host_mem_descs; ret++) { + dev_info(dev->ctrl.device, + "0x%p -> [0x%llx, 0x%x]\n", dev->host_mem_desc_bufs[ret], + le64_to_cpu(dev->host_mem_descs[ret].addr), + le32_to_cpu(dev->host_mem_descs[ret].size)); + } } ret = nvme_set_host_mem(dev, enable_bits); --8<-------------------------------------------------------------------------------------- The change to use dma_free_attrs() instead of dma_free_coherent() is needed otherwise I get a crash in mm/vmalloc.c (patch sent to ML) or the modprobe hangs and I get the above err -4. Best regards, Liviu > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel -- ________________________________________________________ ________| |_______ \ | With enough courage, you can do without a reputation | / \ | -- Rhett Butler | / / |________________________________________________________| \ /__________) (_________\ _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH dma-mapping tree] arm64: default to the direct mapping in get_arch_dma_ops 2018-12-28 17:30 ` Liviu Dudau @ 2018-12-28 17:59 ` Christoph Hellwig 2018-12-28 22:05 ` Liviu Dudau 0 siblings, 1 reply; 7+ messages in thread From: Christoph Hellwig @ 2018-12-28 17:59 UTC (permalink / raw) To: Liviu Dudau Cc: catalin.marinas, will.deacon, iommu, robin.murphy, Christoph Hellwig, linux-arm-kernel On Fri, Dec 28, 2018 at 05:30:57PM +0000, Liviu Dudau wrote: > On Wed, Dec 19, 2018 at 05:55:02PM +0100, Christoph Hellwig wrote: > > As all maintainers seem to be off to their holidays already I've > > applied this now given that I don't want to leave arm64 in broken > > state in linux-next any longer. > > Hi Christoph, > > Talking about linux-next being broken, I found out that with > next-20181224 the nvme driver with an HMB NVMe SSD (Toshiba RC-100) > also fails on a RK3399 board (NanoPC T4). It works with v4.20 just fine. > > The reason for linking it to your patchset is that I get this on > next-20181224 (the DMA addresses looks the same for the allocated buffers): Your patch looks correct. Can you send the dma_alloc_coherent to dma_alloc_attrs switch to linux-nvme list with a proper commit log and signoff? _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH dma-mapping tree] arm64: default to the direct mapping in get_arch_dma_ops 2018-12-28 17:59 ` Christoph Hellwig @ 2018-12-28 22:05 ` Liviu Dudau 0 siblings, 0 replies; 7+ messages in thread From: Liviu Dudau @ 2018-12-28 22:05 UTC (permalink / raw) To: Christoph Hellwig Cc: catalin.marinas, iommu, robin.murphy, linux-arm-kernel, will.deacon On Fri, Dec 28, 2018 at 06:59:00PM +0100, Christoph Hellwig wrote: > On Fri, Dec 28, 2018 at 05:30:57PM +0000, Liviu Dudau wrote: > > On Wed, Dec 19, 2018 at 05:55:02PM +0100, Christoph Hellwig wrote: > > > As all maintainers seem to be off to their holidays already I've > > > applied this now given that I don't want to leave arm64 in broken > > > state in linux-next any longer. > > > > Hi Christoph, > > > > Talking about linux-next being broken, I found out that with > > next-20181224 the nvme driver with an HMB NVMe SSD (Toshiba RC-100) > > also fails on a RK3399 board (NanoPC T4). It works with v4.20 just fine. > > > > The reason for linking it to your patchset is that I get this on > > next-20181224 (the DMA addresses looks the same for the allocated buffers): > > Your patch looks correct. Can you send the dma_alloc_coherent > to dma_alloc_attrs switch to linux-nvme list with a proper commit log > and signoff? Sure, but that still doesn't make nvme work. Do you have any suggestions? Best regards, Liviu -- ________________________________________________________ ________| |_______ \ | With enough courage, you can do without a reputation | / \ | -- Rhett Butler | / / |________________________________________________________| \ /__________) (_________\ _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH dma-mapping tree] arm64: default to the direct mapping in get_arch_dma_ops 2018-12-14 15:02 [PATCH dma-mapping tree] arm64: default to the direct mapping in get_arch_dma_ops Christoph Hellwig 2018-12-19 16:55 ` Christoph Hellwig @ 2018-12-19 16:59 ` Robin Murphy 2018-12-19 17:00 ` Christoph Hellwig 1 sibling, 1 reply; 7+ messages in thread From: Robin Murphy @ 2018-12-19 16:59 UTC (permalink / raw) To: Christoph Hellwig, catalin.marinas, will.deacon Cc: iommu, linux-arm-kernel, m.szyprowski On 14/12/2018 15:02, Christoph Hellwig wrote: > Otherwise the direct mapping won't work at all given that a NULL > dev->dma_ops causes a fallback. Note that we already explicitly set > dev->dma_ops to dma_dummy_ops for dma-incapable devices, so this > fallback should not be needed anyway. Sorry, I'd somehow completely missed that you'd sent a proper patch for this - indeed it looks like the right change to make. Reviewed-by: Robin Murphy <robin.murphy@arm.com> > Fixes: 356da6d0cd ("dma-mapping: bypass indirect calls for dma-direct") > Signed-off-by: Christoph Hellwig <hch@lst.de> > Reported-by: Marek Szyprowski <m.szyprowski@samsung.com> > Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> > --- > arch/arm64/include/asm/dma-mapping.h | 6 +----- > 1 file changed, 1 insertion(+), 5 deletions(-) > > diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h > index 273e778f7de2..95dbf3ef735a 100644 > --- a/arch/arm64/include/asm/dma-mapping.h > +++ b/arch/arm64/include/asm/dma-mapping.h > @@ -26,11 +26,7 @@ > > static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus) > { > - /* > - * We expect no ISA devices, and all other DMA masters are expected to > - * have someone call arch_setup_dma_ops at device creation time. > - */ > - return &dma_dummy_ops; > + return NULL; > } > > void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size, > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH dma-mapping tree] arm64: default to the direct mapping in get_arch_dma_ops 2018-12-19 16:59 ` Robin Murphy @ 2018-12-19 17:00 ` Christoph Hellwig 0 siblings, 0 replies; 7+ messages in thread From: Christoph Hellwig @ 2018-12-19 17:00 UTC (permalink / raw) To: Robin Murphy Cc: catalin.marinas, will.deacon, iommu, Christoph Hellwig, linux-arm-kernel, m.szyprowski On Wed, Dec 19, 2018 at 04:59:03PM +0000, Robin Murphy wrote: > On 14/12/2018 15:02, Christoph Hellwig wrote: >> Otherwise the direct mapping won't work at all given that a NULL >> dev->dma_ops causes a fallback. Note that we already explicitly set >> dev->dma_ops to dma_dummy_ops for dma-incapable devices, so this >> fallback should not be needed anyway. > > Sorry, I'd somehow completely missed that you'd sent a proper patch for > this - indeed it looks like the right change to make. > > Reviewed-by: Robin Murphy <robin.murphy@arm.com> Thanks. I've added this given that I hadn't pushed out the tree yet. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-12-28 22:05 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-12-14 15:02 [PATCH dma-mapping tree] arm64: default to the direct mapping in get_arch_dma_ops Christoph Hellwig 2018-12-19 16:55 ` Christoph Hellwig 2018-12-28 17:30 ` Liviu Dudau 2018-12-28 17:59 ` Christoph Hellwig 2018-12-28 22:05 ` Liviu Dudau 2018-12-19 16:59 ` Robin Murphy 2018-12-19 17:00 ` Christoph Hellwig
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).