aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
Diffstat (limited to 'mm')
-rw-r--r--mm/huge_memory.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index b1cf73bc3b12..8ad580273521 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -3357,6 +3357,7 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
3357 struct anon_vma *anon_vma; 3357 struct anon_vma *anon_vma;
3358 int count, mapcount, ret; 3358 int count, mapcount, ret;
3359 bool mlocked; 3359 bool mlocked;
3360 unsigned long flags;
3360 3361
3361 VM_BUG_ON_PAGE(is_huge_zero_page(page), page); 3362 VM_BUG_ON_PAGE(is_huge_zero_page(page), page);
3362 VM_BUG_ON_PAGE(!PageAnon(page), page); 3363 VM_BUG_ON_PAGE(!PageAnon(page), page);
@@ -3396,7 +3397,7 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
3396 lru_add_drain(); 3397 lru_add_drain();
3397 3398
3398 /* Prevent deferred_split_scan() touching ->_count */ 3399 /* Prevent deferred_split_scan() touching ->_count */
3399 spin_lock(&split_queue_lock); 3400 spin_lock_irqsave(&split_queue_lock, flags);
3400 count = page_count(head); 3401 count = page_count(head);
3401 mapcount = total_mapcount(head); 3402 mapcount = total_mapcount(head);
3402 if (!mapcount && count == 1) { 3403 if (!mapcount && count == 1) {
@@ -3404,11 +3405,11 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
3404 split_queue_len--; 3405 split_queue_len--;
3405 list_del(page_deferred_list(head)); 3406 list_del(page_deferred_list(head));
3406 } 3407 }
3407 spin_unlock(&split_queue_lock); 3408 spin_unlock_irqrestore(&split_queue_lock, flags);
3408 __split_huge_page(page, list); 3409 __split_huge_page(page, list);
3409 ret = 0; 3410 ret = 0;
3410 } else if (IS_ENABLED(CONFIG_DEBUG_VM) && mapcount) { 3411 } else if (IS_ENABLED(CONFIG_DEBUG_VM) && mapcount) {
3411 spin_unlock(&split_queue_lock); 3412 spin_unlock_irqrestore(&split_queue_lock, flags);
3412 pr_alert("total_mapcount: %u, page_count(): %u\n", 3413 pr_alert("total_mapcount: %u, page_count(): %u\n",
3413 mapcount, count); 3414 mapcount, count);
3414 if (PageTail(page)) 3415 if (PageTail(page))
@@ -3416,7 +3417,7 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
3416 dump_page(page, "total_mapcount(head) > 0"); 3417 dump_page(page, "total_mapcount(head) > 0");
3417 BUG(); 3418 BUG();
3418 } else { 3419 } else {
3419 spin_unlock(&split_queue_lock); 3420 spin_unlock_irqrestore(&split_queue_lock, flags);
3420 unfreeze_page(anon_vma, head); 3421 unfreeze_page(anon_vma, head);
3421 ret = -EBUSY; 3422 ret = -EBUSY;
3422 } 3423 }