vmcore查找refcount过程



crash7latest> bt -s 246346
PID: 246346  TASK: ffff880280345400  CPU: 0   COMMAND: "perfquery"
 #0 [ffff88015d1c3b38] __schedule+535 at ffffffff816b4fa7
 #1 [ffff88015d1c3b90] schedule+62 at ffffffff816b54fe
 #2 [ffff88015d1c3bb0] schedule_timeout+437 at ffffffff816b83e5
 #3 [ffff88015d1c3c50] wait_for_completion+271 at ffffffff816b6a2f
 #4 [ffff88015d1c3cd0] unregister_mad_agent+429 at ffffffffa02a988d [ib_mad]
 #5 [ffff88015d1c3d40] ib_unregister_mad_agent+169 at ffffffffa02a9989 [ib_mad]
 #6 [ffff88015d1c3d70] ib_umad_close+210 at ffffffffa03c5692 [ib_umad]
 #7 [ffff88015d1c3dc0] __fput+189 at ffffffff8120e3ad
 #8 [ffff88015d1c3e10] ____fput+14 at ffffffff8120e5ee
 #9 [ffff88015d1c3e20] task_work_run+213 at ffffffff810a6785
#10 [ffff88015d1c3e80] do_exit+519 at ffffffff8108b5b7
#11 [ffff88015d1c3f00] do_group_exit+86 at ffffffff8108b916
#12 [ffff88015d1c3f40] sys_exit_group+23 at ffffffff8108b9d7
#13 [ffff88015d1c3f50] system_call_fastpath+18 at ffffffff816b9894
    RIP: 00007f77c93dafa8  RSP: 00007ffd9b682b28  RFLAGS: 00000246
    RAX: ffffffffffffffda  RBX: 00007f77c96b8830  RCX: 00007f77c93dafa8
    RDX: ffffffffffffffff  RSI: 000000000000003c  RDI: ffffffffffffffff
    RBP: 00000000ffffffff   R8: 00000000000000e7   R9: ffffffffffffffa8
    R10: 00007f77c96bf828  R11: 0000000000000246  R12: 00007f77c96b8830
    R13: 000000000000ffff  R14: 0000000000608c80  R15: 00007ffd9b683320
    ORIG_RAX: 00000000000000e7  CS: 0033  SS: 002b

crash7latest> whatis wait_for_completion
void wait_for_completion(struct completion *);

wait_for_complete的参数是completion, 由于这个结构包含在那个priv中,所以找到它的地址也就找到了priv的地址。
要找到它就得反汇编wait_for_complete的父函数,看看参数是怎么传递的.

