一次qspinlock的实战分析-ABBA互锁

一次qspinlock的实战分析
文件系统debug引入,形成ABBA互锁后,引起的第三把锁死锁,block CPU,引起系统异常

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 WFE 

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

         |del_from_page_cache_info_print 

           |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、付费专栏及课程。

余额充值