网卡驱动:传输超时watchdog_timeo/ndo_tx_timeout

本文深入探讨了Linux网络子系统如何通过watchdog_timeo和ndo_tx_timeout函数来实现对传输超时的处理。以rtl8169网卡驱动为例,详细解释了如何在发生超时时进行硬件重置和设备初始化操作。
网络子系统提供了对传输超时的处理框架,在驱动程序中要支持传输超时处理,只需要实现net_device的watchtimeo和net_device_ops中的ndo_tx_timeout函数。

1】watchdog_timeo

【作用】用于实现传出超时的时间设定。

1】ndo_tx_timeout

【作用】在发送队列停止(netif_queue_stopped(dev)返回1),且watchdog_timeo到期的时候,内核网络子系统会调用ndo_tx_timeout来进行处理


========用法========

ndo_tx_timeout的实现多种多样,可以根据具体的情况来实现。

关于定时器的信息,参照内核定时器介绍。


在linux2.6内核的rtl8169网卡驱动的实现上,在rtl8169_tx_timeout上就调用了两个函数:

rtl8169_hw_reset()

rtl8169_shedule_work()

其中前一个参数实现了硬件reset。

后一个函数完成了设备缓冲区等初始化任务。

---------------源码---------------

static void rtl8169_tx_timeout(struct net_device *dev)
{
                  struct rtl8169_private *tp = netdev_priv(dev);

                   rtl8169_hw_reset(tp->mmio_addr);
                   rtl8169_schedule_work(dev, rtl8169_reset_task);
 }
