S4突然出现 watchdogconnection reset原因是什么原因

转自:.cn/s/blog_4dffyzh.html
什么是Watchdog?
Watchdog,又称,是计算机可靠性()领域中一个极为简单同时非常有效的检测()工具。其基本思想是针对被监视的目标设置一个计数器和一个阈值,会自己增加计数值,并等待被监视的目标周期性地重置计数值。一旦目标发生错误,没来得及重置计数值,会检测到计数值溢出,并采取恢复措施(通常情况下是重启)。总结一下就是计数&&溢出&&触发。
Watchdog的工作方式是事件触发的,它可以对任何合理的事件计数(如指令)。其中时间事件()最常使用,这也是为什么又叫做。但无论统计什么事件,它的思想都是一样的。
归根结底,是一种检测手段,它监视的目标可以是一个进程也可以是整个操作系统。的合理性基于这样的假设:一个正常运行的系统,它的执行流应该是可预测的,因此可以在它正常执行路径上设置一些周期性重置的点;但如果系统发生故障,它可能执行不到下一个重置的点,此时故障将被捕捉到。看到这儿,您应该想到对于检测死循环或死锁这类故障非常有效。
Watchdog的实现
针对不同的监视目标,可以采取不同的实现方法。
监视一个进程
如果监视目标只是一个进程,那么利用操作系统提供的定时功能即可实现一个。
监视一个操作系统
如果要监视操作系统,就得使用操作系统之外的工具,通常是一个附加的计数器。现代都包含的也可以提供这样的功能,从而不需要额外的设备就能实现监视操作系统的。
关于操作系统的设计策略以及实现方法,可参考论文。
Watchdog&in&Linux
Linux很早就引进了,事实上,中有两套体系:
1)&The&Linux&Watchdog&driver&API
2)&NMI&watchdog
第一种网上已经有很多很好的讲解资料,比如这篇《》以及的和手册。&本文要详解的是第二种,即。
NMI&watchdog&in&Linux
NMI&watchdog是的开发者为了而添加的特性,但也能用来检测和恢复,现代多核体系都能支持。()即不可屏蔽中断,之所以要使用,是因为的监视目标是整个内核,而内核可能发生在关中断同时陷入死循环的错误,此时只有NMI能拯救它。
NMI&watchdog的思想如前所述,仍然是通过计数和阈值进行监控。要打开,只需要在中添加一句,重启之后就已经开启了。
Linux中有两种,分别是I/O&APIC&watchdog()和Local&APIC&watchdog()。它们的触发机制不同,但触发之后的操作是几乎一样的。从名字上看,它们都利用了,所以前面强调这是被现代多核体系支持的功能。下面介绍这两种的监测机制。
P.S.&我的内核版本是。
I/O&APIC&watchdog
如果已经熟悉了架构,那么再来了解就是易如反掌,相关资料可以先看看这篇《》热热身,然后看完最新的Intel&&64&and&IA-32&Architectures&Software&Developer's&Manual,&Volume&3:&System&Programming&Guide的第章《Advanced&Programmable&Interrupt&Controller&(APIC)》就够了,没有什么资料比手册更详尽了。
I/O&APIC&watchdog的工作方式比较奇葩,一旦开启了(),那么每个对应的的线都关联到,这样每个将周期性地接到(这个周期与的周期相同),接到中断的立即处理。处理的过程就是检查的(统计中断信息的结构体,多核系统中这将是个数组)中的和这两个字段的和,它们分别代表了当前从启动到现在处理的本地时钟中断次数和全局时钟中断次数。如果这两个值的和在一定时间(在我的机子上是秒)之内都没有增加,说明这个已经连续秒没有处理过一次时钟中断,显然,出大事了。
arch/x86/kernel/traps.c:&do_nmi,&default_do_nmi
arch/x86/kernel/dumpstack.c:&die_nmi
arch/x86/kernel/apic/nmi.c:&nmi_watchdog_tick
Local&APIC&watchdog
想了解也需要先看手册&&仍然是最新的Intel&&64&and&IA-32&Architectures&Software&Developer's&Manual,&Volume&3:&System&Programming&Guide,第章《》。这一章列出了所有体系的,内容超多,但只要看
18.2.3&Pre-defined&Architectural&Performance&Events
18.17&Performance&Monitoring&(P6&Family&Processor)
18.18&Performance&Monitoring&(Pentium&Processors)
这三部分就足矣。如果觉得手册内容太多或者看英文比较吃力,可以参考张银奎老师的《》第节,《性能监视》。
Intel&CPU带有,可以对的许多事件计数(系列多达到个,具体数目视型号而定),在中,统计的事件是,即处于非状态下经过的周期数。当计数溢出时,会向发出一个()。的属性可选,理所应当的,在中它被设置成。利用这个特性,就能周期性地产生。
发出之后,的行为就与几乎一样了,仍然是检查处理时钟中断的次数。唯一的区别是,在处理的过程中还多执行一项操作:重置。由于统计的是,所以系统空闲的时候,触发的频率比较低。
arch/x86/perfctr_watchdog.c:&lapic_wd_event
NMI&watchdog在发现故障之后调用了,我们来看看这个函数到底做了什么:
一个一个来解析:
notify_die通知对感兴趣、即订阅了的模块
show_registers调用输出出当前寄存器信息,别忘了本来是为了哦
根据和的值决定是否要,是的参数,是启动项参数,当然启动之后也可以通过动态修改它的值
do_exit就是恢复操作,陷入,进程有很大的嫌疑,所以退出当前进程有一定几率恢复系统运行。
对比两种,其实各有长短。
I/O&APIC&watchdog的缺点很明显&&每个时钟周期都要触发,这对性能是个不小的影响,引用的原话,而且可靠性不太好。我开启之后,写了个关中断死循环的并且加载到系统中,结果跪了&&这意味着没起作用。
Local&APIC&watchdog的触发频率要低一些,性能开销也要小一些。但是注意它统计的事件,,也就是说,万一进入了关中断的状态,那它也没救了,因为这时候计数器根本就不走了。但是却没有这个缺陷。但是就可靠性而言,的表现更好,我开启它之后通过注入了各种死锁,它居然都恢复了&&
Postscript
以上关于两种的说明,我已经省去了很多很多细节(),尤其是初始化。的初始化细节在arch/x86/kernel/apic/apic.c;的全部实现都在arch/x86/perfctr_watchdog.c。的初始化看得我都要吐血了
为了彻底了解的工作原理,我尝试了各种途径:
Stack&Overflow
Intel&Manual
Linux&Document
Source&code
几乎是一切有效的信息源全部用上了,但这其中真正有用的只有和。源代码就不说了,我原本只有两天时间来弄清楚,大树又多给我加了天时间之后,立即决定啃源码。所幸涉及到的代码总共也只有数千行,并且代码逻辑并不复杂。
另一方面,我查询了相关的邮件列表,并给相关的开发者发了邮件,只有一位的工程师回复了我,他的回信给了我非常大的帮助。不过他提到ah,&2.6.32,&uses&the&old&nmi_watchdog"&&old&nmi_watchdog!我在另一台内核版本为的机器上打开了,发现它们都没有起作用
即便我看遍了代码,还是有两个问题始终没有找到答案:
一、APIC_LVT0是怎么跟接上的,如何向所有发??
二、ESCR_MSR和的初始化参数到底是什么意思!!?
本次斗狗经历让我收获了许多:
一、对中断体系有了更深入的了解
二、第一次在没有直接指导的情况下啃
三、一次不同寻常的学习经历,反复列出疑点解决问题
四、Source&Insight真乃神器也!
五、原来在上问问题也有没有人回的时候!
以下转自:/sdphome/archive//2251042.html
1. 没有完美的代码
没有完美的人,更没有完美的代码。虽然教科书上说deadlock(死锁)多么不好不好,但是在现实生活中,很难把它完全消灭。假 设不小心内核出现了deadlock,可能你得干瞪眼。CPU就在那里空等着,空转着,叫天天不应,叫地地不灵。等到海枯石烂,CPU生锈的那一天,它还 会那么痴痴地等着那个霸占了锁的家伙会良心发现,解下这个锁。也许你会说,哎呀,这么麻烦干嘛?RESET一下,不就一了百了吗?但是如果是一台肩负重担 的Server(服务器),在夜深人静你正呼呼大睡的时候发生了deadlock呢?如果deadlock的原因没有查到,三天五天就会发生一次,光这样 被动的重启也不是办法&&
不用说让人心惊胆颤的deadlock,很多时候,一段小小的循环,就会把你彻底雷到。我们总认为循环是可以结束的,但是别要忘 记,事物都是辩证的,有的时候,碰巧发生了某些预料之外的条件,让这个循环成了彻彻底底的死循环。恰巧此时,CPU的中断如果已经被禁掉,那神仙也救不了 你。&我佛慈悲,能不能把循环给我停掉?&&阿弥陀佛,神仙也得遵守潜规则,你让我给你停掉循环,好歹也要给我一个中断,让我能够施法吧?&&&不能怪父 母,更不能怪政府,如果你正好在电脑旁边,可以RESET;如果你不在旁边,就等着老板的电话吧。&小福啊,今天又超过100位客户打电话投诉我们的交友 网站不能访问了,你赶紧打的到公司,看看是怎么回事。赶紧啊!有个客户说,如果今晚12点之前不能登录网站,取得要约会的5位MM的详细资料,他就会携带 人体炸弹到办公楼来砸场子&&&
2. 保留现场,强行重启
言归正传。如果应用程序进入死循环,我们可以把它KILL掉。如果内核因为意料之外的原因,导致系统进入无法自拔的死循环,最好的 办法就是让系统给强行重启。当然,这种重启最好是自动的,不需要人干预的,且最好能够打印出导致重启的原因,便于开发者调试错误。在Linux内核中,用 NMI看门狗(NMI Watchdog Timer)的方式来实现该机制。
在系统的正常运行过程当中,每秒都有非常多的中断产生。即便它啥都不做,啥外部中断都不接收,每秒至少有数以百计的用来给线程调度的时钟中断。(如果调度时间片为10ms,则有100个时钟中断。)假设如果内核发现5秒钟之内,没有产生一个中断,那将会是怎么一回事呢?
这个时候,CPU会辩解道:&我兢兢业业地执行每一条指令,有没有中断不干我的事,叫我干啥就干啥,我是真正的劳动模范,不要怀疑 我会捣鬼。中断既来之,我就安之。不来之,则说明中断已经被禁掉了。肯定是有个幕后黑手已经调用CLI之类的指令关闭了全局的外部中断,然后偷偷摸摸干自 己相干的事情,不被其他人给打断。人都有自己的隐私嘛,代码也不例外。屏蔽中断,执行不被打断的代码,人之常情。但是用得不恰当,如同毒品一样,就会出现 大问题。少量鸦片,可以当作药品;携带超过5克海洛因,就得上刑场。禁掉中断占用一点点CPU时间,可以让程序很容易地绕开race condition(竞争条件);但是如果中断被禁掉的时间长达5秒钟,那就违反常理了。5秒钟之内系统不会有其他响应,其影响之深远,罪行之恶劣,不用 满清十大酷刑简直不足以平息民愤&&&
&该杀!该杀!&这个时候,内存,芯片组,硬盘&&所有硬件都附和。看来CPU还是一直是IT届的老大。不怪我们不客气了,赶紧打 印出现场(CPU出现LOCKUP时的相关上下文,包括寄存器值,函数调用栈等),且记入LOG,作为判案的证据,同时有警示后人只用。接着,就对施以极 刑,给内核来一个oops,彻底终止它的执行,让它重新启动。
3. 少林扫地僧&&NMI
不对,不对!也许你有这样的感觉,既然5秒之内没有一个中断,基本肯定中断是已经被禁掉了,那CPU就被迫只会一直执行那段有问题 的代码,根本没有机会来执行所谓的&保留现场,强行重启&的代码。这些代码放在内核的另外一个地方,要调用它,必须由中断出发。可是,可是中断不是已经被 禁了吗?借尸还魂?恐怖,恐怖&&
&再厉害的黑社会,也斗不过我们人民警察!&这个时候,CPU又冷笑了,&虽然中断被禁掉了,但是,我还拥有秘密武器。那就是 Non-maskable interrupt,不可屏蔽中断,简称NMI。你要禁,只能禁掉一般的可屏蔽中断。NMI,我压根就让你摸不着,碰不着!&
原来,内核中隐藏着一个神秘的高手,那就是NMI。我们调用spin_lock_irq,虽然能够禁掉本地的中断,但是NMI却不 行。内核中设置了一个watchdog timer,它的中断类型就被置为NMI,每过一定的时间,这个timer就执行一次,用来悄悄监视系统的运行。如果系统正常,它啥事都不做,仅仅是更改 一些时间计数;如果系统不正常(默认5秒没有任何普通外部中断),那它就闲不住了,会立马跳出来,且中止之前程序的运行。该出手时就出手!
我想到了在血腥的武林当中,有无数的高手。刚开始的时候,似乎人人都是高手;但后来,昔日的高手看起来都是菜鸟,强中更有强中手。 再后来,更高的高手出来了,开始这里论剑那里比武,争霸天下了。最后来,天下也许是第一第二的高手开始决战&&似乎故事就这个时候结束了,但是让人大跌眼 镜的是,一个小小的少林扫地僧,却能轻易地两位顶尖高手制服。NMI就是这样的角色,平时从不站在前台,也很少为人所知。除了用NMI watchdog timer监测系统是否锁住之外,一些特殊的严重的硬件错误,比如内存奇偶校验错等,也会触发NMI的发生。不过这些错误,估计很多人从来不会碰到过。
4. More...
如果出现死循环的地方没有把中断禁掉,那是不是不会触发NMI watchdog timer了呢?理论上是的。至少Linux2.6的抢占内核应该不会触发。但是,由于系统还是有机会调度到其他线程,所以整个系统可能响应很慢,但不至 于给死掉。我们可以通过top命令查看进程状况等手段来进行分析。
不是所有的Linux内核都支持NMI watchdog timer的。必须在内核中添加APIC的支持。(现在的内核和硬件一般都是没有问题的)如果是x86-64的硬件体系结构,APIC是被默认支持的。在很多发行版本当中,需要在启动的时候添加内核启动参数
nmi_watchdog=N
来启动NMI watchdog timer。N代表了该timer的source,如果为1,表示利用IO APIC的始终源;如果为2,表示利用LOCAL APIC的performance counter。具体哪个好用,可以分别测试一下,一般来说,比较新的CPU(一般都是双核了)选择2的话,系统负担更小一点。想要更多的了解NMI watchdog timer,请看如下的kernel文档
http://www.kernel.org/doc/Documentation/nmi_watchdog.txt
想要知道啥时APIC(注意不是ACPI),啥是IO APIC,啥是LOCAL APIC,那就请google一下吧。
阅读(...) 评论()君,已阅读到文档的结尾了呢~~
看门狗(WatchDog),watchdog,linux watchdog,watchdog.sys,python watchdog,watchdog是什么意思,android watchdog,watchdog是什么文件夹,watchdog violation,watchdog timer
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
看门狗(WatchDog)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口如何处理蓝屏出错 DPC WATCHDOG VIOLATION我按照网上那种方式不行的_百度知道变流系统常见故障解决方法080610_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
变流系统常见故障解决方法080610
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢& & [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&i.net*/*申明ifp是一个ifnet结构,结构存放了该网卡的输入输& & 出的函数指针和一些重要参数,当然也包括rl_watchdog函数的& & 指针*/& & {& & struct&rl_softc
*& & sc&=&ifp->if_&/*ifnet是softc结构的一个子集,softc包含了更多的该网卡的参数*/& & printf("rl%d:&watchdog&timeout\n",&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);/*这里大家都一样,重新初始芯片。*/& && & }& & 好了,到这我们知道是XX_watchdog函数发出了watchdog&timeout信息。那么是谁来调用该函数呢?& & 我们接着来看另一个函数:if_slowtimo函数,该函数在if.c中。if.c是interface(接口)的简称,& & 即系统在启动过程中初始化时必须调用其中的一些函数。ifinit函数是其中被调用的一个,这个函数很& & 简单:& & void& & ifinit()& & {& & static&struct&timeout&if_& & timeout_set(&if_slowtim,&if_slowtimo,&&if_slowtim);/*简单的说就是设置一定时器*/& & if_slowtimo(&if_slowtim);/*哈哈,等不急了,先调用了再说*/& & }& & 这样一来,if_slowtimo就成了一个一定时间内就要执行的一个函数了,此时候,大家应该能猜到if_slowtimo& & 的大概功能,无非是定时查看各网卡的发送数据的情况,如果没发送完成,就给该卡加一个计数器,到& & 计数器达到一定的值时还没发送出去就调用该卡的XX_watchdog函数。下面我们来看看if_slowtimo函数。& & void& & if_slowtimo(arg)& & void&*& & {& & struct&timeout&*to&=&(struct&timeout&*)& & struct&ifnet&*& & int&s&=&splimp();/*在做以下操作的时候必须关中断*/& & TAILQ_FOREACH(ifp,&&ifnet,&if_list)&{/*搜索每一个接口设备,TAILQ_FOREACH实际上是for(...)*/& & if&(ifp->if_timer&==&0&||&--ifp->if_timer)& &/*如果是if_timer为0或if_timer减1以后还为真,实际上是对每块网卡& & 的计数器if_timer减1后判断他是否还大于0,小于0就调用watchdog函数。*/& & if&(ifp->if_watchdog)&/*不过调用之前看看该卡有没有watchdog函数*/& & (*ifp->if_watchdog)(ifp);& & }& & splx(s);& & timeout_add(to,&hz&/&IFNET_SLOWHZ);/*每次计时器完成后都会清除,你不得不又加上去。hz是计算& & 机的主频,就是说调度的间隔时间是和主频成正比的关系。*/& & }& & 到这里一切都很明白了,我们只要在驱动程序的输出包时给定一个值(if_timer,大多数是5),而输出函数是一个& & 直到输出成功才跳出的循环,不成功他就一直重试来输出此包,而我们上面的程序就会时间一到就给你的值减1,如果& & 减到小于0了,就watchdog&timeout。我们还是来看一看程序吧:& & static&void&rl_start(ifp)& & struct&ifnet
*& & {& & struct&rl_softc
*& & struct&mbuf
*m_head&=&NULL;& & sc&=&ifp->if_& & while(RL_CUR_TXMBUF(sc)&==&NULL)&{/*&1:当输出缓冲区为空时才进行新的输出*/& & IF_DEQUEUE(&ifp->if_snd,&m_head);/*把将要输出的数据加入到输出队列中。*/& & if&(m_head&==&NULL)/*&2:申请内存失败*/& && & if&(rl_encap(sc,&m_head))&{/*8139卡的弱智表现在此,多加一个头部,还要长字节对齐,影响& & 到数据必须重新搬迁。花时间啊!*/& & IF_PREPEND(&ifp->if_snd,&m_head);& & ifp->if_flags&|=&IFF_OACTIVE;& && & }& & if&(ifp->if_bpf)/*&3:如果包过滤存在就进行过滤*/& & bpf_mtap(ifp,&RL_CUR_TXMBUF(sc));& & CSR_WRITE_4(sc,&RL_CUR_TXADDR(sc),/*&4:以下为硬件输出的IO指令*/& & vtophys(mtod(RL_CUR_TXMBUF(sc),&caddr_t)));& & CSR_WRITE_4(sc,&RL_CUR_TXSTAT(sc),& & RL_TXTHRESH(sc->rl_txthresh)&|& & RL_CUR_TXMBUF(sc)->m_pkthdr.len);& & RL_INC(sc->rl_cdata.cur_tx);& & }& & if&(RL_CUR_TXMBUF(sc)&!=&NULL)/*如果传送缓冲不为空,说明数据放到缓冲中已经准备传了*/& & ifp->if_flags&|=&IFF_OACTIVE;/*加上正在传标志*/& & ifp->if_timer&=&5;/*设定计数器为5*/& && & }& & 大家注意看我注释中的1,2,3,4标号,即是4个有可能使传送出现问题的地方。但大家也会问:即使我传送& & 成功了也会if_timer变成5啊,那么成功了后是怎么消除这个5的呢,答案在当传送完一个包后,网卡将产生一个& & 中断,我们来看中断程序:& & static&void&rl_intr(arg)& & {& & ...&&这中间我就不写了& & if&((status&&&RL_ISR_TX_OK)&||&(status&&&RL_ISR_TX_ERR))&&/*如果中断后状态寄存器的标识& & 是成功或出错,就调用下面的程序。*/& & rl_txeof(sc);& & ...& & }& & 再看rl_txeof:& & static&void&rl_txeof(sc)& & {& & ...& & ifp->if_timer&=&0;/*哈哈,在这清0了,也就是说,只要你不是反复在那传,不过错误和传输正确& & 都不会出现"watchdog&timeout"*/& & ...& & }& & 综上所述:引起watchdog&timeout的主要原因为:1、缓冲区不够大,前面的没发完后面的又跟的来了。2、内核& & 的内存分配出现问题,此情况比较少发生。3、卡的质量(在IO时的吞吐量)。4、bpf过滤过于复杂引起。& & 如何解决这个问题:& & 首先我们必须查出导致出现该问题的原因,即是4个问题中的哪个引起的,我们来修改驱动程序和相关的程序:& & 在if.h中定义一全局变量:& & u_int8_t&&&&/*意思是出错的原因代码,按我列的来吧,1是缓冲区不够...*/& & 在函数static&void&rl_start(ifp)中加入:& & static&void&rl_start(ifp)& & struct&ifnet
*& & {& & struct&rl_softc
*& & struct&mbuf
*m_head&=&NULL;& & sc&=&ifp->if_& & u_int8_t&& & 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;&/*内存分配出错*/& && & }& & if&(rl_encap(sc,&m_head))&{& & IF_PREPEND(&ifp->if_snd,&m_head);& & ifp->if_flags&|=&IFF_OACTIVE;& && & }& & if&(ifp->if_bpf)& & bpf_mtap(ifp,&RL_CUR_TXMBUF(sc));& & tmperror=/*在进行写IO口前先保存前面出错的原因*/& & CSR_WRITE_4(sc,&RL_CUR_TXADDR(sc),& & vtophys(mtod(RL_CUR_TXMBUF(sc),&caddr_t)));& & CSR_WRITE_4(sc,&RL_CUR_TXSTAT(sc),& & RL_TXTHRESH(sc->rl_txthresh)&|& & RL_CUR_TXMBUF(sc)->m_pkthdr.len);& & myerror=/*上面两句没问题的话再还原前面的出错原因*/& & RL_INC(sc->rl_cdata.cur_tx);& & }& & if&(RL_CUR_TXMBUF(sc)&!=&NULL)& & ifp->if_flags&|=&IFF_OACTIVE;& & ifp->if_timer&=&5;& && & }& & 最后再改一下rl_watchdog中的显示部分& & printf("rl%d:&watchdog&timeout:error&number&is&%x\n",&sc->rl_unit,myerror);& & 当然这只是我个人的见解,可能有许多不足或没考虑到的地方,也希望大家能提出更好、更容易& & 的方法。& & xie_minix&于&[/code:1:2d85a50892]& & & & 原文转自:http://www.ltesting.net
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
上一篇:下一篇:
相关经验教程
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
论文写作技巧}

我要回帖

更多关于 三星s4屏幕突然变黄 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信