记一次qspinlock的ABBA死锁分析

C1
el0t_64_sync
  |__arm64_sys_write
    |vfs_write 
     |fuse_file_write_iter
       |f2fs_write_begin
         |f2fs_get_block
           |f2fs_reserve_new_blocks 
             | inc_valid_block_count.27232 
               |__dquot_alloc_space
                 |dquot_add_space
                   | spin_lock(&dquot->dq_dqb_lock);  <----- two
                                ffffff809b05ad70  tail位置 c1 x1 : 0000000000200101 x0 : ffffff809b05ad70
                    |queued_spin_lock_slowpath 
                    
C2
|el0t_64_sync
 |invoke_syscall
  |do_filp_open
   |path_openat
    |fuse_atomic_open
     |fuse_create_open_backing
      |vfs_create
        |f2fs_add_dentry
          |f2fs_add_inline_entry
            |f2fs_init_inode_metadata
              |f2fs_new_node_page
                |inc_valid_node_count
                  |dquot_alloc_inode 
                   |//bl      0xffffffc0086c4f14 <dquot_add_inodes>
                   |dquot_add_inodes
                     |1285      spin_lock(&dquot->dq_dqb_lock);  [H 10413.941527] c2 x1 : 0000000000080000 x0 : ffffff809b05ad70  <--- two
                     |queued_spin_lock_slowpath 


C3
el0t_64_sync
 |invoke_syscall
   |__arm64_sys_unlinkat
    |do_unlinkat
     |iput
       |evict
         |f2fs_evict_inode
           |f2fs_remove_inode_page
             |truncate_node
               |dec_valid_node_count
                   |bl      0xffffffc0086ca838 <dquot_free_inode>
                   |1917  void dquot_free_inode(struct inode *inode)
                     |1936          spin_lock(&dquots[cnt]->dq_dqb_lock);  [H 10413.941531] c3 x1 : 00000000000c0000 x0 : ffffff809b05ad70  <---- two
                 
1604  struct f2fs_sb_info {
      spinlock_t stat_lock;            /* lock for stat operations */
                 

C5
kthread
 |wb_workfn
   |wb_do_writeback
     |__writeback_inodes_wb
       |__writeback_single_inode
         |do_writepages
           |f2fs_write_data_pages
             |__f2fs_write_data_pages
               |f2fs_write_cache_pages
                 |f2fs_write_single_data_page
                   |f2fs_do_write_data_page
                     |2819  int __test_set_page_writeback(struct page *page, bool keep_write)  //XA_STATE(xas, &mapping->i_pages, page_index(page));   <--- three
                       |xas_lock_irqsave(&xas, flags); 
                      | queued_spin_lock_slowpath at ffffffc0082872e0 存在疑问  [H 10413.941529] c5 x1 : 0000000000000101 x0 : ffffff807c2cc458  tail 
                     

C7

el0t_64_sync
 |el0t_64_sync_handler
  |__arm64_sys_write
    |vfs_write
     |fuse_file_write_iter_backing
       |do_iter_write
         |f2fs_file_write_iter
           |f2fs_preallocate_blocks
             |f2fs_map_blocks
               |f2fs_reserve_new_blocks
                 |inc_valid_block_count.27232
                   |__dquot_alloc_space 
                    |spin_lock(&inode->i_lock); <---- one  
                    |dquot_add_space
                     |spin_lock(&dquot->dq_dqb_lock); 这里拿锁 block了C1 C2 C3  <----- two 
                       |irq_enter
                         |blk_done_softirq
                           |mmc_blk_mq_complete 
                             |mmc_blk_cqe_complete_rq
                               |blk_update_request
                                 |bio_endio
                                   |f2fs_write_end_io
                                     |end_page_writeback
                                      |2775  int test_clear_page_writeback(struct page *page)
                                       |xa_lock_irqsave(&mapping->i_pages, flags); <----- three 
                                        |queued_spin_lock_slowpath [H 10413.941582] c7 x1 : 0000000000000001 x0 : ffffff807c2cc458 pending locked位置已1,再pending位置    

C6
|kthread
  |shrink_node
     |shrink_node_memcgs
       |shrink_lruvec
         |shrink_inactive_list
           |shrink_page_list
              |__remove_mapping
               |xa_lock_irq(&mapping->i_pages); <---- tree 
                 |__delete_from_page_cache
                    |sprd_del_from_page_cache_info_print 
                       |sprd_mm_filemap_inode_info
                          |spin_lock(&inode->i_lock);  <---- one 
                          |qspinlock ffffff807c2cc348 0000000000000001 locked位置已1,再pending位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值