接着上篇blog,想起了以前的一个嵌套死锁问题。简单记录下:
死锁的位置也是在tcp_v4_rcv中的那个自旋锁。
因为处于项目的需要,需要的本地的核态直接回应上层应用态的数据包,所以,在有一个数据包发往上层,然后上层回应之后,发到netfilter的local_out处,此时,若是直接用netif_receive_skb回应上层的数据,则又会再次去获取上面还未释放的自旋锁,所以造成死锁。
解决的方法,将上层发下来的数据包,缓存到一个队列里面,然后local_out就可以返回,上层的自旋锁就可以释放掉了,然后再令起一个内核线程,将队列里的数据包发往上层,这样就解决了嵌套死锁的问题。。
阅读(1658) | 评论(0) | 转发(0) |