rmap.c (69473e5de87389be6c0fa4a5d574a50c8f904fb3) rmap.c (a1528e21f8915e16252cda1137fe29672c918361)
1/*
2 * mm/rmap.c - physical to virtual reverse mappings
3 *
4 * Copyright 2001, Rik van Riel <riel@conectiva.com.br>
5 * Released under the General Public License (GPL).
6 *
7 * Simple, low overhead reverse mapping scheme.
8 * Please try to keep this thing as modular as possible.

--- 1197 unchanged lines hidden (view full) ---

1206 */
1207void page_add_file_rmap(struct page *page, bool compound)
1208{
1209 int i, nr = 1;
1210
1211 VM_BUG_ON_PAGE(compound && !PageTransHuge(page), page);
1212 lock_page_memcg(page);
1213 if (compound && PageTransHuge(page)) {
1/*
2 * mm/rmap.c - physical to virtual reverse mappings
3 *
4 * Copyright 2001, Rik van Riel <riel@conectiva.com.br>
5 * Released under the General Public License (GPL).
6 *
7 * Simple, low overhead reverse mapping scheme.
8 * Please try to keep this thing as modular as possible.

--- 1197 unchanged lines hidden (view full) ---

1206 */
1207void page_add_file_rmap(struct page *page, bool compound)
1208{
1209 int i, nr = 1;
1210
1211 VM_BUG_ON_PAGE(compound && !PageTransHuge(page), page);
1212 lock_page_memcg(page);
1213 if (compound && PageTransHuge(page)) {
1214 for (i = 0, nr = 0; i < thp_nr_pages(page); i++) {
1214 int nr_pages = thp_nr_pages(page);
1215
1216 for (i = 0, nr = 0; i < nr_pages; i++) {
1215 if (atomic_inc_and_test(&page[i]._mapcount))
1216 nr++;
1217 }
1218 if (!atomic_inc_and_test(compound_mapcount_ptr(page)))
1219 goto out;
1220 if (PageSwapBacked(page))
1217 if (atomic_inc_and_test(&page[i]._mapcount))
1218 nr++;
1219 }
1220 if (!atomic_inc_and_test(compound_mapcount_ptr(page)))
1221 goto out;
1222 if (PageSwapBacked(page))
1221 __inc_node_page_state(page, NR_SHMEM_PMDMAPPED);
1223 __mod_lruvec_page_state(page, NR_SHMEM_PMDMAPPED,
1224 nr_pages);
1222 else
1223 __inc_node_page_state(page, NR_FILE_PMDMAPPED);
1224 } else {
1225 if (PageTransCompound(page) && page_mapping(page)) {
1226 VM_WARN_ON_ONCE(!PageLocked(page));
1227
1228 SetPageDoubleMap(compound_head(page));
1229 if (PageMlocked(page))

--- 17 unchanged lines hidden (view full) ---

1247 if (unlikely(PageHuge(page))) {
1248 /* hugetlb pages are always mapped with pmds */
1249 atomic_dec(compound_mapcount_ptr(page));
1250 return;
1251 }
1252
1253 /* page still mapped by someone else? */
1254 if (compound && PageTransHuge(page)) {
1225 else
1226 __inc_node_page_state(page, NR_FILE_PMDMAPPED);
1227 } else {
1228 if (PageTransCompound(page) && page_mapping(page)) {
1229 VM_WARN_ON_ONCE(!PageLocked(page));
1230
1231 SetPageDoubleMap(compound_head(page));
1232 if (PageMlocked(page))

--- 17 unchanged lines hidden (view full) ---

1250 if (unlikely(PageHuge(page))) {
1251 /* hugetlb pages are always mapped with pmds */
1252 atomic_dec(compound_mapcount_ptr(page));
1253 return;
1254 }
1255
1256 /* page still mapped by someone else? */
1257 if (compound && PageTransHuge(page)) {
1255 for (i = 0, nr = 0; i < thp_nr_pages(page); i++) {
1258 int nr_pages = thp_nr_pages(page);
1259
1260 for (i = 0, nr = 0; i < nr_pages; i++) {
1256 if (atomic_add_negative(-1, &page[i]._mapcount))
1257 nr++;
1258 }
1259 if (!atomic_add_negative(-1, compound_mapcount_ptr(page)))
1260 return;
1261 if (PageSwapBacked(page))
1261 if (atomic_add_negative(-1, &page[i]._mapcount))
1262 nr++;
1263 }
1264 if (!atomic_add_negative(-1, compound_mapcount_ptr(page)))
1265 return;
1266 if (PageSwapBacked(page))
1262 __dec_node_page_state(page, NR_SHMEM_PMDMAPPED);
1267 __mod_lruvec_page_state(page, NR_SHMEM_PMDMAPPED,
1268 -nr_pages);
1263 else
1264 __dec_node_page_state(page, NR_FILE_PMDMAPPED);
1265 } else {
1266 if (!atomic_add_negative(-1, &page->_mapcount))
1267 return;
1268 }
1269
1270 /*

--- 719 unchanged lines hidden ---
1269 else
1270 __dec_node_page_state(page, NR_FILE_PMDMAPPED);
1271 } else {
1272 if (!atomic_add_negative(-1, &page->_mapcount))
1273 return;
1274 }
1275
1276 /*

--- 719 unchanged lines hidden ---