一种应用于具有多cpu和网卡的系统的网卡驱动方法

文档序号:6506266阅读:192来源:国知局
一种应用于具有多cpu和网卡的系统的网卡驱动方法
【专利摘要】本发明提供了一种应用于具有多CPU和网卡的系统的网卡驱动方法,包括网卡驱动过程一和二,且在各个CPU中创建数据接收设备队列和数据发送设备队列;网卡驱动过程一包括:①在数据到达网卡时,产生硬件中断,关闭硬件中断,调用中断处理进程;②将网卡添加至一CPU的数据接收设备队列中;③重新开启硬件中断,设置软中断,中断处理进程返回;网卡驱动过程二包括:软中断轮询;对于软中断置位的CPU,先扫描其数据接收设备队列,依次对该队列中的网卡进行数据读取处理,再依次对其数据发送设备队列中的设备进行数据发送处理。本发明大大缩短了硬件中断上半部分处理时间,并将硬件中断下半部的处理任务分摊到各个CPU上,从而提高了系统性能。
【专利说明】—种应用于具有多CPU和网卡的系统的网卡驱动方法
【技术领域】
[0001]本发明涉及通信【技术领域】,尤其涉及一种应用于具有多CPU和网卡的系统的网卡驱动方法。
【背景技术】
[0002]通常,Iinux系统的网卡驱动过程主要包括两部分。
[0003]如图1所示,网卡驱动过程的上半部包括:
101、在来自通信对端的以太网数据传输到本端的网卡后,系统产生硬件中断,同时关闭硬件中断,即此时不会再接收网络中断。
[0004]102、硬件中断产生后,系统CPU调用上述网卡在open时注册的中断处理函数,进行以下中断处理:首先从网卡的数据寄存器中读取所接收的以太网数据;然后创建一块缓存(skb_buf),将以太网数据写入到该缓存中;之后将该缓存以结构链表的方式挂入到上述网卡的接收队列中。
[0005]网卡的接收队列其实就是一个链表,是用来临时存放skb_buf对象实例的;所有网卡在将接收到的数据写入Skb_buf之后都会将此skb_buf链入到其接收队列中,接收队列中的各skb_buf将在网络驱动过程的下半部分被取出发送至协议栈。
[0006]103、在网卡设备接收完数据之后,将该网卡挂到当前CPU的设备队列中,然后设置软中断,等待在软中断中继续处理数据。CPU的设备队列用以维护当前所有需要处理的网络设备。
[0007]104、重新开启硬件中断,此时系统可再次响应硬件中断。
[0008]如图2所示,网卡驱动过程的下半部包括:
201、系统在进行软中断轮询时,由于在上半部设置了软中断,因此发现CPU的软中断被置位。
[0009]202、依次对CPU的设备队列中各网卡设备所接收到的以太网数据进行处理:首先从CPU的设备队列中取得网卡设备,再从该网卡设备的接收队列中取得数据包,根据包头内容做相应的处理之后就将该数据包送往网络协议栈。
[0010]203、数据处理完毕后,从CPU的设备队列中移出数据处理完毕的网卡设备,同时关闭软中断。
[0011 ] 但是上述网卡驱动流程在应用于具有多个CPU和网卡的系统中时,上半部分中的关闭硬件中断、CPU申请内存及读取寄存器中的数据、将数据写入内存中、将内存以skb_buf结构的形式挂入设备队列、将该设备挂入到CPU维护的设备队列中等等这一系列的操作将会耗费大量时间,使得系统对下一次硬件中断处理将不及时。如果硬件中断很频繁,而此时系统处于硬件关中断状态,即使系统中有其他CPU处于空闲状态,那中断请求也得不到及时处理。因而,有必要对此驱动方法进行改进。

