Fuad Tabba <[email protected]> writes: > > [...snip...] > >> +static bool kvm_gmem_is_safe_for_conversion(struct inode *inode, pgoff_t >> start, >> + size_t nr_pages, pgoff_t >> *err_index) >> +{ >> + struct address_space *mapping = inode->i_mapping; >> + const int filemap_get_folios_refcount = 1; >> + pgoff_t last = start + nr_pages - 1; >> + struct folio_batch fbatch; >> + bool safe = true; >> + int i; >> + >> + folio_batch_init(&fbatch); >> + while (safe && filemap_get_folios(mapping, &start, last, &fbatch)) { >> + >> + for (i = 0; i < folio_batch_count(&fbatch); ++i) { >> + struct folio *folio = fbatch.folios[i]; >> + >> + if (folio_ref_count(folio) != >> + folio_nr_pages(folio) + >> filemap_get_folios_refcount) { >> + safe = false; >> + *err_index = folio->index; >> + break; > > https://sashiko.dev/#/patchset/20260507-gmem-inplace-conversion-v6-0-91ab5a8b19a4%40google.com?part=11 >
Sashiko's first issue on lru is addressed in a separate patch later. :) > Sashiko raised a few issues here, but I think this one might be > genuine. Can you look into it please? > > If that's right, when huge page support lands, if start falls in the > middle of a large folio, returning folio->index as the err_index will > return an offset strictly less than the requested start. A naive > userspace retry loop resuming from error_offset would step backwards > and corrupt attributes on memory it didn't intend to convert. > err_index should be clamped to max(start, folio->index). > For these ones, I was thinking to defer all the huge-page related issues to be fixed when huge pages land, since there are probably quite a few places to update. On second thought, this isn't a huge change, I'll fix this in the next revision. > Cheers, > /fuad > >> + } >> + } >> + >> >> [...snip...] >>
