The found entries by find_get_pages() could be all swap entries. In this case we skip the entries, but make sure the skipped entries are accounted, so we don't keep looping. Using nr_found > nr_skip to simplify code as suggested by Eric.
Unified · Split
| @@ -827,13 +827,14 @@ unsigned find_get_pages(struct address_space *mapping, pgoff_t start, · 826 unmodified lines | ||
| 827 | 827 | { |
| 828 | 828 | unsigned int i; |
| 829 | 829 | unsigned int ret; |
| 830 | − unsigned int nr_found; | |
| 830 | + unsigned int nr_found, nr_skip; | |
| 831 | 831 | |
| 832 | 832 | rcu_read_lock(); |
| 833 | 833 | restart: |
| 834 | 834 | nr_found = radix_tree_gang_lookup_slot(&mapping->page_tree, |
| 835 | 835 | (void ***)pages, NULL, start, nr_pages); |
| 836 | 836 | ret = 0; |
| 837 | + nr_skip = 0; | |
| 837 | 838 | for (i = 0; i < nr_found; i++) { |
| 838 | 839 | struct page *page; |
| 839 | 840 | repeat: |
| @@ -856,6 +857,7 @@ repeat: · 16 unmodified lines | ||
| 856 | 857 | * here as an exceptional entry: so skip over it - |
| 857 | 858 | * we only reach this from invalidate_mapping_pages(). |
| 858 | 859 | */ |
| 860 | + nr_skip++; | |
| 859 | 861 | continue; |
| 860 | 862 | } |
| 861 | 863 | |
| @@ -876,7 +878,7 @@ repeat: · 14 unmodified lines | ||
| 876 | 878 | * If all entries were removed before we could secure them, |
| 877 | 879 | * try again, because callers stop trying once 0 is returned. |
| 878 | 880 | */ |
| 879 | − if (unlikely(!ret && nr_found)) | |
| 881 | + if (unlikely(!ret && nr_found > nr_skip)) | |
| 880 | 882 | goto restart; |
| 881 | 883 | rcu_read_unlock(); |
| 882 | 884 | return ret; |