免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1058 | 回复: 2
打印 上一主题 下一主题

[网络子系统] 请问RTL8139在接收好一个package后,会自动继续接收下一个吗? [复制链接]

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-14 18:48 |只看该作者 |倒序浏览
本帖最后由 karma303 于 2016-05-14 18:49 编辑

想象一个情景:
RTL8139从网线上完整的收到一个package,放在ring buffer里。这时当然会触发中断(ROK)。
但是,cpu很忙(例如处在一个critial area的cli状态),无法及时去读这个package。
那么,网卡会继续从网线上接收数据吗?
还是说,网卡在cpu响应这次中断之前,会暂停接收数据?

如果继续接收,那么新收到的package是放在RBSTART位置上,覆盖前一个package?还是接着放到第一个package后面呢?

如果接着放在第一个package后面,最后不断累积,会不会ring buffer溢出呢?或者说,硬件写入模式是回绕的话,是不是可能最终还是可能把第一个包给覆盖呢?


我产生这个疑惑,主要是因为linux内核里针对8139的这段驱动代码:
  1. while((readb(ioaddr + CR) & RxBufEmpty) == 0)  
  2.     {  
  3.         unsigned int rx_status;  
  4.         unsigned short rx_size;  
  5.         unsigned short pkt_size;  
  6.         struct sk_buff *skb;  
  7.   
  8.         if(tp->cur_rx > RX_BUF_LEN)  
  9.             tp->cur_rx = tp->cur_rx % RX_BUF_LEN;  
  10.   
  11.         /* TODO: need to convert rx_status from little to host endian
  12.         * XXX: My CPU is little endian only  
  13.         */  
  14.         rx_status = *(unsigned int*)(tp->rx_ring + tp->cur_rx);  
  15.         rx_size = rx_status >> 16;  
  16.   
  17.         /* first two bytes are receive status register
  18.         * and next two bytes are frame length
  19.         */  
  20.         pkt_size = rx_size - 4;  
  21.   
  22.         /* hand over packet to system */  
  23.         skb = dev_alloc_skb (pkt_size + 2);  
  24.         if (skb) {  
  25.             skb->dev = dev;  
  26.             skb_reserve (skb, 2); /* 16 byte align the IP fields */  
  27.   
  28.             eth_copy_and_sum(  
  29.             skb, tp->rx_ring + tp->cur_rx + 4, pkt_size, 0);  
  30.   
  31.             skb_put (skb, pkt_size);  
  32.             skb->protocol = eth_type_trans (skb, dev);  
  33.             netif_rx (skb);  
  34.   
  35.             dev->last_rx = jiffies;  
  36.             tp->stats.rx_bytes += pkt_size;  
  37.             tp->stats.rx_packets++;  
  38.         }  
  39.         else {  
  40.             LOG_MSG("Memory squeeze, dropping packet.\n");  
  41.             tp->stats.rx_dropped++;  
  42.         }  
  43.   
  44.         /* update tp->cur_rx to next writing location  * /
  45.         tp->cur_rx = (tp->cur_rx + rx_size + 4 + 3) & ~3;

  46.         /* update CAPR */  
  47.         writew(tp->cur_rx, ioaddr + CAPR);  
  48.         }  
  49.     }  
复制代码
大家注意到没有,这是用一个while循环,意思是,ring buffer里可能不止一个package里。
但是!! 8139每收到一个package就会报告给cpu一个ROK中断,然后就被处理掉了。 所以,ring buffer里怎么可能出现堆积了两个以上的package的情形呢?

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
2 [报告]
发表于 2016-05-16 09:23 |只看该作者
放在缓存队列啊, ring buffer

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
3 [报告]
发表于 2016-05-16 18:20 |只看该作者
如果按照pkt arrive的速度去interrupt cpu,那cpu基本上就啥都做不了了。

NAPI本来就是关了中断去轮询,只有ring里有很多报文去轮询才有意义么。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP