新客网WWW.XKER.COM:致力做中国最专业的网络学院!
学院: 操作系统 - 网络应用 - 服务器 - 网络安全 - 工具软件 - 办公软件 - Web开发 - 数据库 - 网页设计 - 图形图像 - 媒体动画 - 硬件学堂 - 存储频道 - QQ专区
您的位置:首页 > 网络学院 > 操作系统 > Unix系统 > FreeBSD教程 > 正文:浅谈watchdog timeout出现的原因

浅谈watchdog timeout出现的原因

新客网 XKER.COM 2008-01-19 来源:新客网编辑整理 佚名 收藏本文

综上所述:引起watchdog timeout的主要原因为:1、缓冲区不够大,前面的没发完后面的又跟的来了。2、内核的内存分配出现问题,此情况比较少发生。3、卡的质量(在IO时的吞吐量)。如何解决些问题:

首先我们必须查出导致出现该问题的原因,即是这问题中的哪个引起的,我们来修改if.h中定义一全局变量:
u_int8_t myerror; /*意思是出错的原因代码,按我列的来吧,1是缓冲区不够...*/
在函数static void rl_start(ifp)中加入:

static void rl_start(ifp)

struct ifnet *ifp;

{

struct rl_softc *sc;

struct mbuf *m_head = NULL;

sc = ifp->if_softc;

u_int8_t tmperror;

if (RL_CUR_TXMBUF(sc) != NULL) {/*新加,假如是缓冲区不够问题*/

myerror=1;

}

while(RL_CUR_TXMBUF(sc) == NULL) {

IF_DEQUEUE(&ifp->if_snd, m_head);

if (m_head == NULL)

{

myerror=2; /*内存分配出错*/

break;

}

if (rl_encap(sc, m_head)) {

IF_PREPEND(&ifp->if_snd, m_head);

ifp->if_flags |= IFF_OACTIVE;

break;

}

if (ifp->if_bpf)

bpf_mtap(ifp, RL_CUR_TXMBUF(sc));

tmperror=myerror;/*在进行写IO口前先保存前面出错的原因*/

CSR_WR99vE_4(sc, RL_CUR_TXADDR(sc),

vtophys(mtod(RL_CUR_TXMBUF(sc), caddr_t)));

CSR_WR99vE_4(sc, RL_CUR_TXSTAT(sc),

RL_TXTHRESH(sc->rl_txthresh) |

RL_CUR_TXMBUF(sc)->m_pkthdr.len);

myerror=tmperror;/*上面两句没问题的话再还原前面的出错原因*/

RL_INC(sc->rl_cdata.cur_tx);

}

if (RL_CUR_TXMBUF(sc) != NULL)

ifp->if_flags |= IFF_OACTIVE;

ifp->if_timer = 5;

return;

}

最后再改一下rl_watchdog中的显示部分
printf("rl%d: watchdog timeout:error number is %x\n", sc->rl_unit,myerror); 当然这只是我个人的见解,可能有许多不足或没考虑到的地方,也希望大家能提出更好、更轻易的方法。

共2页: 上一页 [1] [2] 下一页
标签:
收藏】 【推荐】 【投稿】 【打印】 【关闭
发表评论
要记得去论坛讨论,点击注册新会员匿名评论
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
【重要声明】:新客网刊载此文仅为提供更多信息的目的,并不代表新客网同意文章的说法或描述,也不构成任何建议,对本文有任何异议,请在上面提出建议。
  • 阅读排行
  • 推荐阅读
  • 随机推荐