crash7latest> dis -r unregister_mad_agent+429
0xffffffffa02a96e0 <unregister_mad_agent>:      push   %rbp
0xffffffffa02a96e1 <unregister_mad_agent+1>:    mov    %rsp,%rbp
0xffffffffa02a96e4 <unregister_mad_agent+4>:    push   %r15
0xffffffffa02a96e6 <unregister_mad_agent+6>:    push   %r14
0xffffffffa02a96e8 <unregister_mad_agent+8>:    push   %r13
0xffffffffa02a96ea <unregister_mad_agent+10>:   push   %r12
0xffffffffa02a96ec <unregister_mad_agent+12>:   push   %rbx
0xffffffffa02a96ed <unregister_mad_agent+13>:   sub    $0x38,%rsp
0xffffffffa02a96f1 <unregister_mad_agent+17>:   nopl   0x0(%rax,%rax,1)
0xffffffffa02a96f6 <unregister_mad_agent+22>:   lea    0x68(%rdi),%r13
0xffffffffa02a96fa <unregister_mad_agent+26>:   lea    -0x50(%rbp),%r12
0xffffffffa02a96fe <unregister_mad_agent+30>:   mov    %rdi,%rbx
0xffffffffa02a9701 <unregister_mad_agent+33>:   mov    %r13,%rdi
0xffffffffa02a9704 <unregister_mad_agent+36>:   mov    %r12,-0x50(%rbp)
0xffffffffa02a9708 <unregister_mad_agent+40>:   mov    %r12,-0x48(%rbp)
0xffffffffa02a970c <unregister_mad_agent+44>:   callq  0xffffffff816b90f0 <_raw_spin_lock_irqsave>
0xffffffffa02a9711 <unregister_mad_agent+49>:   mov    0x70(%rbx),%rdi
0xffffffffa02a9715 <unregister_mad_agent+53>:   lea    0x70(%rbx),%r8
0xffffffffa02a9719 <unregister_mad_agent+57>:   lea    -0x18(%rdi),%rdx
0xffffffffa02a971d <unregister_mad_agent+61>:   cmp    %rdi,%r8
0xffffffffa02a9720 <unregister_mad_agent+64>:   mov    0x18(%rdx),%rcx
0xffffffffa02a9724 <unregister_mad_agent+68>:   je     0xffffffffa02a976c <unregister_mad_agent+140>
0xffffffffa02a9726 <unregister_mad_agent+70>:   sub    $0x18,%rcx
0xffffffffa02a972a <unregister_mad_agent+74>:   jmp    0xffffffffa02a9737 <unregister_mad_agent+87>
0xffffffffa02a972c <unregister_mad_agent+76>:   nopl   0x0(%rax)
0xffffffffa02a9730 <unregister_mad_agent+80>:   mov    %rcx,%rdx
0xffffffffa02a9733 <unregister_mad_agent+83>:   lea    -0x18(%rdi),%rcx
0xffffffffa02a9737 <unregister_mad_agent+87>:   mov    0x128(%rdx),%edi
0xffffffffa02a973d <unregister_mad_agent+93>:   test   %edi,%edi
0xffffffffa02a973f <unregister_mad_agent+95>:   jne    0xffffffffa02a975f <unregister_mad_agent+127>
0xffffffffa02a9741 <unregister_mad_agent+97>:   xor    %edi,%edi
0xffffffffa02a9743 <unregister_mad_agent+99>:   cmpq   $0x0,0x110(%rdx)
0xffffffffa02a974b <unregister_mad_agent+107>:  movl   $0x5,0x128(%rdx)
0xffffffffa02a9755 <unregister_mad_agent+117>:  setne  %dil
0xffffffffa02a9759 <unregister_mad_agent+121>:  sub    %edi,0x124(%rdx)
0xffffffffa02a975f <unregister_mad_agent+127>:  lea    0x18(%rcx),%rdx
0xffffffffa02a9763 <unregister_mad_agent+131>:  mov    0x18(%rcx),%rdi
0xffffffffa02a9767 <unregister_mad_agent+135>:  cmp    %rdx,%r8
0xffffffffa02a976a <unregister_mad_agent+138>:  jne    0xffffffffa02a9730 <unregister_mad_agent+80>
0xffffffffa02a976c <unregister_mad_agent+140>:  mov    0x80(%rbx),%rcx
0xffffffffa02a9773 <unregister_mad_agent+147>:  lea    0x80(%rbx),%rdx
0xffffffffa02a977a <unregister_mad_agent+154>:  cmp    %rcx,%rdx
0xffffffffa02a977d <unregister_mad_agent+157>:  je     0xffffffffa02a97a7 <unregister_mad_agent+199>
0xffffffffa02a977f <unregister_mad_agent+159>:  mov    -0x50(%rbp),%rsi
0xffffffffa02a9783 <unregister_mad_agent+163>:  mov    0x88(%rbx),%rdi
0xffffffffa02a978a <unregister_mad_agent+170>:  mov    %r12,0x8(%rcx)
0xffffffffa02a978e <unregister_mad_agent+174>:  mov    %rcx,-0x50(%rbp)
0xffffffffa02a9792 <unregister_mad_agent+178>:  mov    %rsi,(%rdi)
0xffffffffa02a9795 <unregister_mad_agent+181>:  mov    %rdi,0x8(%rsi)
0xffffffffa02a9799 <unregister_mad_agent+185>:  mov    %rdx,0x80(%rbx)
0xffffffffa02a97a0 <unregister_mad_agent+192>:  mov    %rdx,0x88(%rbx)
0xffffffffa02a97a7 <unregister_mad_agent+199>:  mov    %r13,%rdi
0xffffffffa02a97aa <unregister_mad_agent+202>:  mov    %rax,%rsi
0xffffffffa02a97ad <unregister_mad_agent+205>:  callq  0xffffffff816b8fe0 <_raw_spin_unlock_irqrestore>
0xffffffffa02a97b2 <unregister_mad_agent+210>:  mov    -0x50(%rbp),%rdi
0xffffffffa02a97b6 <unregister_mad_agent+214>:  movl   $0x5,-0x38(%rbp)
0xffffffffa02a97bd <unregister_mad_agent+221>:  movl   $0x0,-0x34(%rbp)
0xffffffffa02a97c4 <unregister_mad_agent+228>:  lea    -0x18(%rdi),%rax
0xffffffffa02a97c8 <unregister_mad_agent+232>:  cmp    %r12,%rdi
0xffffffffa02a97cb <unregister_mad_agent+235>:  mov    0x18(%rax),%r13
0xffffffffa02a97cf <unregister_mad_agent+239>:  je     0xffffffffa02a9822 <unregister_mad_agent+322>
0xffffffffa02a97d1 <unregister_mad_agent+241>:  lea    0x10(%rbx),%rdx
0xffffffffa02a97d5 <unregister_mad_agent+245>:  sub    $0x18,%r13
0xffffffffa02a97d9 <unregister_mad_agent+249>:  lea    0x168(%rbx),%r14
0xffffffffa02a97e0 <unregister_mad_agent+256>:  lea    -0x40(%rbp),%r15
0xffffffffa02a97e4 <unregister_mad_agent+260>:  mov    %rdx,-0x58(%rbp)
0xffffffffa02a97e8 <unregister_mad_agent+264>:  jmp    0xffffffffa02a97f6 <unregister_mad_agent+278>
0xffffffffa02a97ea <unregister_mad_agent+266>:  nopw   0x0(%rax,%rax,1)
0xffffffffa02a97f0 <unregister_mad_agent+272>:  mov    %r13,%rax
0xffffffffa02a97f3 <unregister_mad_agent+275>:  mov    %rdx,%r13
0xffffffffa02a97f6 <unregister_mad_agent+278>:  add    $0x30,%rax
0xffffffffa02a97fa <unregister_mad_agent+282>:  mov    %rax,-0x40(%rbp)
0xffffffffa02a97fe <unregister_mad_agent+286>:  callq  0xffffffff81340e40 <list_del>
0xffffffffa02a9803 <unregister_mad_agent+291>:  mov    %r15,%rsi
0xffffffffa02a9806 <unregister_mad_agent+294>:  mov    -0x58(%rbp),%rdi
0xffffffffa02a980a <unregister_mad_agent+298>:  callq  *0x30(%rbx)
0xffffffffa02a980d <unregister_mad_agent+301>:  lock decl (%r14)
0xffffffffa02a9811 <unregister_mad_agent+305>:  mov    0x18(%r13),%rax
0xffffffffa02a9815 <unregister_mad_agent+309>:  lea    0x18(%r13),%rdi
0xffffffffa02a9819 <unregister_mad_agent+313>:  cmp    %r12,%rdi
0xffffffffa02a981c <unregister_mad_agent+316>:  lea    -0x18(%rax),%rdx
0xffffffffa02a9820 <unregister_mad_agent+320>:  jne    0xffffffffa02a97f0 <unregister_mad_agent+272>
0xffffffffa02a9822 <unregister_mad_agent+322>:  mov    0x60(%rbx),%rax
0xffffffffa02a9826 <unregister_mad_agent+326>:  lea    0xa0(%rbx),%rdi
0xffffffffa02a982d <unregister_mad_agent+333>:  mov    (%rax),%r12
0xffffffffa02a9830 <unregister_mad_agent+336>:  callq  0xffffffff810a3d50 <cancel_delayed_work>
0xffffffffa02a9835 <unregister_mad_agent+341>:  lea    0x38(%r12),%r13
0xffffffffa02a983a <unregister_mad_agent+346>:  mov    %r13,%rdi
0xffffffffa02a983d <unregister_mad_agent+349>:  callq  0xffffffff816b90f0 <_raw_spin_lock_irqsave>
0xffffffffa02a9842 <unregister_mad_agent+354>:  mov    %rbx,%rdi
0xffffffffa02a9845 <unregister_mad_agent+357>:  mov    %rax,%r14
0xffffffffa02a9848 <unregister_mad_agent+360>:  callq  0xffffffffa02a8630 <remove_mad_reg_req>
0xffffffffa02a984d <unregister_mad_agent+365>:  mov    %rbx,%rdi
0xffffffffa02a9850 <unregister_mad_agent+368>:  callq  0xffffffff81340e40 <list_del>
0xffffffffa02a9855 <unregister_mad_agent+373>:  mov    %r14,%rsi
0xffffffffa02a9858 <unregister_mad_agent+376>:  mov    %r13,%rdi
0xffffffffa02a985b <unregister_mad_agent+379>:  callq  0xffffffff816b8fe0 <_raw_spin_unlock_irqrestore>
0xffffffffa02a9860 <unregister_mad_agent+384>:  mov    0xd0(%r12),%rdi
0xffffffffa02a9868 <unregister_mad_agent+392>:  callq  0xffffffff810a0650 <flush_workqueue>
0xffffffffa02a986d <unregister_mad_agent+397>:  mov    %rbx,%rdi
0xffffffffa02a9870 <unregister_mad_agent+400>:  callq  0xffffffffa02af090 <ib_cancel_rmpp_recvs>
0xffffffffa02a9875 <unregister_mad_agent+405>:  lock decl 0x168(%rbx)
0xffffffffa02a987c <unregister_mad_agent+412>:  je     0xffffffffa02a98c0 <unregister_mad_agent+480>
0xffffffffa02a987e <unregister_mad_agent+414>:  lea    0x170(%rbx),%r12
0xffffffffa02a9885 <unregister_mad_agent+421>:  mov    %r12,%rdi
0xffffffffa02a9888 <unregister_mad_agent+424>:  callq  0xffffffff816b6920 <wait_for_completion>
0xffffffffa02a988d <unregister_mad_agent+429>:  mov    0x58(%rbx),%rdi

