| Submitter | Michael Ellerman |
|---|---|
| Date | June 23, 2009, 9:13 a.m. |
| Message ID | <1245748428.4550.411.camel@concordia> |
| Download | mbox | patch |
| Permalink | /patch/29051/ |
| State | Accepted |
| Commit | 6f0b1c6094b3e8eeeb13f8f16c1b2ef452a6f519 |
| Delegated to: | Benjamin Herrenschmidt |
| Headers | show |
Comments
On Tue, 2009-06-23 at 19:13 +1000, Michael Ellerman wrote: > Hi all, > > Turning on SWIOTLB selects or enables PPC_NEED_DMA_SYNC_OPS, which means > we get the non empty versions of dma_sync_* in asm/dma-mapping.h > > On my pseries machine the dma_ops have no such routines and we die with > a null pointer - this patch gets it booting, is there a more elegant way > to do it? No that's the best way (checking for NULL in the inlines), avoids calling through a function pointer when not needed, since this can be a fairly hot path, especially with networking. Cheers, Ben. > cheers > > diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h > index 3d9e887..b44aaab 100644 > --- a/arch/powerpc/include/asm/dma-mapping.h > +++ b/arch/powerpc/include/asm/dma-mapping.h > @@ -309,7 +309,9 @@ static inline void dma_sync_single_for_cpu(struct device *dev, > struct dma_mapping_ops *dma_ops = get_dma_ops(dev); > > BUG_ON(!dma_ops); > - dma_ops->sync_single_range_for_cpu(dev, dma_handle, 0, > + > + if (dma_ops->sync_single_range_for_cpu) > + dma_ops->sync_single_range_for_cpu(dev, dma_handle, 0, > size, direction); > } > > @@ -320,7 +322,9 @@ static inline void dma_sync_single_for_device(struct device *dev, > struct dma_mapping_ops *dma_ops = get_dma_ops(dev); > > BUG_ON(!dma_ops); > - dma_ops->sync_single_range_for_device(dev, dma_handle, > + > + if (dma_ops->sync_single_range_for_device) > + dma_ops->sync_single_range_for_device(dev, dma_handle, > 0, size, direction); > } > > @@ -331,7 +335,9 @@ static inline void dma_sync_sg_for_cpu(struct device *dev, > struct dma_mapping_ops *dma_ops = get_dma_ops(dev); > > BUG_ON(!dma_ops); > - dma_ops->sync_sg_for_cpu(dev, sgl, nents, direction); > + > + if (dma_ops->sync_sg_for_cpu) > + dma_ops->sync_sg_for_cpu(dev, sgl, nents, direction); > } > > static inline void dma_sync_sg_for_device(struct device *dev, > @@ -341,7 +347,9 @@ static inline void dma_sync_sg_for_device(struct device *dev, > struct dma_mapping_ops *dma_ops = get_dma_ops(dev); > > BUG_ON(!dma_ops); > - dma_ops->sync_sg_for_device(dev, sgl, nents, direction); > + > + if (dma_ops->sync_sg_for_device) > + dma_ops->sync_sg_for_device(dev, sgl, nents, direction); > } > > static inline void dma_sync_single_range_for_cpu(struct device *dev, > @@ -351,7 +359,9 @@ static inline void dma_sync_single_range_for_cpu(struct device *dev, > struct dma_mapping_ops *dma_ops = get_dma_ops(dev); > > BUG_ON(!dma_ops); > - dma_ops->sync_single_range_for_cpu(dev, dma_handle, > + > + if (dma_ops->sync_single_range_for_cpu) > + dma_ops->sync_single_range_for_cpu(dev, dma_handle, > offset, size, direction); > } > > @@ -362,7 +372,9 @@ static inline void dma_sync_single_range_for_device(struct device *dev, > struct dma_mapping_ops *dma_ops = get_dma_ops(dev); > > BUG_ON(!dma_ops); > - dma_ops->sync_single_range_for_device(dev, dma_handle, offset, > + > + if (dma_ops->sync_single_range_for_device) > + dma_ops->sync_single_range_for_device(dev, dma_handle, offset, > size, direction); > } > #else /* CONFIG_PPC_NEED_DMA_SYNC_OPS */
Patch
diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h index 3d9e887..b44aaab 100644 --- a/arch/powerpc/include/asm/dma-mapping.h +++ b/arch/powerpc/include/asm/dma-mapping.h @@ -309,7 +309,9 @@ static inline void dma_sync_single_for_cpu(struct device *dev, struct dma_mapping_ops *dma_ops = get_dma_ops(dev); BUG_ON(!dma_ops); - dma_ops->sync_single_range_for_cpu(dev, dma_handle, 0, + + if (dma_ops->sync_single_range_for_cpu) + dma_ops->sync_single_range_for_cpu(dev, dma_handle, 0, size, direction); } @@ -320,7 +322,9 @@ static inline void dma_sync_single_for_device(struct device *dev, struct dma_mapping_ops *dma_ops = get_dma_ops(dev); BUG_ON(!dma_ops); - dma_ops->sync_single_range_for_device(dev, dma_handle, + + if (dma_ops->sync_single_range_for_device) + dma_ops->sync_single_range_for_device(dev, dma_handle, 0, size, direction); } @@ -331,7 +335,9 @@ static inline void dma_sync_sg_for_cpu(struct device *dev, struct dma_mapping_ops *dma_ops = get_dma_ops(dev); BUG_ON(!dma_ops); - dma_ops->sync_sg_for_cpu(dev, sgl, nents, direction); + + if (dma_ops->sync_sg_for_cpu) + dma_ops->sync_sg_for_cpu(dev, sgl, nents, direction); } static inline void dma_sync_sg_for_device(struct device *dev, @@ -341,7 +347,9 @@ static inline void dma_sync_sg_for_device(struct device *dev, struct dma_mapping_ops *dma_ops = get_dma_ops(dev); BUG_ON(!dma_ops); - dma_ops->sync_sg_for_device(dev, sgl, nents, direction); + + if (dma_ops->sync_sg_for_device) + dma_ops->sync_sg_for_device(dev, sgl, nents, direction); } static inline void dma_sync_single_range_for_cpu(struct device *dev, @@ -351,7 +359,9 @@ static inline void dma_sync_single_range_for_cpu(struct device *dev, struct dma_mapping_ops *dma_ops = get_dma_ops(dev); BUG_ON(!dma_ops); - dma_ops->sync_single_range_for_cpu(dev, dma_handle, + + if (dma_ops->sync_single_range_for_cpu) + dma_ops->sync_single_range_for_cpu(dev, dma_handle, offset, size, direction); } @@ -362,7 +372,9 @@ static inline void dma_sync_single_range_for_device(struct device *dev, struct dma_mapping_ops *dma_ops = get_dma_ops(dev); BUG_ON(!dma_ops); - dma_ops->sync_single_range_for_device(dev, dma_handle, offset, + + if (dma_ops->sync_single_range_for_device) + dma_ops->sync_single_range_for_device(dev, dma_handle, offset, size, direction); } #else /* CONFIG_PPC_NEED_DMA_SYNC_OPS */