我走这个流程的时候 “上电,烧写编译文件,进入内核,加载pcie网卡以及相关驱动,然后配置网卡IP,然后cat /proc/interrupts,获取网卡的中断信息为 “100: 193 0 0 0 0 0 0 0 udrv_msi 524288 Edge eth0 ”,然后echo 3 > /proc/irq/<irq_num>/smp_affinity_list”<irq_num>=100时,绑定成功,但是当我使用网卡ip去ping PC端的IP的时候,出现下面的报错: “PING 192.168.0.10 (192.168.0.10): 56 data bytes [ 225.025801] ------------[ cut here ]------------ [ 225.030440] NETDEV WATCHDOG: eth0 (r8169): transmit queue 0 timed out [ 225.036948] WARNING: CPU: 6 PID: 0 at net/sched/sch_generic.c:467 dev_watchdog+0x378/0x380 [ 225.045246] Modules linked in: realtek r8169 hi309a_pcie_api_test(O) hi309a_eth_drv(O) hi309a_mag(O) hi309a_ppe(O) hi309a_poe(O) hi309a_urm(O) hns_mdio hi309a_mii_mac(O) hi309a_watchdog(O) hi309a_djtag(O) ahci_platform libahci_platform libahci libata usb_storage sd_mod scsi_mod xhci_plat_hcd hi309a_usb_hisi(O) xhci_hcd usbcore hi309a_lbc(O) hi309a_tsensor(O) hi309a_log(O) hi309a_sata(O) hi309a_pcie(O) hi309a_serdes(O) hi309a_sfc(O) hi309a_pmbus(O) hi309a_i2c(O) hi309a_spi(O) hi309a_gpio(O) hi309a_pinctrl(O) hi309a_subctrl(O) ksecurec(O) [ 225.093033] CPU: 6 PID: 0 Comm: swapper/6 Tainted: G O 5.10.0 #14 [ 225.100457] Hardware name: Hisilicon PhosphorHi1230 EMU (DT) [ 225.106139] pstate: 60400009 (nZCv daif +PAN -UAO -TCO BTYPE=--) [ 225.112170] pc : dev_watchdog+0x378/0x380 [ 225.116195] lr : dev_watchdog+0x378/0x380 [ 225.120218] sp : ffff800011d6bd50 [ 225.123544] x29: ffff800011d6bd50 x28: 0000000000000000 [ 225.128878] x27: 0000000000000001 x26: 0000000000000004 [ 225.134212] x25: 00000000000001c0 x24: 00000000ffffffff [ 225.139546] x23: 0000000000000006 x22: ffff0004cc378440 [ 225.144880] x21: ffff8000119b6000 x20: ffff0004cc378000 [ 225.150214] x19: 0000000000000000 x18: 0000000000000006 [ 225.155547] x17: 0000000000000000 x16: 0000000000000000 [ 225.160881] x15: ffff800011d6b870 x14: ffff800091d6ba27 [ 225.166215] x13: ffff8000119d01d8 x12: 0000000000001467 [ 225.171549] x11: 00000000000006cd x10: ffff800011a281d8 [ 225.176882] x9 : ffff8000119d01d8 x8 : 00000000ffffefff [ 225.182217] x7 : ffff800011a281d8 x6 : c0000000fffff000 [ 225.187551] x5 : 000000000000bff4 x4 : 0000000000000000 [ 225.192886] x3 : 0000000000000000 x2 : 0000000000000000 [ 225.198219] x1 : 0000000000000000 x0 : ffff0004c0148000 [ 225.203553] Call trace: [ 225.206010] dev_watchdog+0x378/0x380 [ 225.209689] call_timer_fn.constprop.0+0x24/0x80 [ 225.214324] expire_timers+0xf8/0x11c [ 225.218001] run_timer_softirq+0x138/0x370 [ 225.222114] __do_softirq+0x114/0x268 [ 225.225791] irq_exit+0xec/0xf4 [ 225.228945] __handle_domain_irq+0x80/0xe0 [ 225.233057] gic_handle_irq+0xc0/0x140 [ 225.236819] el1_irq+0xac/0x140 [ 225.239974] arch_cpu_idle+0x18/0x30 [ 225.243562] default_idle_call+0x38/0xb0 [ 225.247501] do_idle+0x24c/0x320 [ 225.250741] cpu_startup_entry+0x28/0x60 [ 225.254679] secondary_start_kernel+0x148/0x194 [ 225.259227] ---[ end trace a95279cf704ce9e4 ]--- ” 请帮我结合代码进行详细分析,并给出解决方案
最新发布
09-23
### 三级标题:CLOCK_WATCHDOG_TIMEOUT 蓝屏错误概述 Windows 系统中的 `CLOCK_WATCHDOG_TIMEOUT` 错误通常发生在系统时钟或定时器无法正常工作时。这种错误会导致看门狗定时器超时,从而触发系统崩溃并显示蓝屏[^1]。 ### 三级标题:常见原因分析 导致 `CLOCK_WATCHDOG_TIMEOUT` 错误的原因可能包括: - **软件冲突**:某些软件或驱动程序之间的冲突可能导致定时器失效。 - **硬件故障**:主板、CPU 或内存等硬件组件的故障也可能引发此问题。 - **电源问题**:不稳定的电源供应可能会导致系统重启,进而触发看门狗定时器。 ### 三级标题:解决方案详解 针对 `CLOCK_WATCHDOG_TIMEOUT` 错误,可以尝试以下几种解决方法: #### 检查和更新驱动程序 确保所有设备驱动程序都是最新的。过时或损坏的驱动程序可能导致系统不稳定。可以通过设备管理器检查并更新驱动程序。 #### 检查硬件状态 使用工具如 CPU-Z 检测硬件状态,特别是主板、CPU 和内存是否有故障。对于内存条,可以尝试拔下并重新插入,或者用橡皮擦清洁金手指部分[^4]。 #### 检查电源供应 使用稳定的电源适配器,并确保电源供应稳定。如果可能,更换电源适配器以排除电源问题。 #### 修改 BIOS 设置 对于某些主板(如七彩虹 B550M),关闭 NX-MODE 可能会解决问题。这是因为 Hyper-V 要求开启 DEP,而某些主板设置可能导致兼容性问题[^3]。 #### 调整系统设置 在命令提示符中运行以下命令来取消内存限制: ```shell bcdedit /deletevalue increaseuserva ``` 执行完该命令后重启计算机,这有助于解决由于虚拟机软件内存限制引起的蓝屏问题[^2]。 #### 分析蓝屏日志 通过分析蓝屏日志文件(位于 C:\Windows\Minidump 目录下),可以获取更多关于蓝屏的具体信息,帮助定位问题根源。 ### 三级标题:预防措施 为了防止 `CLOCK_WATCHDOG_TIMEOUT` 错误再次发生,建议采取以下预防措施: - 定期更新操作系统和软件,减少冲突的可能性。 - 使用稳定的电源环境,为电脑提供干净的电力供应。 - 定期进行硬件检查,及时发现并解决潜在问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值