On Mon, Mar 7, 2022 at 2:52 PM Andreas Gruenbacher <agruenba@xxxxxxxxxx> wrote: > > After generic_file_read_iter() returns a short or empty read, we fault > in some pages with fault_in_iov_iter_writeable(). This succeeds, but > the next call to generic_file_read_iter() returns -EFAULT and we're > not making any progress. Since this is s390-specific, I get the very strong feeling that the fault_in_iov_iter_writeable -> fault_in_safe_writeable -> __get_user_pages_locked -> __get_user_pages path somehow successfully finds the page, despite it not being properly accessible in the page tables. And it's presumably something specific in the s390x page table functionality that makes that happen. The places I'd look at in particular is to make sure that follow_page_mask() actually has the same rules as a real page table lookup on s390x. IOW, if follow_page_mask() finds the page and thinks it's writable, then it will return a 'page' successfully, and the __get_user_pages() code will be happy and say "it's there". But if then accessing the page by trying to write to it using the virtual address fails despite that, then you'll get the behavior you describe. I'd take a look at that can_follow_write_pte() case in particular, since this is a FOLL_WRITE thing, but it could be any of the pte checking details. Have you tried tracing through that path? Linus