> +
>  static bool kvm_gmem_has_outstanding_references(struct inode *inode,
>                                               pgoff_t start, size_t nr_pages,
>                                               pgoff_t *err_index)
>  {
> +     enum lru_cache_drained drained = LRU_CACHE_NOT_DRAINED;
>       struct address_space *mapping = inode->i_mapping;
>       pgoff_t last = start + nr_pages - 1;
>       bool has_outstanding = false;
> @@ -570,17 +589,12 @@ static bool kvm_gmem_has_outstanding_references(struct 
> inode *inode,
>       folio_batch_init(&fbatch);
>  
>       next = start;
> -     while (has_outstanding && filemap_get_folios(mapping, &next, last, 
> &fbatch)) {
> +     while (!has_outstanding && filemap_get_folios(mapping, &next, last, 
> &fbatch)) {
>               for (i = 0; i < folio_batch_count(&fbatch); ++i) {
>                       struct folio *folio = fbatch.folios[i];
>  
> -                     /*
> -                      * Outstanding references are anything other than those
> -                      * from the page cache, plus 1 temporary reference held
> -                      * by filemap_get_folios() in the folio batch.
> -                      */
> -                     if (folio_ref_count(folio) != folio_nr_pages(folio) + 
> 1) {
> -                             has_outstanding = true;
> +                     has_outstanding = 
> __folio_has_outstanding_references(folio, &drained);
> +                     if (has_outstanding) {
>                               *err_index = max(start, folio->index);
>                               break;
>                       }
> 

Having the folio.c bits go upstream early is certainly cleaner; without Hugh's
series an ack from MM maintainers would have been sufficient, though.

In any case, on the revised patch with only guest_memfd changes:

Reviewed-by: David Hildenbrand (Arm) <[email protected]>

-- 
Cheers,

David

Reply via email to