从这里看
...
0xffffffffa02a9875 <unregister_mad_agent+405>:  lock decl 0x168(%rbx)
0xffffffffa02a987c <unregister_mad_agent+412>:  je     0xffffffffa02a98c0 <unregister_mad_agent+480>
0xffffffffa02a987e <unregister_mad_agent+414>:  lea    0x170(%rbx),%r12
0xffffffffa02a9885 <unregister_mad_agent+421>:  mov    %r12,%rdi <----传参数
0xffffffffa02a9888 <unregister_mad_agent+424>:  callq  0xffffffff816b6920 <wait_for_completion>
0xffffffffa02a988d <unregister_mad_agent+429>:  mov    0x58(%rbx),%rdi
...

看rdi是从r12传入的,也就是说completion的地址保存在r12中。
接下来是找r12, r12是个callee saved register, 也就是说如果一个函数要用到r12,必须先把它保存到堆栈上。那么看看wait_for_completion到底会不会保存r12,反汇编。

crash7latest> dis -r wait_for_completion+271
0xffffffff816b6920 <wait_for_completion>:       push   %rbp
0xffffffff816b6921 <wait_for_completion+1>:     mov    %rsp,%rbp
0xffffffff816b6924 <wait_for_completion+4>:     sub    $0x70,%rsp
0xffffffff816b6928 <wait_for_completion+8>:     mov    %rbx,-0x28(%rbp)
0xffffffff816b692c <wait_for_completion+12>:    mov    %r12,-0x20(%rbp) <---r12保存到堆栈中了
0xffffffff816b6930 <wait_for_completion+16>:    mov    %r13,-0x18(%rbp)
0xffffffff816b6934 <wait_for_completion+20>:    mov    %r14,-0x10(%rbp)
0xffffffff816b6938 <wait_for_completion+24>:    mov    %r15,-0x8(%rbp)
0xffffffff816b693c <wait_for_completion+28>:    nopl   0x0(%rax,%rax,1)
0xffffffff816b6941 <wait_for_completion+33>:    mov    %rdi,%rbx
0xffffffff816b6944 <wait_for_completion+36>:    lea    0x8(%rbx),%r12
...

