网卡的tx_queue
本文是原「蜗窝讨论区」的历史存档(2016-06-25),来自版块「Linux kernel技术问答」,共 2 帖。讨论区已停止服务,此处仅供查阅。
我最近在写自己的内核,对linux源代码读的不深。 感觉一些我自己的设计,有些闭门造车了,所以贴出来,请大家评评。
今天设计的是RTL8139网卡的tx_queue。 我让每个网卡都有一个tx_queue和rx_queue。 其中tx_queue是被发包中断“驱动”的,当一个skbuff入队的时候,如果发现队列是空的,那就顺便的主动的启动tx_queue。如果发现队列不为空,那就把skbuff插进tx_queue里,然后放心的返回。因为这个队列必然在等待一个或多个发包中断。它还是被“驱动”着的。 我上面所说的“驱动”,大家能“领会”吗? 就像IDE磁盘的IO类型的(非DMA)驱动代码一样,发出一个READ或WRITE的命令之后,以后对request队列的操作都是靠硬盘中断来唤醒维持的。 不知道linux是怎么样的,我觉得如果tx_queue非空,就只管把你要发送的skbuff提交到queue里,这样很合适。如果此时尝试wake它,就很丑,因为它必然在等待发包中断,而发包中断的bottom half里当然会netif_wake_queue(。 代码还没有测试,等在机器上通过了,再贴出来大家看看。
会不会有这样一个临界状态:skbuff 入队时判断 tx_queue 非空,但是 skbuff 入队完成前的一瞬间,tx_queue 刚好又变成了空的状态,睡了下去。 在这种情况下,如果 skbuff 入队操作没有和 tx_queue 没有做同步,也没有在入队完成后主动唤醒 tx_queue 的话,可能就异常了,tx_queue 永远不会被唤醒。 添加同步和主动唤醒两种方法都可以避免上面的问题出现,就看哪一个成本更低了~
