@@ -3357,6 +3357,7 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
3357
3357
struct anon_vma * anon_vma ;
3358
3358
int count , mapcount , ret ;
3359
3359
bool mlocked ;
3360
+ unsigned long flags ;
3360
3361
3361
3362
VM_BUG_ON_PAGE (is_huge_zero_page (page ), page );
3362
3363
VM_BUG_ON_PAGE (!PageAnon (page ), page );
@@ -3396,27 +3397,27 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
3396
3397
lru_add_drain ();
3397
3398
3398
3399
/* Prevent deferred_split_scan() touching ->_count */
3399
- spin_lock (& split_queue_lock );
3400
+ spin_lock_irqsave (& split_queue_lock , flags );
3400
3401
count = page_count (head );
3401
3402
mapcount = total_mapcount (head );
3402
3403
if (!mapcount && count == 1 ) {
3403
3404
if (!list_empty (page_deferred_list (head ))) {
3404
3405
split_queue_len -- ;
3405
3406
list_del (page_deferred_list (head ));
3406
3407
}
3407
- spin_unlock (& split_queue_lock );
3408
+ spin_unlock_irqrestore (& split_queue_lock , flags );
3408
3409
__split_huge_page (page , list );
3409
3410
ret = 0 ;
3410
3411
} else if (IS_ENABLED (CONFIG_DEBUG_VM ) && mapcount ) {
3411
- spin_unlock (& split_queue_lock );
3412
+ spin_unlock_irqrestore (& split_queue_lock , flags );
3412
3413
pr_alert ("total_mapcount: %u, page_count(): %u\n" ,
3413
3414
mapcount , count );
3414
3415
if (PageTail (page ))
3415
3416
dump_page (head , NULL );
3416
3417
dump_page (page , "total_mapcount(head) > 0" );
3417
3418
BUG ();
3418
3419
} else {
3419
- spin_unlock (& split_queue_lock );
3420
+ spin_unlock_irqrestore (& split_queue_lock , flags );
3420
3421
unfreeze_page (anon_vma , head );
3421
3422
ret = - EBUSY ;
3422
3423
}
0 commit comments