Anyway, I don't see a reason why we can't convert those locks to
mutexes and get rid of the whole preempt disabled region.
If someone is willing to audit all code paths to make sure these locks are always taken in schedulable context I agree that's a better fix.
/*...
* Lock ordering in mm:
*
* inode->i_mutex (while writing or truncating, not reading or faulting)
* inode->i_alloc_sem (vmtruncate_range)
* mm->mmap_sem
* page->flags PG_locked (lock_page)
* mapping->i_mmap_lock
* anon_vma->lock
*
* (code doesn't rely on that order so it could be switched around)
* ->tasklist_lock
* anon_vma->lock (memory_failure, collect_procs_anon)
* pte map lock
*/