r12被保存到-0x20(%rbp)中了,注意这是地址.
...
 #3 [ffff88015d1c3c50] wait_for_completion at ffffffff816b6a2f
    ffff88015d1c3c58: ffff880100020002 ffff8802646f3f58
    ffff88015d1c3c68: 0000000000000001 ffff880280345400
    ffff88015d1c3c78: ffffffff810b7970 ffff8802646f3f80
    ffff88015d1c3c88: ffff8802646f3f80 ffffffffa02af15e
    ffff88015d1c3c98: ffff88015d1c3cc8 ffff8802646f3e00
    ffff88015d1c3ca8: ffff8802646f3f70 ffff8802813db838
    ffff88015d1c3cb8: 0000000000000200 ffff8802646f3030
    ffff88015d1c3cc8: ffff88015d1c3d38 ffffffffa02a988d
...
-0x20(%rbp)=0xffff88015d1c3cc8-0x20=ffff88015d1c3ca8, 然后读这个地址里的值就是r12的值。

crash7latest> rd 0xffff88015d1c3ca8
ffff88015d1c3ca8:  ffff8802646f3f70                    p?od....

r12 是 ffff8802646f3f70, completion的地址是ffff8802646f3f70, 然后算算偏移是0x170.
最终ib_mad_agent_private地址是ffff8802646f3e00。

