diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/huge_memory.c | 9 |
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 | } |