|
@@ -1255,7 +1255,6 @@ unsigned find_get_entries(struct address_space *mapping,
|
|
|
return 0;
|
|
|
|
|
|
rcu_read_lock();
|
|
|
-restart:
|
|
|
radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) {
|
|
|
struct page *page;
|
|
|
repeat:
|
|
@@ -1263,8 +1262,10 @@ repeat:
|
|
|
if (unlikely(!page))
|
|
|
continue;
|
|
|
if (radix_tree_exception(page)) {
|
|
|
- if (radix_tree_deref_retry(page))
|
|
|
- goto restart;
|
|
|
+ if (radix_tree_deref_retry(page)) {
|
|
|
+ slot = radix_tree_iter_retry(&iter);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
/*
|
|
|
* A shadow entry of a recently evicted page, a swap
|
|
|
* entry from shmem/tmpfs or a DAX entry. Return it
|
|
@@ -1317,7 +1318,6 @@ unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
|
|
|
return 0;
|
|
|
|
|
|
rcu_read_lock();
|
|
|
-restart:
|
|
|
radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) {
|
|
|
struct page *page;
|
|
|
repeat:
|
|
@@ -1327,13 +1327,8 @@ repeat:
|
|
|
|
|
|
if (radix_tree_exception(page)) {
|
|
|
if (radix_tree_deref_retry(page)) {
|
|
|
- /*
|
|
|
- * Transient condition which can only trigger
|
|
|
- * when entry at index 0 moves out of or back
|
|
|
- * to root: none yet gotten, safe to restart.
|
|
|
- */
|
|
|
- WARN_ON(iter.index);
|
|
|
- goto restart;
|
|
|
+ slot = radix_tree_iter_retry(&iter);
|
|
|
+ continue;
|
|
|
}
|
|
|
/*
|
|
|
* A shadow entry of a recently evicted page,
|
|
@@ -1384,7 +1379,6 @@ unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t index,
|
|
|
return 0;
|
|
|
|
|
|
rcu_read_lock();
|
|
|
-restart:
|
|
|
radix_tree_for_each_contig(slot, &mapping->page_tree, &iter, index) {
|
|
|
struct page *page;
|
|
|
repeat:
|
|
@@ -1395,12 +1389,8 @@ repeat:
|
|
|
|
|
|
if (radix_tree_exception(page)) {
|
|
|
if (radix_tree_deref_retry(page)) {
|
|
|
- /*
|
|
|
- * Transient condition which can only trigger
|
|
|
- * when entry at index 0 moves out of or back
|
|
|
- * to root: none yet gotten, safe to restart.
|
|
|
- */
|
|
|
- goto restart;
|
|
|
+ slot = radix_tree_iter_retry(&iter);
|
|
|
+ continue;
|
|
|
}
|
|
|
/*
|
|
|
* A shadow entry of a recently evicted page,
|
|
@@ -1460,7 +1450,6 @@ unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
|
|
|
return 0;
|
|
|
|
|
|
rcu_read_lock();
|
|
|
-restart:
|
|
|
radix_tree_for_each_tagged(slot, &mapping->page_tree,
|
|
|
&iter, *index, tag) {
|
|
|
struct page *page;
|
|
@@ -1471,12 +1460,8 @@ repeat:
|
|
|
|
|
|
if (radix_tree_exception(page)) {
|
|
|
if (radix_tree_deref_retry(page)) {
|
|
|
- /*
|
|
|
- * Transient condition which can only trigger
|
|
|
- * when entry at index 0 moves out of or back
|
|
|
- * to root: none yet gotten, safe to restart.
|
|
|
- */
|
|
|
- goto restart;
|
|
|
+ slot = radix_tree_iter_retry(&iter);
|
|
|
+ continue;
|
|
|
}
|
|
|
/*
|
|
|
* A shadow entry of a recently evicted page.
|
|
@@ -1539,7 +1524,6 @@ unsigned find_get_entries_tag(struct address_space *mapping, pgoff_t start,
|
|
|
return 0;
|
|
|
|
|
|
rcu_read_lock();
|
|
|
-restart:
|
|
|
radix_tree_for_each_tagged(slot, &mapping->page_tree,
|
|
|
&iter, start, tag) {
|
|
|
struct page *page;
|
|
@@ -1549,12 +1533,8 @@ repeat:
|
|
|
continue;
|
|
|
if (radix_tree_exception(page)) {
|
|
|
if (radix_tree_deref_retry(page)) {
|
|
|
- /*
|
|
|
- * Transient condition which can only trigger
|
|
|
- * when entry at index 0 moves out of or back
|
|
|
- * to root: none yet gotten, safe to restart.
|
|
|
- */
|
|
|
- goto restart;
|
|
|
+ slot = radix_tree_iter_retry(&iter);
|
|
|
+ continue;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -2171,10 +2151,11 @@ repeat:
|
|
|
if (unlikely(!page))
|
|
|
goto next;
|
|
|
if (radix_tree_exception(page)) {
|
|
|
- if (radix_tree_deref_retry(page))
|
|
|
- break;
|
|
|
- else
|
|
|
- goto next;
|
|
|
+ if (radix_tree_deref_retry(page)) {
|
|
|
+ slot = radix_tree_iter_retry(&iter);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ goto next;
|
|
|
}
|
|
|
|
|
|
if (!page_cache_get_speculative(page))
|