linux napi内核配置,linux-kernel – 关于Linux内核中的NAPI实现

Now for NAPI enabled Ethernet driver initially whenever packets comes at interface ,it is notified to CPU and appropriate Ethernet driver code (Interrupt handler) is executed .Inside the interrupt handler code we check if type of interrupt is received packet.

What it mean by disabling further interrupts?

通常,驱动程序会清除导致中断的情况.但是,NAPI驱动程序也可能在ISR完成时禁用接收中断.

假设一个以太网帧的到达可能是帧的突发或泛滥的开始.因此,为什么不测试(即轮询)是否已经到达更多帧,而不是退出中断模式并且可能立即重新进入中断模式?

Is it mean packets are still captured by device

是.

每个到达的帧由以太网控制器存储在帧缓冲器中.

and kept in device memory

它通常不是“设备内存”.

它通常是在分配给以太网控制器的主存储器中分配的一组缓冲器(例如,环形缓冲器).

but not notified to CPU about the availability of these packets?

由于已禁用接收中断,因此不会通知NAPI驱动程序此事件.

但由于驱动程序正忙于处理前一帧,因此无论如何都无法立即处理中断请求.

Also ,what it mean by CPU is pooling the device ,

大概你实际上是在询问“民意调查”?

轮询简单地意味着程序(即驱动程序)询问(即读取和测试)状态位以查找它正在等待的条件.

如果满足条件,则它将以类似于该事件的中断的方式处理事件.

如果不满足条件,那么它可以循环(在通用情况下).但是,当轮询表明没有更多的帧到达时,NAPI驱动程序将假设数据包突发或泛洪已经结束,并将恢复中断模式.

is it like CPU after every few second will run snull_poll() method and copy whatever number of packets are in device memory to DMA Buffer and pushed to Upper layer?

在轮询之前,NAPI驱动程序不会延迟或暂停自己“几秒钟”.

假设以太网帧可能会泛滥端口,因此只要对当前帧的处理完成就会执行轮询.

NAPI驱动程序中可能存在的错误称为“腐烂数据包”.

当驱动程序从轮询模式转换回中断模式时,帧可能在此转换期间到达并且未被驱动程序检测到.

直到另一帧到达(并产生中断)才会由NAPI驱动程序“找到”并处理前一帧.

BTW

您始终编写类似于“CPU执行…”或“通知CPU”的语句或问题.

CPU始终(在未休眠或未关闭时)执行机器指令.

您应该关注这些指令属于哪个逻辑实体(即哪个程序或源代码模块).

你问的是软件问题,因此中断导致CPU知道某个序列的事实是给定的,不需要提及.

附录

I am just trying to understand drivers/net/ethernet/smsc/smsc911x.c in Linux source code.

SMSC LAN911x以太网芯片比我以前所描述的更为复杂.除了MAC之外,这些芯片还具有集成PHY,并且具有TX和RX FIFO,而不是在主存储器中使用缓冲环或列表.

As per your suggestion I have started reading the SMSCLan9118 datasheet and trying to map it with smsc911x_irqhandler function where interrupt status (INT_STS) and interrupt enable (INT_EN) registers have been read but don’t get how

if (likely(intsts & inten & INT_STS_RSFL_))

condition is checked here in line 1627.

INT_STS在头文件中定义为

#define INT_STS 0x58

数据表中第5.3节“系统控制和状态寄存器”中的表列出了(相对)地址0x58处的寄存器

58h INT_STS Interrupt Status

因此,smsc911x设备驱动程序使用与HW数据表完全相同的寄存器名称.

使用以下命令在ISR中使用此寄存器偏移量读取该32位寄存器:

u32 intsts = smsc911x_reg_read(pdata, INT_STS);

因此,中断状态的32位(在变量intsts中)与中断屏蔽的32位(在变量中)进行布尔运算.

这会产生驱动程序实际感兴趣的中断状态位.如果硬件为未启用的中断条件(在INT_EN寄存器中)设置状态位,这也可能是良好的防御性编程.

然后if语句执行另一个布尔AND以提取正在检查的一位(INT_STS_RSFL_).

5.3.3 INT_STS—Interrupt Status Register

RX Status FIFO Level Interrupt (RSFL).

Generated when the RX Status FIFO reaches the programmed level

possible()运算符用于编译器优化,以利用CPU中的分支预测功能.驱动程序的作者指示编译器优化代码以获得所附逻辑表达式的真实结果(例如,三个整数的AND运算,这将指示需要服务的中断条件).

Also on recieving the packet on interface which bit is set on which register.

我对阅读LAN9118数据表的看法是,确实没有专门用于接收帧的中断.

相反,当RX FIFO超过阈值时,可以通知主机.

5.3.6 FIFO_INT—FIFO Level Interrupts

RX Status Level.

The value in this field sets the level, in number of DWORDs, at which the RX Status FIFO Level interrupt (RSFL) will be generated.

When the RX Status FIFO used space is greater than this value an RX Status FIFO Level interrupt (RSFL) will be generated.

smsc911x驱动程序显然使用此阈值的默认值为零.RX状态FIFO中的每个条目都占用一个DWORD.该阈值的默认值是0x00(即“第一”帧上的中断).如果该阈值大于零,则存在“丢包”的可能性.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值