某软件在服务器运行,出现卡死问题。
结合汇编和源码分析可知,x2寄存器为空指针地址,意味着“__skb_dequeue”为空,但前面业务是有做“__skb_dequeue”是否为空的判断,按照正常业务逻辑,不应该进入kfree_skb函数。这说明同时有其他线程在操作“__skb_dequeu”e,在本次线程完成“__skb_dequeue”为非空判断后,其他线程操作使“__skb_dequeue”变为空,导致本次线程后续操作报错。
当多核处理不同逻辑时,可能存在对“__skb_dequeue”操作不同步的情况,从而导致队列被重复释放,导致死机问题出现。
1 2 3 4 5 6 7 8 | void __sock_wfree(struct sk_buff *skb) { struct sock *sk = skb->sk; if (refcount_sub_and_test(skb->truesize, &sk->sk_wmem_alloc)) { smp_rmb(); // 添加内存屏障验证问题解决 __sk_free(sk); } } |