crash7latest> whatis unregister_mad_agent
void unregister_mad_agent(struct ib_mad_agent_private *);
crash7latest> struct ib_mad_agent_private -o
struct ib_mad_agent_private {
    [0] struct list_head agent_list;
   [16] struct ib_mad_agent agent;
   [88] struct ib_mad_reg_req *reg_req;
   [96] struct ib_mad_qp_info *qp_info;
  [104] spinlock_t lock;
  [112] struct list_head send_list;
  [128] struct list_head wait_list;
  [144] struct list_head done_list;
  [160] struct delayed_work timed_work;
  [288] unsigned long timeout;
  [296] struct list_head local_list;
  [312] struct work_struct local_work;
  [344] struct list_head rmpp_list;
  [360] atomic_t refcount;
  [368] struct completion comp;
}
SIZE: 400
crash7latest> eval 368
hexadecimal: 170
    decimal: 368
      octal: 560
     binary: 0000000000000000000000000000000000000000000000000000000101110000
crash7latest> eval 0xffff8802646f3f70 - 0x170
hexadecimal: ffff8802646f3e00
    decimal: 18446612142589165056  (-131931120386560)
      octal: 1777774200114433637000
     binary: 1111111111111111100010000000001001100100011011110011111000000000
crash7latest> struct ib_mad_agent_private ffff8802646f3e00
struct ib_mad_agent_private {
  agent_list = {
    next = 0xdead000000000100,
    prev = 0xdead000000000200
  },
  agent = {
    device = 0xffff880264400000,
    qp = 0xffff8802813d9800,
    mr = 0xffff8801e15bcde0,
    recv_handler = 0xffffffffa03c7160 <recv_handler>,
    send_handler = 0xffffffffa03c5820 <send_handler>,
    snoop_handler = 0x0,
    context = 0xffff8802646f3000,
    hi_tid = 21438,
    flags = 0,
    port_num = 1 '\001',
    rmpp_version = 0 '\000'
  },
  reg_req = 0xffff8800467aa5a0,
  qp_info = 0xffff8802813db980,
  lock = {
    {
      rlock = {
        raw_lock = {
          {
            head_tail = 917518,
            tickets = {
              head = 14,
              tail = 14
            }
          }
        }
      }
    }
  },
  send_list = {
    next = 0xffff8801da369918,
    prev = 0xffff8801da369918
  },
  wait_list = {
    next = 0xffff8802646f3e80,
    prev = 0xffff8802646f3e80
  },
  done_list = {
    next = 0xffff8802646f3e90,
    prev = 0xffff8802646f3e90
  },
  timed_work = {
    work = {
      data = {
        counter = 256
      },
      entry = {
        next = 0xffff8802646f3ea8,
        prev = 0xffff8802646f3ea8
      },
      func = 0xffffffffa02ab1f0 <timeout_sends>
    },
    timer = {
      entry = {
        next = 0x0,
        prev = 0xdead000000000200
      },
      expires = 4329013876,
      base = 0xffff880286e91682,
      function = 0xffffffff810a20a0 <delayed_work_timer_fn>,
      data = 18446612142589165216,
      slack = -1,
      start_pid = -1,
      start_site = 0x0,
      start_comm = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
    },
    wq = 0xffff88027a50fc00,
    cpu = 2
  },
  timeout = 0,
  local_list = {
    next = 0xffff8802646f3f28,
    prev = 0xffff8802646f3f28
  },
  local_work = {
    data = {
      counter = 68719476704
    },
    entry = {
      next = 0xffff8802646f3f40,
      prev = 0xffff8802646f3f40
    },
    func = 0xffffffffa02a9270 <local_completions>
  },
  rmpp_list = {
    next = 0xffff8802646f3f58,
    prev = 0xffff8802646f3f58
  },
  refcount = {
    counter = 2
  },
  comp = {
    done = 0,
    wait = {
      lock = {
        {
          rlock = {
            raw_lock = {
              {
                head_tail = 131074,
                tickets = {
                  head = 2,
                  tail = 2
                }
              }
            }
          }
        }
      },
      task_list = {
        next = 0xffff88015d1c3c80,
        prev = 0xffff88015d1c3c80
      }
    }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mounter625

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值