filemap.c (e61452365372570253b2b1de84bab0cdb2e62c64) | filemap.c (2cf938aae17203426a89b5955bd1c9668657bfa8) |
---|---|
1/* 2 * linux/mm/filemap.c 3 * 4 * Copyright (C) 1994-1999 Linus Torvalds 5 */ 6 7/* 8 * This file handles the generic file mmap semantics used by --- 1241 unchanged lines hidden (view full) --- 1250 void **slot; 1251 unsigned int ret = 0; 1252 struct radix_tree_iter iter; 1253 1254 if (!nr_entries) 1255 return 0; 1256 1257 rcu_read_lock(); | 1/* 2 * linux/mm/filemap.c 3 * 4 * Copyright (C) 1994-1999 Linus Torvalds 5 */ 6 7/* 8 * This file handles the generic file mmap semantics used by --- 1241 unchanged lines hidden (view full) --- 1250 void **slot; 1251 unsigned int ret = 0; 1252 struct radix_tree_iter iter; 1253 1254 if (!nr_entries) 1255 return 0; 1256 1257 rcu_read_lock(); |
1258restart: | |
1259 radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) { 1260 struct page *page; 1261repeat: 1262 page = radix_tree_deref_slot(slot); 1263 if (unlikely(!page)) 1264 continue; 1265 if (radix_tree_exception(page)) { | 1258 radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) { 1259 struct page *page; 1260repeat: 1261 page = radix_tree_deref_slot(slot); 1262 if (unlikely(!page)) 1263 continue; 1264 if (radix_tree_exception(page)) { |
1266 if (radix_tree_deref_retry(page)) 1267 goto restart; | 1265 if (radix_tree_deref_retry(page)) { 1266 slot = radix_tree_iter_retry(&iter); 1267 continue; 1268 } |
1268 /* 1269 * A shadow entry of a recently evicted page, a swap 1270 * entry from shmem/tmpfs or a DAX entry. Return it 1271 * without attempting to raise page count. 1272 */ 1273 goto export; 1274 } 1275 if (!page_cache_get_speculative(page)) --- 36 unchanged lines hidden (view full) --- 1312 struct radix_tree_iter iter; 1313 void **slot; 1314 unsigned ret = 0; 1315 1316 if (unlikely(!nr_pages)) 1317 return 0; 1318 1319 rcu_read_lock(); | 1269 /* 1270 * A shadow entry of a recently evicted page, a swap 1271 * entry from shmem/tmpfs or a DAX entry. Return it 1272 * without attempting to raise page count. 1273 */ 1274 goto export; 1275 } 1276 if (!page_cache_get_speculative(page)) --- 36 unchanged lines hidden (view full) --- 1313 struct radix_tree_iter iter; 1314 void **slot; 1315 unsigned ret = 0; 1316 1317 if (unlikely(!nr_pages)) 1318 return 0; 1319 1320 rcu_read_lock(); |
1320restart: | |
1321 radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) { 1322 struct page *page; 1323repeat: 1324 page = radix_tree_deref_slot(slot); 1325 if (unlikely(!page)) 1326 continue; 1327 1328 if (radix_tree_exception(page)) { 1329 if (radix_tree_deref_retry(page)) { | 1321 radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) { 1322 struct page *page; 1323repeat: 1324 page = radix_tree_deref_slot(slot); 1325 if (unlikely(!page)) 1326 continue; 1327 1328 if (radix_tree_exception(page)) { 1329 if (radix_tree_deref_retry(page)) { |
1330 /* 1331 * Transient condition which can only trigger 1332 * when entry at index 0 moves out of or back 1333 * to root: none yet gotten, safe to restart. 1334 */ 1335 WARN_ON(iter.index); 1336 goto restart; | 1330 slot = radix_tree_iter_retry(&iter); 1331 continue; |
1337 } 1338 /* 1339 * A shadow entry of a recently evicted page, 1340 * or a swap entry from shmem/tmpfs. Skip 1341 * over it. 1342 */ 1343 continue; 1344 } --- 34 unchanged lines hidden (view full) --- 1379 struct radix_tree_iter iter; 1380 void **slot; 1381 unsigned int ret = 0; 1382 1383 if (unlikely(!nr_pages)) 1384 return 0; 1385 1386 rcu_read_lock(); | 1332 } 1333 /* 1334 * A shadow entry of a recently evicted page, 1335 * or a swap entry from shmem/tmpfs. Skip 1336 * over it. 1337 */ 1338 continue; 1339 } --- 34 unchanged lines hidden (view full) --- 1374 struct radix_tree_iter iter; 1375 void **slot; 1376 unsigned int ret = 0; 1377 1378 if (unlikely(!nr_pages)) 1379 return 0; 1380 1381 rcu_read_lock(); |
1387restart: | |
1388 radix_tree_for_each_contig(slot, &mapping->page_tree, &iter, index) { 1389 struct page *page; 1390repeat: 1391 page = radix_tree_deref_slot(slot); 1392 /* The hole, there no reason to continue */ 1393 if (unlikely(!page)) 1394 break; 1395 1396 if (radix_tree_exception(page)) { 1397 if (radix_tree_deref_retry(page)) { | 1382 radix_tree_for_each_contig(slot, &mapping->page_tree, &iter, index) { 1383 struct page *page; 1384repeat: 1385 page = radix_tree_deref_slot(slot); 1386 /* The hole, there no reason to continue */ 1387 if (unlikely(!page)) 1388 break; 1389 1390 if (radix_tree_exception(page)) { 1391 if (radix_tree_deref_retry(page)) { |
1398 /* 1399 * Transient condition which can only trigger 1400 * when entry at index 0 moves out of or back 1401 * to root: none yet gotten, safe to restart. 1402 */ 1403 goto restart; | 1392 slot = radix_tree_iter_retry(&iter); 1393 continue; |
1404 } 1405 /* 1406 * A shadow entry of a recently evicted page, 1407 * or a swap entry from shmem/tmpfs. Stop 1408 * looking for contiguous pages. 1409 */ 1410 break; 1411 } --- 43 unchanged lines hidden (view full) --- 1455 struct radix_tree_iter iter; 1456 void **slot; 1457 unsigned ret = 0; 1458 1459 if (unlikely(!nr_pages)) 1460 return 0; 1461 1462 rcu_read_lock(); | 1394 } 1395 /* 1396 * A shadow entry of a recently evicted page, 1397 * or a swap entry from shmem/tmpfs. Stop 1398 * looking for contiguous pages. 1399 */ 1400 break; 1401 } --- 43 unchanged lines hidden (view full) --- 1445 struct radix_tree_iter iter; 1446 void **slot; 1447 unsigned ret = 0; 1448 1449 if (unlikely(!nr_pages)) 1450 return 0; 1451 1452 rcu_read_lock(); |
1463restart: | |
1464 radix_tree_for_each_tagged(slot, &mapping->page_tree, 1465 &iter, *index, tag) { 1466 struct page *page; 1467repeat: 1468 page = radix_tree_deref_slot(slot); 1469 if (unlikely(!page)) 1470 continue; 1471 1472 if (radix_tree_exception(page)) { 1473 if (radix_tree_deref_retry(page)) { | 1453 radix_tree_for_each_tagged(slot, &mapping->page_tree, 1454 &iter, *index, tag) { 1455 struct page *page; 1456repeat: 1457 page = radix_tree_deref_slot(slot); 1458 if (unlikely(!page)) 1459 continue; 1460 1461 if (radix_tree_exception(page)) { 1462 if (radix_tree_deref_retry(page)) { |
1474 /* 1475 * Transient condition which can only trigger 1476 * when entry at index 0 moves out of or back 1477 * to root: none yet gotten, safe to restart. 1478 */ 1479 goto restart; | 1463 slot = radix_tree_iter_retry(&iter); 1464 continue; |
1480 } 1481 /* 1482 * A shadow entry of a recently evicted page. 1483 * 1484 * Those entries should never be tagged, but 1485 * this tree walk is lockless and the tags are 1486 * looked up in bulk, one radix tree node at a 1487 * time, so there is a sizable window for page --- 46 unchanged lines hidden (view full) --- 1534 void **slot; 1535 unsigned int ret = 0; 1536 struct radix_tree_iter iter; 1537 1538 if (!nr_entries) 1539 return 0; 1540 1541 rcu_read_lock(); | 1465 } 1466 /* 1467 * A shadow entry of a recently evicted page. 1468 * 1469 * Those entries should never be tagged, but 1470 * this tree walk is lockless and the tags are 1471 * looked up in bulk, one radix tree node at a 1472 * time, so there is a sizable window for page --- 46 unchanged lines hidden (view full) --- 1519 void **slot; 1520 unsigned int ret = 0; 1521 struct radix_tree_iter iter; 1522 1523 if (!nr_entries) 1524 return 0; 1525 1526 rcu_read_lock(); |
1542restart: | |
1543 radix_tree_for_each_tagged(slot, &mapping->page_tree, 1544 &iter, start, tag) { 1545 struct page *page; 1546repeat: 1547 page = radix_tree_deref_slot(slot); 1548 if (unlikely(!page)) 1549 continue; 1550 if (radix_tree_exception(page)) { 1551 if (radix_tree_deref_retry(page)) { | 1527 radix_tree_for_each_tagged(slot, &mapping->page_tree, 1528 &iter, start, tag) { 1529 struct page *page; 1530repeat: 1531 page = radix_tree_deref_slot(slot); 1532 if (unlikely(!page)) 1533 continue; 1534 if (radix_tree_exception(page)) { 1535 if (radix_tree_deref_retry(page)) { |
1552 /* 1553 * Transient condition which can only trigger 1554 * when entry at index 0 moves out of or back 1555 * to root: none yet gotten, safe to restart. 1556 */ 1557 goto restart; | 1536 slot = radix_tree_iter_retry(&iter); 1537 continue; |
1558 } 1559 1560 /* 1561 * A shadow entry of a recently evicted page, a swap 1562 * entry from shmem/tmpfs or a DAX entry. Return it 1563 * without attempting to raise page count. 1564 */ 1565 goto export; --- 600 unchanged lines hidden (view full) --- 2166 radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, vmf->pgoff) { 2167 if (iter.index > vmf->max_pgoff) 2168 break; 2169repeat: 2170 page = radix_tree_deref_slot(slot); 2171 if (unlikely(!page)) 2172 goto next; 2173 if (radix_tree_exception(page)) { | 1538 } 1539 1540 /* 1541 * A shadow entry of a recently evicted page, a swap 1542 * entry from shmem/tmpfs or a DAX entry. Return it 1543 * without attempting to raise page count. 1544 */ 1545 goto export; --- 600 unchanged lines hidden (view full) --- 2146 radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, vmf->pgoff) { 2147 if (iter.index > vmf->max_pgoff) 2148 break; 2149repeat: 2150 page = radix_tree_deref_slot(slot); 2151 if (unlikely(!page)) 2152 goto next; 2153 if (radix_tree_exception(page)) { |
2174 if (radix_tree_deref_retry(page)) 2175 break; 2176 else 2177 goto next; | 2154 if (radix_tree_deref_retry(page)) { 2155 slot = radix_tree_iter_retry(&iter); 2156 continue; 2157 } 2158 goto next; |
2178 } 2179 2180 if (!page_cache_get_speculative(page)) 2181 goto repeat; 2182 2183 /* Has the page moved? */ 2184 if (unlikely(page != *slot)) { 2185 page_cache_release(page); --- 669 unchanged lines hidden --- | 2159 } 2160 2161 if (!page_cache_get_speculative(page)) 2162 goto repeat; 2163 2164 /* Has the page moved? */ 2165 if (unlikely(page != *slot)) { 2166 page_cache_release(page); --- 669 unchanged lines hidden --- |