On Mon, Jul 10, 2023 at 04:43:35PM -0700, Luis Chamberlain wrote: > > - } > > - iterate_and_advance(i, bytes, base, len, off, > > - copyin(p + off, base, len), > > - memcpy_from_iter(i, p + off, base, len) > > - ) > > - kunmap_atomic(kaddr); > > - return bytes; > > + > > + do { > > + char *p; > > + > > + n = bytes - copied; > > + if (PageHighMem(page)) { > > + page += offset / PAGE_SIZE; > > I don't quite follow here how before the page was not modified > to get to the first kmap_atomic(page) and now immediately if we're > on a PageHighMem(page) we're doing some arithmetic to the page > address to get the first kmap_atomic(). The only thing I could > think of is seems like an implicit assumption here that if its a compound > highmem page then we always start off with offset with a value of > 0, is that right? But that seems to not be correct either. The important thing to know is that it was buggy before. If you called copy_page_from_iter_atomic() with an offset larger than PAGE_SIZE, it corrupted random memory! I can only assume that nobody was doing that.