【发明内容】
[0012]本发明的目的在于提供一种网卡驱动方法,应用于具有多CPU和网卡的系统,缩短系统处于硬件中断关闭状态的时间,提高对新的硬件中断的响应速度。
[0013]本发明的目的是通过以下技术方案实现的:
一种应用于具有多CPU和网卡的系统的网卡驱动方法,包括网卡驱动过程一和网卡驱动过程二,还包括步骤:在各个CPU的数据结构中分别创建数据接收设备队列和数据发送设备队列,初始化为空;
所述网卡驱动过程一具体包括:
①在通信对端的以太网数据到达网卡时,产生硬件中断,同时关闭硬件中断,调用中断处理进程;
②将所述网卡添加至一CPU的数据接收设备队列中;
③重新开启硬件中断,同时设置所述网卡当前所处数据接收设备队列所属的CPU软中断,所述中断处理进程返回;
所述网卡驱动过程二具体包括:
进行软中断轮询;对于软中断置位的CPU,
先扫描其数据接收设备队列,依次对该数据接收设备队列中的每个网卡进行处理:先从设备寄存器中读取相应的数据,将数据打包后挂入当前网卡的数据接收链表中;然后从数据接收设备队列中摘除当前网卡,并将当前网卡挂入一 CPU的数据发送设备队列中;再依次对其数据发送设备队列中的设备进行处理:将当前网卡的数据接收链表中的数据处理后发送至协议栈。
[0014]其中,所述步骤②,将所述网卡添加至一 CPU的数据接收设备队列的过程进一步包括:
所述中断处理进程轮询各CPU,查看所述网卡存在于当前CPU的数据接收设备队列还是数据发送设备队列中,
若存在于当前CPU的数据接收设备队列,则跳转至步骤③;
若存在于当前CPU的数据发送设备队列中,则将该网卡移到一 CPU的数据接收设备队列后跳转至步骤③;
若不存在于任一 CPU的数据接收设备队列及数据发送设备队列中,则将该网卡添加至一 CPU的数据接收设备队列中,之后跳转至步骤③。
[0015]其中,所述步骤②中,在中断处理进程轮询各CPU的过程中,若所述网卡存在于当前CPU的数据发送设备队列中,则将该网卡移到负载最少的CPU的数据接收设备队列后跳
转至步骤③。
[0016]其中,所述步骤②中,在中断处理进程轮询各CPU的过程中,若所述网卡存在于当前CPU的数据发送设备队列中,则将该网卡移到当前CPU的数据接收设备队列后跳转至步骤③。
[0017]其中,所述步骤②中,在中断处理进程轮询各CPU的过程中,若所述网卡不存在于任一 CPU的数据接收设备队列及数据发送设备队列中,则将该网卡添加至负载最少的CPU的数据接收设备队列,之后跳转至步骤③。
[0018]其中,所述网卡驱动过程二中,在将当前网卡从软中断置位的CPU的数据接收设备队列中摘除后,将该网卡挂入负载最少的CPU的数据发送设备队列中。[0019]其中,判定其数据发送设备队列中设备数量最少的CPU为负载最少的CPU。
[0020]与现有技术相比,本发明实施例具有以下有益效果:
本发明实施例大大缩短了硬件中断上半部分处理时间,从而能够很快的处理其他中断,并将硬件中断下半部的处理任务分摊到各个CPU上,从而提高了系统性能,尤其对硬件中断共享这种情况,系统性能会显著提高。
【专利附图】

