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 --- |