public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [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: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: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 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

* 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

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