diff options
Diffstat (limited to 'mm/filemap.c')
| -rw-r--r-- | mm/filemap.c | 50 | 
1 files changed, 28 insertions, 22 deletions
| diff --git a/mm/filemap.c b/mm/filemap.c index a82fbe4c9e8e..000a220e2a41 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -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)) @@ -2581,7 +2588,6 @@ EXPORT_SYMBOL(generic_perform_write);   * @iocb:	IO state structure (file, offset, etc.)   * @iov:	vector with data to write   * @nr_segs:	number of segments in the vector - * @ppos:	position where to write   *   * This function does all the work needed for actually writing data to a   * file. It does all basic checks, removes SUID from the file, updates |