On Mon, Jul 19, 2021 at 01:38:51PM +0800, Herbert Xu wrote: > Russell King Oracle <linux@xxxxxxxxxxxxxxx> wrote: > > > > I think you need to be careful - I seem to have a recollection that the > > reason we ended up with flush_kernel_dcache_page() was the need to avoid > > the taking of the mmap lock for 32-bit ARM VIVT based CPUs in > > flush_dcache_page(). 32-bit ARM flush_dcache_page() can block. > > > > If you're sure that all these changes you're making do not end up > > calling flush_dcache_page() from a path where we are atomic, then fine. > > The Crypto API has been calling flush_dcache_page from softirq > context since before the advent of git (see crypto/scatterwalk.c > from the initial import). So if 32-bit ARM blocks on it then this > has been broken for almost 20 years. I think what's confusing me is the naming of flush_dcache_mmap_lock(). The mmap lock is a read-write semaphore (see linux/mmap-lock.h), and is even called "mmap_lock" in mm_struct, but this has nothing to do with flush_dcache_mmap_lock(). So no, flush_dcache_mmap_lock() doesn't block as I first thought, and therefore flush_dcache_page() doesn't block either. Sorry for the noise. However, I now seem to remember some discussion in the past when I was trying to get people to use flush_dcache_page() to solve the coherency problems when block drivers were doing PIO to page cache pages. I seem to remember there being objections to it, which is one of the reasons we ended up with a lighter weight flush_kernel_dcache_page(). But shrug, dim and distant memories. -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!