【附图说明】
[0021]图1是现有技术中网卡驱动方法的上半部分流程图。
[0022]图2是现有技术中网卡驱动方法的下半部分流程图。
[0023]图3是本发明实施例中网卡驱动方法的上半部分流程图。
[0024]图4是本发明实施例中网卡驱动方法的下半部分流程图。
【具体实施方式】
[0025]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0026]根据网卡驱动分为上下两部分的设计思想,为了能够快速响应网络硬件中断,需要再次压缩中断上半部的处理时间。现有技术中上半部的处理操作为申请内存(SKB)、读取寄存器,将读取内容做简单操作之后放入设备的接收队列中,再将设备加入CPU的设备队列中。本发明的改进方法是,只执行最后一步,即将中断设备添加到CPU的设备队列后,便重新开启硬件中断,让中断处理例程返回就行了,所有剩下的处理放在下半部执行。
[0027]为了实现上述改进方法,本实施例中需要在CPU的数据结构中创建两个设备队列,分别为数据接收设备队列(以下简称队列A)和数据发送设备队列(以下简称队列B),队列A用以挂载需要从网卡寄存器中读取数据的网卡设备,队列B用以挂载已经从寄存器中读取出数据缤并等待将数据发送至协议栈的网卡设备。具体地,在网卡设备需要从寄存器中读取数据时,将该网卡设备挂到队列A中,在网卡设备成功读取数据之后将其从队列A移至队列B中,在网卡设备所读取的数据发送至协议栈之后将其从队列B中移除。本实施例中,队列A的优先级比队列B的要高,队列A中的网卡设备全部处理完之后再处理队列B中的设备。在队列A中摘除设备时,可以根据当前CPU的负载情况,将设备挂到其他CPU的队列B中,由其他CPU处理数据,这样可以形成三级流水线的模式,理论上可以提高系统性能。
[0028]请参阅图3,本实施例中网卡驱动的上半部流程具体为:
301、以太网数据包到达网卡,产生硬件中断,同时关闭硬件中断,调用中断处理进程进行中断处理。
[0029]302、中断处理进程轮询CPU,判断该网卡设备存在于哪个CPU的队列A或者队列B中。由于系统中不会有特别多的CPU,也不会有特别多的网卡设备(包括虚拟网络设备),因而此轮询操作不会影响性能。
[0030]判断结果存在以下几种情况:
Cl)设备在队列A中,则跳转到步骤303 ;
(2)设备在队列B中,则先将该设备移到队列A中,再跳转到步骤303 ; (3)设备不在队列A或队列B中,则先将该设备挂到当前CPU的队列A中,再跳转到步骤 303。
[0031]303、重新开启硬件中断,设置软中断,中断处理进程返回。
[0032]请参阅图4,本实施例中网卡驱动的下半部流程具体为:
401、软中断轮询。判断当前CPU的软中断是否置位,未置位则查询下一个CPU。
[0033]402、如当前CPU已置位,则扫描其设备队列A。
[0034](I)若队列A不为空,则依次处理该队列中的每一个设备后再跳转至步骤403:先读取设备寄存器,将数据组织成包的格式挂入到该设备的接收队列(即该设备自己维护的一个数据接收链表)中;然后从队列A中摘除该设备,并寻找负载轻的CPU,将该设备挂入负载轻的CPU的队列B中。可以通过查看CPU的设备队列B中挂载的设备数量来判断CPU的
负载轻重。
[0035](2)若队列A为空,那么直接跳转至步骤403。
[0036]403、对当前CPU的队列B中设备进行处理,处理流程和现有技术中流程一样,将数据简单的处理一下就送往协议栈。
[0037]以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种应用于具有多CPU和网卡的系统的网卡驱动方法,包括网卡驱动过程一和网卡驱动过程二,其特征在于,还包括步骤:在各个CPU的数据结构中分别创建数据接收设备队列和数据发送设备队列,初始化为空; 所述网卡驱动过程一具体包括: ①在通信对端的以太网数据到达网卡时,产生硬件中断,同时关闭硬件中断,调用中断处理进程; ②将所述网卡添加至一CPU的数据接收设备队列中; ③重新开启硬件中断,同时设置所述网卡当前所处数据接收设备队列所属的CPU软中断,所述中断处理进程返回; 所述网卡驱动过程二具体包括: 进行软中断轮询;对于软中断置位的CPU, 先扫描其数据接收设备队列,依次对该数据接收设备队列中的每个网卡进行处理:先从设备寄存器中读取相应的数据,将数据打包后挂入当前网卡的数据接收链表中;然后从数据接收设备队列中摘除当前网卡,并将当前网卡挂入一 CPU的数据发送设备队列中; 再依次对其数据发送设备队列中的设备进行处理:将当前网卡的数据接收链表中的数据处理后发送至协议栈。
2.如权利要求1所述的网卡驱动方法,其特征在于,所述步骤②,将所述网卡添加至一CPU的数据接收设备队列的过程进一步包括: 所述中断处理进程轮询各CPU,查看所述网卡存在于当前CPU的数据接收设备队列还是数据发送设备队列中, 若存在于当前CPU的数据接收设备队列,则跳转至步骤③; 若存在于当前CPU的数据发送设备队列中,则将该网卡移到一 CPU的数据接收设备队列后跳转至步骤③; 若不存在于任一 CPU的数据接收设备队列及数据发送设备队列中,则将该网卡添加至一 CPU的数据接收设备队列中,之后跳转至步骤③。
3.如权利要求2所述的网卡驱动方法,其特征在于,所述步骤②中,在中断处理进程轮询各CPU的过程中,若所述网卡存在于当前CPU的数据发送设备队列中,则将该网卡移到负载最少的CPU的数据接收设备队列后跳转至步骤③。
4.如权利要求2所述的网卡驱动方法,其特征在于,所述步骤②中,在中断处理进程轮询各CPU的过程中,若所述网卡存在于当前CPU的数据发送设备队列中,则将该网卡移到当前CPU的数据接收设备队列后跳转至步骤③。
5.如权利要求2所述的网卡驱动方法,其特征在于,所述步骤②中,在中断处理进程轮询各CPU的过程中,若所述网卡不存在于任一 CPU的数据接收设备队列及数据发送设备队列中,则将该网卡添加至负载最少的CPU的数据接收设备队列,之后跳转至步骤③。
6.如权利要求1所述的网卡驱动方法,其特征在于,所述网卡驱动过程二中,在将当前网卡从软中断置位的CPU的数据接收设备队列中摘除后,将该网卡挂入负载最少的CPU的数据发送设备队列中。
7.如权利要求3、5或6所述的网卡驱动方法,其特征在于,该方法中,判定其数据发送设备队列中设备数量最少的CPU为负载最少的CPU。
【文档编号】G06F13/10GK103440213SQ201310309455
【公开日】2013年12月11日 申请日期:2013年7月23日 优先权日:2013年7月23日
【发明者】刘炳伟, 王金桂 申请人:深圳市共进电子股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1