On Thu, 9 Nov 2023 01:12:15 +0100 Andreas Grünbacher <andreas.gruenbacher@xxxxxxxxx> wrote: > Andrew, > > Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> schrieb am Do., 9. Nov. 2023, 00:06: > > > + > > > + if (folio_test_highmem(folio)) { > > > + size_t max = PAGE_SIZE - offset_in_page(offset); > > > + > > > + while (len > max) { > > > > Shouldn't this be `while (len)'? AFAICT this code can fail to clear > > the final page. > > not sure what you're seeing there, but this looks fine to me. I was right! This code does fail to handle the final page. : static inline void folio_fill_tail(struct folio *folio, size_t offset, : const char *from, size_t len) : { : char *to = kmap_local_folio(folio, offset); : : VM_BUG_ON(offset + len > folio_size(folio)); : : if (folio_test_highmem(folio)) { : size_t max = PAGE_SIZE - offset_in_page(offset); : : while (len > max) { : memcpy(to, from, max); : kunmap_local(to); : len -= max; : from += max; : offset += max; : max = PAGE_SIZE; : to = kmap_local_folio(folio, offset); : } : } : : memcpy(to, from, len); This code down here handles it, doh. : to = folio_zero_tail(folio, offset, to); : kunmap_local(to); : } Implementation seems less straightforward than it might be? Oh well. Has it been runtime tested? Anyway, let's please change the function argument ordering and remember to cc linux-mm on v2?