* [PATCH v3] Fix dma_mapping_error for 32bit x86
@ 2008-11-29 12:46 Thomas Bogendoerfer
2008-11-29 15:13 ` FUJITA Tomonori
2008-12-01 11:34 ` Joerg Roedel
0 siblings, 2 replies; 11+ messages in thread
From: Thomas Bogendoerfer @ 2008-11-29 12:46 UTC (permalink / raw)
To: linux-kernel
Devices like b44 ethernet can't dma from addresses above 1GB. The driver
handles this cases by falling back to GFP_DMA allocation. But for detecting
the problem it needs to get an indication from dma_mapping_error.
The bug is triggered by using a VMSPLIT option of 2G/2G.
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
---
diff -ru orig/linux-2.6.27.4/include/asm-x86/dma-mapping.h linux-2.6.27.4/include/asm-x86/dma-mapping.h
--- orig/linux-2.6.27.4/include/asm-x86/dma-mapping.h 2008-10-26 00:05:07.000000000 +0200
+++ linux-2.6.27.4/include/asm-x86/dma-mapping.h 2008-10-26 11:06:14.000000000 +0100
@@ -74,15 +74,13 @@
/* Make sure we keep the same behaviour */
static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
{
-#ifdef CONFIG_X86_32
- return 0;
-#else
+#ifdef CONFIG_X86_64
struct dma_mapping_ops *ops = get_dma_ops(dev);
if (ops->mapping_error)
return ops->mapping_error(dev, dma_addr);
- return (dma_addr == bad_dma_address);
#endif
+ return (dma_addr == bad_dma_address);
}
#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH v3] Fix dma_mapping_error for 32bit x86 2008-11-29 12:46 [PATCH v3] Fix dma_mapping_error for 32bit x86 Thomas Bogendoerfer @ 2008-11-29 15:13 ` FUJITA Tomonori 2008-12-01 11:34 ` Joerg Roedel 1 sibling, 0 replies; 11+ messages in thread From: FUJITA Tomonori @ 2008-11-29 15:13 UTC (permalink / raw) To: tsbogend, mingo; +Cc: linux-kernel On Sat, 29 Nov 2008 13:46:27 +0100 (CET) Thomas Bogendoerfer <tsbogend@alpha.franken.de> wrote: > Devices like b44 ethernet can't dma from addresses above 1GB. The driver > handles this cases by falling back to GFP_DMA allocation. But for detecting > the problem it needs to get an indication from dma_mapping_error. > The bug is triggered by using a VMSPLIT option of 2G/2G. > > Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de> > --- > > > diff -ru orig/linux-2.6.27.4/include/asm-x86/dma-mapping.h linux-2.6.27.4/include/asm-x86/dma-mapping.h > --- orig/linux-2.6.27.4/include/asm-x86/dma-mapping.h 2008-10-26 00:05:07.000000000 +0200 > +++ linux-2.6.27.4/include/asm-x86/dma-mapping.h 2008-10-26 11:06:14.000000000 +0100 > @@ -74,15 +74,13 @@ > /* Make sure we keep the same behaviour */ > static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) > { > -#ifdef CONFIG_X86_32 > - return 0; > -#else > +#ifdef CONFIG_X86_64 > struct dma_mapping_ops *ops = get_dma_ops(dev); > if (ops->mapping_error) > return ops->mapping_error(dev, dma_addr); > > - return (dma_addr == bad_dma_address); > #endif > + return (dma_addr == bad_dma_address); > } Surely, 2.6.27.4 needs this fix (and all the stable trees need this too, I think). This can't be cleanly applied to the current git (dma-mapping.h was moved). How about just removing the ifdef? I think that it's clean a bit. diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index 7f225a4..dc22c07 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h @@ -71,15 +71,11 @@ static inline struct dma_mapping_ops *get_dma_ops(struct device *dev) /* Make sure we keep the same behaviour */ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) { -#ifdef CONFIG_X86_32 - return 0; -#else struct dma_mapping_ops *ops = get_dma_ops(dev); if (ops->mapping_error) return ops->mapping_error(dev, dma_addr); return (dma_addr == bad_dma_address); -#endif } #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v3] Fix dma_mapping_error for 32bit x86 2008-11-29 12:46 [PATCH v3] Fix dma_mapping_error for 32bit x86 Thomas Bogendoerfer 2008-11-29 15:13 ` FUJITA Tomonori @ 2008-12-01 11:34 ` Joerg Roedel 2008-12-01 12:01 ` FUJITA Tomonori 1 sibling, 1 reply; 11+ messages in thread From: Joerg Roedel @ 2008-12-01 11:34 UTC (permalink / raw) To: Thomas Bogendoerfer; +Cc: linux-kernel, mingo On Sat, Nov 29, 2008 at 01:46:27PM +0100, Thomas Bogendoerfer wrote: > Devices like b44 ethernet can't dma from addresses above 1GB. The driver > handles this cases by falling back to GFP_DMA allocation. But for detecting > the problem it needs to get an indication from dma_mapping_error. > The bug is triggered by using a VMSPLIT option of 2G/2G. Looks like your system uses swiotlb as the dma_ops backend. Its the only implementation providing the ops->mapping_error callback and does not use bad_dma_address as the error value. > Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Acked-by: Joerg Roedel <joro@8bytes.org> > > diff -ru orig/linux-2.6.27.4/include/asm-x86/dma-mapping.h linux-2.6.27.4/include/asm-x86/dma-mapping.h > --- orig/linux-2.6.27.4/include/asm-x86/dma-mapping.h 2008-10-26 00:05:07.000000000 +0200 > +++ linux-2.6.27.4/include/asm-x86/dma-mapping.h 2008-10-26 11:06:14.000000000 +0100 > @@ -74,15 +74,13 @@ > /* Make sure we keep the same behaviour */ > static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) > { > -#ifdef CONFIG_X86_32 > - return 0; > -#else > +#ifdef CONFIG_X86_64 > struct dma_mapping_ops *ops = get_dma_ops(dev); > if (ops->mapping_error) > return ops->mapping_error(dev, dma_addr); > > - return (dma_addr == bad_dma_address); > #endif > + return (dma_addr == bad_dma_address); > } > > #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3] Fix dma_mapping_error for 32bit x86 2008-12-01 11:34 ` Joerg Roedel @ 2008-12-01 12:01 ` FUJITA Tomonori 2008-12-01 12:55 ` Ingo Molnar 2008-12-01 12:58 ` Joerg Roedel 0 siblings, 2 replies; 11+ messages in thread From: FUJITA Tomonori @ 2008-12-01 12:01 UTC (permalink / raw) To: joro; +Cc: tsbogend, linux-kernel, mingo On Mon, 1 Dec 2008 12:34:51 +0100 Joerg Roedel <joro@8bytes.org> wrote: > On Sat, Nov 29, 2008 at 01:46:27PM +0100, Thomas Bogendoerfer wrote: > > Devices like b44 ethernet can't dma from addresses above 1GB. The driver > > handles this cases by falling back to GFP_DMA allocation. But for detecting > > the problem it needs to get an indication from dma_mapping_error. > > The bug is triggered by using a VMSPLIT option of 2G/2G. > > Looks like your system uses swiotlb as the dma_ops backend. Its the only > implementation providing the ops->mapping_error callback and does not > use bad_dma_address as the error value. I think that you misunderstand the problem. He uses X86_32 so swiotlb should not be used (which is available on only X86_64 and IA64 for now). b44 needs an address under 1GB so it sets device->dma_mask to DMA_30BIT_MASK. With VMSPLIT option of 2G/2G, I guess that b44 could get addresses above 1GB from the networking subsystem. In such case, nommu_map_single returns bad_dma_address properly, but on X86_32, dma_mapping_error always returns 0 (success). So b44 wrongly thinks that the address is under 1GB. This patch fixes dma_mapping_error() to check a passed address properly (compares it with bad_dma_address). As I already wrote, the current git needs a patch modified slightly: http://marc.info/?l=linux-kernel&m=122797163405377&w=2 > > Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de> > > Acked-by: Joerg Roedel <joro@8bytes.org> > > > > > diff -ru orig/linux-2.6.27.4/include/asm-x86/dma-mapping.h linux-2.6.27.4/include/asm-x86/dma-mapping.h > > --- orig/linux-2.6.27.4/include/asm-x86/dma-mapping.h 2008-10-26 00:05:07.000000000 +0200 > > +++ linux-2.6.27.4/include/asm-x86/dma-mapping.h 2008-10-26 11:06:14.000000000 +0100 > > @@ -74,15 +74,13 @@ > > /* Make sure we keep the same behaviour */ > > static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) > > { > > -#ifdef CONFIG_X86_32 > > - return 0; > > -#else > > +#ifdef CONFIG_X86_64 > > struct dma_mapping_ops *ops = get_dma_ops(dev); > > if (ops->mapping_error) > > return ops->mapping_error(dev, dma_addr); > > > > - return (dma_addr == bad_dma_address); > > #endif > > + return (dma_addr == bad_dma_address); > > } > > > > #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > Please read the FAQ at http://www.tux.org/lkml/ > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3] Fix dma_mapping_error for 32bit x86 2008-12-01 12:01 ` FUJITA Tomonori @ 2008-12-01 12:55 ` Ingo Molnar 2008-12-01 14:10 ` FUJITA Tomonori 2008-12-01 12:58 ` Joerg Roedel 1 sibling, 1 reply; 11+ messages in thread From: Ingo Molnar @ 2008-12-01 12:55 UTC (permalink / raw) To: FUJITA Tomonori; +Cc: joro, tsbogend, linux-kernel * FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> wrote: > On Mon, 1 Dec 2008 12:34:51 +0100 > Joerg Roedel <joro@8bytes.org> wrote: > > > On Sat, Nov 29, 2008 at 01:46:27PM +0100, Thomas Bogendoerfer wrote: > > > Devices like b44 ethernet can't dma from addresses above 1GB. The driver > > > handles this cases by falling back to GFP_DMA allocation. But for detecting > > > the problem it needs to get an indication from dma_mapping_error. > > > The bug is triggered by using a VMSPLIT option of 2G/2G. > > > > Looks like your system uses swiotlb as the dma_ops backend. Its the only > > implementation providing the ops->mapping_error callback and does not > > use bad_dma_address as the error value. > > I think that you misunderstand the problem. > > He uses X86_32 so swiotlb should not be used (which is available on > only X86_64 and IA64 for now). > > b44 needs an address under 1GB so it sets device->dma_mask to > DMA_30BIT_MASK. With VMSPLIT option of 2G/2G, I guess that b44 could > get addresses above 1GB from the networking subsystem. In such case, > nommu_map_single returns bad_dma_address properly, but on X86_32, > dma_mapping_error always returns 0 (success). So b44 wrongly thinks > that the address is under 1GB. > > This patch fixes dma_mapping_error() to check a passed address > properly (compares it with bad_dma_address). > > As I already wrote, the current git needs a patch modified slightly: > > http://marc.info/?l=linux-kernel&m=122797163405377&w=2 i have i queued up in x86/urgent, see below. Ingo --------------> >From 7b1dedca42ac0d0d0be01e39d8461bb53a2389b3 Mon Sep 17 00:00:00 2001 From: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Date: Sat, 29 Nov 2008 13:46:27 +0100 Subject: [PATCH] x86: fix dma_mapping_error for 32bit x86 Devices like b44 ethernet can't dma from addresses above 1GB. The driver handles this cases by falling back to GFP_DMA allocation. But for detecting the problem it needs to get an indication from dma_mapping_error. The bug is triggered by using a VMSPLIT option of 2G/2G. Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Acked-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- arch/x86/include/asm/dma-mapping.h | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index 7f225a4..097794f 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h @@ -71,15 +71,13 @@ static inline struct dma_mapping_ops *get_dma_ops(struct device *dev) /* Make sure we keep the same behaviour */ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) { -#ifdef CONFIG_X86_32 - return 0; -#else +#ifdef CONFIG_X86_64 struct dma_mapping_ops *ops = get_dma_ops(dev); if (ops->mapping_error) return ops->mapping_error(dev, dma_addr); - return (dma_addr == bad_dma_address); #endif + return (dma_addr == bad_dma_address); } #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v3] Fix dma_mapping_error for 32bit x86 2008-12-01 12:55 ` Ingo Molnar @ 2008-12-01 14:10 ` FUJITA Tomonori 2008-12-01 14:35 ` Ingo Molnar 0 siblings, 1 reply; 11+ messages in thread From: FUJITA Tomonori @ 2008-12-01 14:10 UTC (permalink / raw) To: mingo; +Cc: fujita.tomonori, joro, tsbogend, linux-kernel On Mon, 1 Dec 2008 13:55:01 +0100 Ingo Molnar <mingo@elte.hu> wrote: > > * FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> wrote: > > > On Mon, 1 Dec 2008 12:34:51 +0100 > > Joerg Roedel <joro@8bytes.org> wrote: > > > > > On Sat, Nov 29, 2008 at 01:46:27PM +0100, Thomas Bogendoerfer wrote: > > > > Devices like b44 ethernet can't dma from addresses above 1GB. The driver > > > > handles this cases by falling back to GFP_DMA allocation. But for detecting > > > > the problem it needs to get an indication from dma_mapping_error. > > > > The bug is triggered by using a VMSPLIT option of 2G/2G. > > > > > > Looks like your system uses swiotlb as the dma_ops backend. Its the only > > > implementation providing the ops->mapping_error callback and does not > > > use bad_dma_address as the error value. > > > > I think that you misunderstand the problem. > > > > He uses X86_32 so swiotlb should not be used (which is available on > > only X86_64 and IA64 for now). > > > > b44 needs an address under 1GB so it sets device->dma_mask to > > DMA_30BIT_MASK. With VMSPLIT option of 2G/2G, I guess that b44 could > > get addresses above 1GB from the networking subsystem. In such case, > > nommu_map_single returns bad_dma_address properly, but on X86_32, > > dma_mapping_error always returns 0 (success). So b44 wrongly thinks > > that the address is under 1GB. > > > > This patch fixes dma_mapping_error() to check a passed address > > properly (compares it with bad_dma_address). > > > > As I already wrote, the current git needs a patch modified slightly: > > > > http://marc.info/?l=linux-kernel&m=122797163405377&w=2 > > i have i queued up in x86/urgent, see below. As I wrote, just removing #ifdef is better since: 1) Xen people want swiotlb on X86_32. swiotlb uses ops->mapping_error so X86_32 also needs to check ops->mapping_error. 2) Removing #ifdef hack is always good. But this patch fixes the bug and it works for now. And I think that Thomas tested it. So it's fine to commit this patch by me. I'll send a patch to remove the ifdef on the top of this patch after this patch goes into mainline. > > --------------> > From 7b1dedca42ac0d0d0be01e39d8461bb53a2389b3 Mon Sep 17 00:00:00 2001 > From: Thomas Bogendoerfer <tsbogend@alpha.franken.de> > Date: Sat, 29 Nov 2008 13:46:27 +0100 > Subject: [PATCH] x86: fix dma_mapping_error for 32bit x86 > > Devices like b44 ethernet can't dma from addresses above 1GB. The driver > handles this cases by falling back to GFP_DMA allocation. But for detecting > the problem it needs to get an indication from dma_mapping_error. > The bug is triggered by using a VMSPLIT option of 2G/2G. > > Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de> > Acked-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> > Signed-off-by: Ingo Molnar <mingo@elte.hu> > --- > arch/x86/include/asm/dma-mapping.h | 6 ++---- > 1 files changed, 2 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h > index 7f225a4..097794f 100644 > --- a/arch/x86/include/asm/dma-mapping.h > +++ b/arch/x86/include/asm/dma-mapping.h > @@ -71,15 +71,13 @@ static inline struct dma_mapping_ops *get_dma_ops(struct device *dev) > /* Make sure we keep the same behaviour */ > static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) > { > -#ifdef CONFIG_X86_32 > - return 0; > -#else > +#ifdef CONFIG_X86_64 > struct dma_mapping_ops *ops = get_dma_ops(dev); > if (ops->mapping_error) > return ops->mapping_error(dev, dma_addr); > > - return (dma_addr == bad_dma_address); > #endif > + return (dma_addr == bad_dma_address); > } > > #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3] Fix dma_mapping_error for 32bit x86 2008-12-01 14:10 ` FUJITA Tomonori @ 2008-12-01 14:35 ` Ingo Molnar 2008-12-01 17:17 ` FUJITA Tomonori 0 siblings, 1 reply; 11+ messages in thread From: Ingo Molnar @ 2008-12-01 14:35 UTC (permalink / raw) To: FUJITA Tomonori; +Cc: joro, tsbogend, linux-kernel * FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> wrote: > On Mon, 1 Dec 2008 13:55:01 +0100 > Ingo Molnar <mingo@elte.hu> wrote: > > > > > * FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> wrote: > > > > > On Mon, 1 Dec 2008 12:34:51 +0100 > > > Joerg Roedel <joro@8bytes.org> wrote: > > > > > > > On Sat, Nov 29, 2008 at 01:46:27PM +0100, Thomas Bogendoerfer wrote: > > > > > Devices like b44 ethernet can't dma from addresses above 1GB. The driver > > > > > handles this cases by falling back to GFP_DMA allocation. But for detecting > > > > > the problem it needs to get an indication from dma_mapping_error. > > > > > The bug is triggered by using a VMSPLIT option of 2G/2G. > > > > > > > > Looks like your system uses swiotlb as the dma_ops backend. Its the only > > > > implementation providing the ops->mapping_error callback and does not > > > > use bad_dma_address as the error value. > > > > > > I think that you misunderstand the problem. > > > > > > He uses X86_32 so swiotlb should not be used (which is available on > > > only X86_64 and IA64 for now). > > > > > > b44 needs an address under 1GB so it sets device->dma_mask to > > > DMA_30BIT_MASK. With VMSPLIT option of 2G/2G, I guess that b44 could > > > get addresses above 1GB from the networking subsystem. In such case, > > > nommu_map_single returns bad_dma_address properly, but on X86_32, > > > dma_mapping_error always returns 0 (success). So b44 wrongly thinks > > > that the address is under 1GB. > > > > > > This patch fixes dma_mapping_error() to check a passed address > > > properly (compares it with bad_dma_address). > > > > > > As I already wrote, the current git needs a patch modified slightly: > > > > > > http://marc.info/?l=linux-kernel&m=122797163405377&w=2 > > > > i have i queued up in x86/urgent, see below. > > As I wrote, just removing #ifdef is better since: > > 1) Xen people want swiotlb on X86_32. swiotlb uses ops->mapping_error > so X86_32 also needs to check ops->mapping_error. > > 2) Removing #ifdef hack is always good. > > > But this patch fixes the bug and it works for now. And I think that > Thomas tested it. So it's fine to commit this patch by me. yeah, i included the tested patch. > I'll send a patch to remove the ifdef on the top of this patch after > this patch goes into mainline. sure - or you can send it against tip/master straight away. Ingo ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3] Fix dma_mapping_error for 32bit x86 2008-12-01 14:35 ` Ingo Molnar @ 2008-12-01 17:17 ` FUJITA Tomonori 2008-12-01 19:36 ` Ingo Molnar 0 siblings, 1 reply; 11+ messages in thread From: FUJITA Tomonori @ 2008-12-01 17:17 UTC (permalink / raw) To: mingo; +Cc: fujita.tomonori, joro, tsbogend, linux-kernel On Mon, 1 Dec 2008 15:35:34 +0100 Ingo Molnar <mingo@elte.hu> wrote: > > * FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> wrote: > > > On Mon, 1 Dec 2008 13:55:01 +0100 > > Ingo Molnar <mingo@elte.hu> wrote: > > > > > > > > * FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> wrote: > > > > > > > On Mon, 1 Dec 2008 12:34:51 +0100 > > > > Joerg Roedel <joro@8bytes.org> wrote: > > > > > > > > > On Sat, Nov 29, 2008 at 01:46:27PM +0100, Thomas Bogendoerfer wrote: > > > > > > Devices like b44 ethernet can't dma from addresses above 1GB. The driver > > > > > > handles this cases by falling back to GFP_DMA allocation. But for detecting > > > > > > the problem it needs to get an indication from dma_mapping_error. > > > > > > The bug is triggered by using a VMSPLIT option of 2G/2G. > > > > > > > > > > Looks like your system uses swiotlb as the dma_ops backend. Its the only > > > > > implementation providing the ops->mapping_error callback and does not > > > > > use bad_dma_address as the error value. > > > > > > > > I think that you misunderstand the problem. > > > > > > > > He uses X86_32 so swiotlb should not be used (which is available on > > > > only X86_64 and IA64 for now). > > > > > > > > b44 needs an address under 1GB so it sets device->dma_mask to > > > > DMA_30BIT_MASK. With VMSPLIT option of 2G/2G, I guess that b44 could > > > > get addresses above 1GB from the networking subsystem. In such case, > > > > nommu_map_single returns bad_dma_address properly, but on X86_32, > > > > dma_mapping_error always returns 0 (success). So b44 wrongly thinks > > > > that the address is under 1GB. > > > > > > > > This patch fixes dma_mapping_error() to check a passed address > > > > properly (compares it with bad_dma_address). > > > > > > > > As I already wrote, the current git needs a patch modified slightly: > > > > > > > > http://marc.info/?l=linux-kernel&m=122797163405377&w=2 > > > > > > i have i queued up in x86/urgent, see below. > > > > As I wrote, just removing #ifdef is better since: > > > > 1) Xen people want swiotlb on X86_32. swiotlb uses ops->mapping_error > > so X86_32 also needs to check ops->mapping_error. > > > > 2) Removing #ifdef hack is always good. > > > > > > But this patch fixes the bug and it works for now. And I think that > > Thomas tested it. So it's fine to commit this patch by me. > > yeah, i included the tested patch. > > > I'll send a patch to remove the ifdef on the top of this patch after > > this patch goes into mainline. > > sure - or you can send it against tip/master straight away. Ok, here you are. Note that this is for 2.6.29 (not 2.6.28). = From: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Subject: [PATCH] x86: remove ifdef CONFIG_X86_64 in dma_mapping_error This removes ifdef CONFIG_X86_64 in dma_mapping_error(): 1) Xen people plan to use swiotlb on X86_32 for Dom0 support. swiotlb uses ops->mapping_error so X86_32 also needs to check ops->mapping_error. 2) Removing #ifdef hack is almost always a good thing. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> --- arch/x86/include/asm/dma-mapping.h | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index ecf8eaf..40d155d 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h @@ -72,12 +72,10 @@ static inline struct dma_mapping_ops *get_dma_ops(struct device *dev) /* Make sure we keep the same behaviour */ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) { -#ifdef CONFIG_X86_64 struct dma_mapping_ops *ops = get_dma_ops(dev); if (ops->mapping_error) return ops->mapping_error(dev, dma_addr); -#endif return (dma_addr == bad_dma_address); } -- 1.5.5.GIT ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v3] Fix dma_mapping_error for 32bit x86 2008-12-01 17:17 ` FUJITA Tomonori @ 2008-12-01 19:36 ` Ingo Molnar 0 siblings, 0 replies; 11+ messages in thread From: Ingo Molnar @ 2008-12-01 19:36 UTC (permalink / raw) To: FUJITA Tomonori; +Cc: joro, tsbogend, linux-kernel * FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> wrote: > On Mon, 1 Dec 2008 15:35:34 +0100 > Ingo Molnar <mingo@elte.hu> wrote: > > > > > * FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> wrote: > > > > > On Mon, 1 Dec 2008 13:55:01 +0100 > > > Ingo Molnar <mingo@elte.hu> wrote: > > > > > > > > > > > * FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> wrote: > > > > > > > > > On Mon, 1 Dec 2008 12:34:51 +0100 > > > > > Joerg Roedel <joro@8bytes.org> wrote: > > > > > > > > > > > On Sat, Nov 29, 2008 at 01:46:27PM +0100, Thomas Bogendoerfer wrote: > > > > > > > Devices like b44 ethernet can't dma from addresses above 1GB. The driver > > > > > > > handles this cases by falling back to GFP_DMA allocation. But for detecting > > > > > > > the problem it needs to get an indication from dma_mapping_error. > > > > > > > The bug is triggered by using a VMSPLIT option of 2G/2G. > > > > > > > > > > > > Looks like your system uses swiotlb as the dma_ops backend. Its the only > > > > > > implementation providing the ops->mapping_error callback and does not > > > > > > use bad_dma_address as the error value. > > > > > > > > > > I think that you misunderstand the problem. > > > > > > > > > > He uses X86_32 so swiotlb should not be used (which is available on > > > > > only X86_64 and IA64 for now). > > > > > > > > > > b44 needs an address under 1GB so it sets device->dma_mask to > > > > > DMA_30BIT_MASK. With VMSPLIT option of 2G/2G, I guess that b44 could > > > > > get addresses above 1GB from the networking subsystem. In such case, > > > > > nommu_map_single returns bad_dma_address properly, but on X86_32, > > > > > dma_mapping_error always returns 0 (success). So b44 wrongly thinks > > > > > that the address is under 1GB. > > > > > > > > > > This patch fixes dma_mapping_error() to check a passed address > > > > > properly (compares it with bad_dma_address). > > > > > > > > > > As I already wrote, the current git needs a patch modified slightly: > > > > > > > > > > http://marc.info/?l=linux-kernel&m=122797163405377&w=2 > > > > > > > > i have i queued up in x86/urgent, see below. > > > > > > As I wrote, just removing #ifdef is better since: > > > > > > 1) Xen people want swiotlb on X86_32. swiotlb uses ops->mapping_error > > > so X86_32 also needs to check ops->mapping_error. > > > > > > 2) Removing #ifdef hack is always good. > > > > > > > > > But this patch fixes the bug and it works for now. And I think that > > > Thomas tested it. So it's fine to commit this patch by me. > > > > yeah, i included the tested patch. > > > > > I'll send a patch to remove the ifdef on the top of this patch after > > > this patch goes into mainline. > > > > sure - or you can send it against tip/master straight away. > > Ok, here you are. > > Note that this is for 2.6.29 (not 2.6.28). thanks, applied to tip/x86/iommu. Ingo ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3] Fix dma_mapping_error for 32bit x86 2008-12-01 12:01 ` FUJITA Tomonori 2008-12-01 12:55 ` Ingo Molnar @ 2008-12-01 12:58 ` Joerg Roedel 2008-12-01 14:10 ` FUJITA Tomonori 1 sibling, 1 reply; 11+ messages in thread From: Joerg Roedel @ 2008-12-01 12:58 UTC (permalink / raw) To: FUJITA Tomonori; +Cc: tsbogend, linux-kernel, mingo On Mon, Dec 01, 2008 at 09:01:06PM +0900, FUJITA Tomonori wrote: > On Mon, 1 Dec 2008 12:34:51 +0100 > Joerg Roedel <joro@8bytes.org> wrote: > > > On Sat, Nov 29, 2008 at 01:46:27PM +0100, Thomas Bogendoerfer wrote: > > > Devices like b44 ethernet can't dma from addresses above 1GB. The driver > > > handles this cases by falling back to GFP_DMA allocation. But for detecting > > > the problem it needs to get an indication from dma_mapping_error. > > > The bug is triggered by using a VMSPLIT option of 2G/2G. > > > > Looks like your system uses swiotlb as the dma_ops backend. Its the only > > implementation providing the ops->mapping_error callback and does not > > use bad_dma_address as the error value. > > I think that you misunderstand the problem. > > He uses X86_32 so swiotlb should not be used (which is available on only > X86_64 and IA64 for now). > > b44 needs an address under 1GB so it sets device->dma_mask to > DMA_30BIT_MASK. With VMSPLIT option of 2G/2G, I guess that b44 could > get addresses above 1GB from the networking subsystem. In such case, > nommu_map_single returns bad_dma_address properly, but on X86_32, > dma_mapping_error always returns 0 (success). So b44 wrongly thinks > that the address is under 1GB. > > This patch fixes dma_mapping_error() to check a passed address > properly (compares it with bad_dma_address). Ah true, thanks. Anyway, the patch also solved the problem with swiotlb on 64bit. Joerg ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3] Fix dma_mapping_error for 32bit x86 2008-12-01 12:58 ` Joerg Roedel @ 2008-12-01 14:10 ` FUJITA Tomonori 0 siblings, 0 replies; 11+ messages in thread From: FUJITA Tomonori @ 2008-12-01 14:10 UTC (permalink / raw) To: joro; +Cc: fujita.tomonori, tsbogend, linux-kernel, mingo On Mon, 1 Dec 2008 13:58:52 +0100 Joerg Roedel <joro@8bytes.org> wrote: > On Mon, Dec 01, 2008 at 09:01:06PM +0900, FUJITA Tomonori wrote: > > On Mon, 1 Dec 2008 12:34:51 +0100 > > Joerg Roedel <joro@8bytes.org> wrote: > > > > > On Sat, Nov 29, 2008 at 01:46:27PM +0100, Thomas Bogendoerfer wrote: > > > > Devices like b44 ethernet can't dma from addresses above 1GB. The driver > > > > handles this cases by falling back to GFP_DMA allocation. But for detecting > > > > the problem it needs to get an indication from dma_mapping_error. > > > > The bug is triggered by using a VMSPLIT option of 2G/2G. > > > > > > Looks like your system uses swiotlb as the dma_ops backend. Its the only > > > implementation providing the ops->mapping_error callback and does not > > > use bad_dma_address as the error value. > > > > I think that you misunderstand the problem. > > > > He uses X86_32 so swiotlb should not be used (which is available on only > > X86_64 and IA64 for now). > > > > b44 needs an address under 1GB so it sets device->dma_mask to > > DMA_30BIT_MASK. With VMSPLIT option of 2G/2G, I guess that b44 could > > get addresses above 1GB from the networking subsystem. In such case, > > nommu_map_single returns bad_dma_address properly, but on X86_32, > > dma_mapping_error always returns 0 (success). So b44 wrongly thinks > > that the address is under 1GB. > > > > This patch fixes dma_mapping_error() to check a passed address > > properly (compares it with bad_dma_address). > > Ah true, thanks. Anyway, the patch also solved the problem with swiotlb > on 64bit. Can you be specific? swiotlb's dma_mapping_error on X86_64 doesn't have any problem as far as I know. ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2008-12-01 19:37 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-11-29 12:46 [PATCH v3] Fix dma_mapping_error for 32bit x86 Thomas Bogendoerfer 2008-11-29 15:13 ` FUJITA Tomonori 2008-12-01 11:34 ` Joerg Roedel 2008-12-01 12:01 ` FUJITA Tomonori 2008-12-01 12:55 ` Ingo Molnar 2008-12-01 14:10 ` FUJITA Tomonori 2008-12-01 14:35 ` Ingo Molnar 2008-12-01 17:17 ` FUJITA Tomonori 2008-12-01 19:36 ` Ingo Molnar 2008-12-01 12:58 ` Joerg Roedel 2008-12-01 14:10 ` FUJITA Tomonori
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox