admin管理员组

文章数量:1535803

2024年4月1日发(作者:)

浅谈watchdogtimeout出现的原因Unix系统-电脑资料

[code:1:2d85a50892]浅谈watchdogtimeout出现的原因 最近

有比较多的人谈到网卡的”watchdogtimeout“问题,究竟是什么原

因造成的,大多数人都 把网卡的 性能 不佳做为问题的根源所在,。我

认为网卡的性能只是一方面的因素,他还涉及到缓冲的 大

[code:1:2d85a50892]浅谈"watchdog timeout"出现的原因

最近有比较多的人谈到网卡的”watchdog timeout“问题,究

竟是什么原因造成的,大多数人都

把网卡的性能不佳做为问题的根源所在。我认为网卡的性能只是

一方面的因素,他还涉及到缓冲的

大小、单位时间内的包的数量、及网卡驱动程序等一系列因素。

以下将从源代码的角度来对他进行

分析。

首先,我们看看到底是哪个函数发出了“watchdog timeout”

字符串,只要你查一下源代码

不难看出,在各网卡的驱动程序里的XX_watchdog(XX是各网

卡的名称,如:8139是rl,AMD7990

是pcn,Inter是fxp等等)函数发出的。函数比较简单:

static void rl_watchdog(ifp)

struct *ifp;/*申明ifp是一个ifnet结构,结构存放了该网卡

的输入输

出的函数指针和一些重要参数,当然也包括rl_watchdog函数的

指针*/

{

struct rl_softc *sc;

sc = ifp->if_softc; /*ifnet是softc结构的一个子集,softc包含

了更多的该网卡的参数*/

printf("rl%d: watchdog timeoutn", sc->rl_unit);/*打印出是哪

块网卡出现问题。

sc->rl_unit代办该种网卡的第几快。我们知道在一个机器里同样

的网卡可能有几块,当然此参数是由网卡驱动程序的初始化程序

填充*/

ifp->if_oerrors++; /*累计输出出现的错误包数量(o代表输出)

*/

rl_txeof(sc);/*这里是每个驱动程序不同的,此处为8139的,不

过我觉得用rl_stop(sc)更好*/

rl_rxeof(sc);/*这里也是每个驱动程序不同。我觉得来一个

rl_reset(sc)也不错。*/

rl_init(sc);/*这里大家都一样,重新初始芯片。*/

return;

}

好了,到这我们知道是XX_watchdog函数发出了

watchdog timeout信息。那么是谁来调用该函数呢?

我们接着来看另一个函数:if_slowtimo函数,该函数在if.c中。

if.c是interface(接口)的简称,

即系统在启动过程中初始化时必须调用其中的一些函数。ifinit函

数是其中被调用的一个,这个函数很

简单:

void

ifinit()

{

static struct timeout if_slowtim;

timeout_set(&if_slowtim, if_slowtimo, &if_slowtim);/*简单的

说就是设置一定时器*/

if_slowtimo(&if_slowtim);/*哈哈,等不急了,先调用了再说*/

}

这样一来,if_slowtimo就成了一个一定时间内就要执行的一个函

数了,此时候,大家应该能猜到if_slowtimo

的大概功能,无非是定时查看各网卡的发送数据的情况,如果没

本文标签: 网卡函数出现原因系统