|
@@ -906,8 +906,8 @@ EXPORT_SYMBOL(page_cache_prev_hole);
|
|
|
* Looks up the page cache slot at @mapping & @offset. If there is a
|
|
|
* page cache page, it is returned with an increased refcount.
|
|
|
*
|
|
|
- * If the slot holds a shadow entry of a previously evicted page, it
|
|
|
- * is returned.
|
|
|
+ * If the slot holds a shadow entry of a previously evicted page, or a
|
|
|
+ * swap entry from shmem/tmpfs, it is returned.
|
|
|
*
|
|
|
* Otherwise, %NULL is returned.
|
|
|
*/
|
|
@@ -928,9 +928,9 @@ repeat:
|
|
|
if (radix_tree_deref_retry(page))
|
|
|
goto repeat;
|
|
|
/*
|
|
|
- * Otherwise, shmem/tmpfs must be storing a swap entry
|
|
|
- * here as an exceptional entry: so return it without
|
|
|
- * attempting to raise page count.
|
|
|
+ * A shadow entry of a recently evicted page,
|
|
|
+ * or a swap entry from shmem/tmpfs. Return
|
|
|
+ * it without attempting to raise page count.
|
|
|
*/
|
|
|
goto out;
|
|
|
}
|
|
@@ -983,8 +983,8 @@ EXPORT_SYMBOL(find_get_page);
|
|
|
* page cache page, it is returned locked and with an increased
|
|
|
* refcount.
|
|
|
*
|
|
|
- * If the slot holds a shadow entry of a previously evicted page, it
|
|
|
- * is returned.
|
|
|
+ * If the slot holds a shadow entry of a previously evicted page, or a
|
|
|
+ * swap entry from shmem/tmpfs, it is returned.
|
|
|
*
|
|
|
* Otherwise, %NULL is returned.
|
|
|
*
|
|
@@ -1099,8 +1099,8 @@ EXPORT_SYMBOL(find_or_create_page);
|
|
|
* with ascending indexes. There may be holes in the indices due to
|
|
|
* not-present pages.
|
|
|
*
|
|
|
- * Any shadow entries of evicted pages are included in the returned
|
|
|
- * array.
|
|
|
+ * Any shadow entries of evicted pages, or swap entries from
|
|
|
+ * shmem/tmpfs, are included in the returned array.
|
|
|
*
|
|
|
* find_get_entries() returns the number of pages and shadow entries
|
|
|
* which were found.
|
|
@@ -1128,9 +1128,9 @@ repeat:
|
|
|
if (radix_tree_deref_retry(page))
|
|
|
goto restart;
|
|
|
/*
|
|
|
- * Otherwise, we must be storing a swap entry
|
|
|
- * here as an exceptional entry: so return it
|
|
|
- * without attempting to raise page count.
|
|
|
+ * A shadow entry of a recently evicted page,
|
|
|
+ * or a swap entry from shmem/tmpfs. Return
|
|
|
+ * it without attempting to raise page count.
|
|
|
*/
|
|
|
goto export;
|
|
|
}
|
|
@@ -1198,9 +1198,9 @@ repeat:
|
|
|
goto restart;
|
|
|
}
|
|
|
/*
|
|
|
- * Otherwise, shmem/tmpfs must be storing a swap entry
|
|
|
- * here as an exceptional entry: so skip over it -
|
|
|
- * we only reach this from invalidate_mapping_pages().
|
|
|
+ * A shadow entry of a recently evicted page,
|
|
|
+ * or a swap entry from shmem/tmpfs. Skip
|
|
|
+ * over it.
|
|
|
*/
|
|
|
continue;
|
|
|
}
|
|
@@ -1265,9 +1265,9 @@ repeat:
|
|
|
goto restart;
|
|
|
}
|
|
|
/*
|
|
|
- * Otherwise, shmem/tmpfs must be storing a swap entry
|
|
|
- * here as an exceptional entry: so stop looking for
|
|
|
- * contiguous pages.
|
|
|
+ * A shadow entry of a recently evicted page,
|
|
|
+ * or a swap entry from shmem/tmpfs. Stop
|
|
|
+ * looking for contiguous pages.
|
|
|
*/
|
|
|
break;
|
|
|
}
|
|
@@ -1341,10 +1341,17 @@ repeat:
|
|
|
goto restart;
|
|
|
}
|
|
|
/*
|
|
|
- * This function is never used on a shmem/tmpfs
|
|
|
- * mapping, so a swap entry won't be found here.
|
|
|
+ * A shadow entry of a recently evicted page.
|
|
|
+ *
|
|
|
+ * Those entries should never be tagged, but
|
|
|
+ * this tree walk is lockless and the tags are
|
|
|
+ * looked up in bulk, one radix tree node at a
|
|
|
+ * time, so there is a sizable window for page
|
|
|
+ * reclaim to evict a page we saw tagged.
|
|
|
+ *
|
|
|
+ * Skip over it.
|
|
|
*/
|
|
|
- BUG();
|
|
|
+ continue;
|
|
|
}
|
|
|
|
|
|
if (!page_cache_get_speculative(page))
|