mm: debug fing_get_pages speculative restart From: Konstantin Khlebnikov Signed-off-by: Konstantin Khlebnikov --- mm/filemap.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mm/filemap.c b/mm/filemap.c index a4a5260..a8cffef 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -815,6 +815,7 @@ unsigned find_get_pages(struct address_space *mapping, pgoff_t start, struct radix_tree_iter iter; void **slot; unsigned ret = 0; + int nr_found = 0; if (unlikely(!nr_pages)) return 0; @@ -846,6 +847,7 @@ repeat: continue; } + nr_found++; if (!page_cache_get_speculative(page)) goto repeat; @@ -861,6 +863,7 @@ repeat: } rcu_read_unlock(); + WARN_ON(!ret && nr_found); return ret; } @@ -882,6 +885,7 @@ unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t index, struct radix_tree_iter iter; void **slot; unsigned int ret = 0; + int nr_found = 0; if (unlikely(!nr_pages)) return 0; @@ -913,6 +917,7 @@ repeat: break; } + nr_found++; if (!page_cache_get_speculative(page)) goto repeat; @@ -937,6 +942,7 @@ repeat: break; } rcu_read_unlock(); + WARN_ON(!ret && nr_found); return ret; } EXPORT_SYMBOL(find_get_pages_contig); @@ -958,6 +964,7 @@ unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index, struct radix_tree_iter iter; void **slot; unsigned ret = 0; + int nr_found = 0; if (unlikely(!nr_pages)) return 0; @@ -988,6 +995,7 @@ repeat: BUG(); } + nr_found++; if (!page_cache_get_speculative(page)) goto repeat; @@ -1007,6 +1015,7 @@ repeat: if (ret) *index = pages[ret - 1]->index + 1; + WARN_ON(!ret && nr_found); return ret; } EXPORT_SYMBOL(find_get_pages_tag);