Thx Arnd, On Tue, Jul 30, 2019 at 9:29 PM Arnd Bergmann <arnd@xxxxxxxx> wrote: > > On Tue, Jul 30, 2019 at 2:15 PM <guoren@xxxxxxxxxx> wrote: > > > > From: Guo Ren <ren_guo@xxxxxxxxx> > > > > If arch didn't define dma_r/wmb(), linux will use w/rmb instead. Csky > > use bar.xxx to implement mb() and that will cause problem when sync data > > with dma device, becasue bar.xxx couldn't guarantee bus transactions > > finished at outside bus level. We must use sync.s instead of bar.xxx for > > dma data synchronization and it will guarantee retirement after getting > > the bus bresponse. > > > > Signed-off-by: Guo Ren <ren_guo@xxxxxxxxx> > > This change looks good to me, but I think your regular barriers > (mb, rmb, wmb) are still wrong: These are meant to be the superset > of dma_{r,w}mb and smp_{,r,w}mb, and synchronize > against both SMP and DMA interactions. Wow, thanks for correction, yes! mb, rmb, wmb is the superset of dma and smp, and I should use sync.s for mb. I check the arm64, it use dsb for mb and dmb for smp_mb and dma_mb. I also check the drivers, you are right , a lot of them use mb() to sync mem data with device. > > I suspect you can drop the '.s' for non-SMP builds. What I don't > see is whether you might need to add '.i' for dma_wmb() or > dma_rmb(). It's no need for sky, when there is non-SMP, the cpu is in reset mode, and sync.s is equal to sync in efficient. -- Best Regards Guo Ren ML: https://lore.kernel.org/linux-csky/