日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

netdev: dev_watchdog timer(结合stmmac 分析)

發(fā)布時(shí)間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 netdev: dev_watchdog timer(结合stmmac 分析) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

分析netdev看門狗定時(shí)器

?

1. dev_watchdog()作為定時(shí)器回調(diào)函數(shù)會被周期執(zhí)行

在dev_watchdog()中,如果 if (netif_xmit_stopped(txq) && time_after(jiffies, (trans_start + dev->watchdog_timeo)))?成立,執(zhí)行some_queue_timedout = 1,?然后便調(diào)用ndo_tx_timeout。

ndo_tx_timeout函數(shù)便是網(wǎng)卡發(fā)送異常(數(shù)據(jù)發(fā)不出去等)時(shí)的超時(shí)處理函數(shù)。它會調(diào)用 stmmac_tx_timeout重新啟動transmission。

if (some_queue_timedout) {WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s (%s): transmit queue %u timed out\n",dev->name, netdev_drivername(dev), i);dev->netdev_ops->ndo_tx_timeout(dev); }

?

2. dev_watchdog()執(zhí)行ndo_tx_timeout的條件

if (netif_xmit_stopped(txq) && time_after(jiffies, (trans_start + dev->watchdog_timeo)))

?

2.1 time_after(jiffies, (trans_start + dev->watchdog_timeo))

即queue發(fā)送超時(shí)

1)dev->watchdog_timeo為定時(shí)周期

2)在 __netdev_start_xmit中,如果 ndo_start_xmit返回 NETDEV_TX_OK(這并不代表數(shù)據(jù)已經(jīng)通過DMA發(fā)送出去),便調(diào)用 txq_trans_update更新txq->trans_start。在dev_watchdog中,會將txq->trans_start賦值給trans_start。

?

2.2 netif_xmit_stopped(txq)

queue已經(jīng)停止發(fā)送

static inline bool netif_xmit_stopped(const struct netdev_queue *dev_queue) {return dev_queue->state & QUEUE_STATE_ANY_XOFF; }#define QUEUE_STATE_ANY_XOFF (QUEUE_STATE_DRV_XOFF | QUEUE_STATE_STACK_XOFF) #define QUEUE_STATE_DRV_XOFF (1 << __QUEUE_STATE_DRV_XOFF) #define QUEUE_STATE_STACK_XOFF (1 << __QUEUE_STATE_STACK_XOFF)

1)__QUEUE_STATE_STACK_XOFF

清除__QUEUE_STATE_STACK_XOFF:

如果DMA發(fā)送完成,在中斷服務(wù)程序 stmmac_dma_interrupt() ->? stmmac_poll() ->? stmmac_tx_clean() ->? netdev_tx_completed_queue() ->? test_and_clear_bit(__QUEUE_STATE_STACK_XOFF, &dev_queue->state)? 清除

?

設(shè)置__QUEUE_STATE_STACK_XOFF:

發(fā)送時(shí),在stmmac_xmit() ->?netdev_tx_sent_queue() ->?set_bit(__QUEUE_STATE_STACK_XOFF, &dev_queue->state)?設(shè)置

?

所以如果dma中斷沒有被觸發(fā),或是觸發(fā)了但是發(fā)送沒有完成,則netif_xmit_stopped()返回1

static inline void netdev_tx_sent_queue(struct netdev_queue *dev_queue,unsigned int bytes) { #ifdef CONFIG_BQLdql_queued(&dev_queue->dql, bytes);if (likely(dql_avail(&dev_queue->dql) >= 0))return;set_bit(__QUEUE_STATE_STACK_XOFF, &dev_queue->state);/* check again in case another CPU has just made room avail */if (unlikely(dql_avail(&dev_queue->dql) >= 0))clear_bit(__QUEUE_STATE_STACK_XOFF, &dev_queue->state); #endif }static inline void netdev_tx_reset_queue(struct netdev_queue *q) { #ifdef CONFIG_BQLclear_bit(__QUEUE_STATE_STACK_XOFF, &q->state);dql_reset(&q->dql); #endif }static inline void netdev_tx_completed_queue(struct netdev_queue *dev_queue,unsigned int pkts, unsigned int bytes) { #ifdef CONFIG_BQLif (unlikely(!bytes))return;dql_completed(&dev_queue->dql, bytes);if (dql_avail(&dev_queue->dql) < 0)return;if (test_and_clear_bit(__QUEUE_STATE_STACK_XOFF, &dev_queue->state))netif_schedule_queue(dev_queue); #endif }

2) __QUEUE_STATE_DRV_XOFF

主要針對網(wǎng)卡queue,當(dāng)queue滿或不足以進(jìn)行下一個(gè)傳輸時(shí),會調(diào)用netif_tx_stop_queue通知上層停止發(fā)送。當(dāng)queue恢復(fù)時(shí),調(diào)用netif_tx_wake_queue通知上層重新開始傳輸。

?

清除__QUEUE_STATE_DRV_XOFF:

stmmac_open ->?stmmac_start_all_queues ->?netif_tx_start_queue ->?clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state)

stmmac_dma_interrupt ->?stmmac_poll -> stmmac_tx_clean ->?netif_tx_wake_queue

?

設(shè)置__QUEUE_STATE_DRV_XOFF:

static __always_inline void netif_tx_start_queue(struct netdev_queue *dev_queue) {clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state); }void netif_tx_wake_queue(struct netdev_queue *dev_queue) {if (test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state)) {struct Qdisc *q;rcu_read_lock();q = rcu_dereference(dev_queue->qdisc);__netif_schedule(q);rcu_read_unlock();} }static __always_inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) {set_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state); }

?

總結(jié)

以上是生活随笔為你收集整理的netdev: dev_watchdog timer(结合stmmac 分析)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 激情国产一区 | 亚洲精品男人的天堂 | 拍国产真实乱人偷精品 | 久操av | 亚洲av无码乱码国产麻豆 | 成人黄色激情网 | xxxxav| 国产一区精品久久 | 亚欧日韩 | 天天弄天天操 | 国产精品热久久 | 国产精品不卡在线观看 | 4色av| 亚洲日本色图 | 国产精品亚洲无码 | 成人羞羞国产免费动态 | a猛片免费播放 | 涩涩成人网 | 婷婷五月在线视频 | 欧美激情网 | 在线无码va中文字幕无码 | 久久高清无码视频 | 天天看片天天干 | 久久久久亚洲av无码a片 | 亚洲精品乱码久久久久久蜜桃动漫 | 男人的天堂免费视频 | 97日韩精品| 古装做爰无遮挡三级聊斋艳谭 | 天堂素人 | 狠狠躁夜夜躁人人爽视频 | 日本一区二区三区电影在线观看 | 日韩极品视频在线观看 | 男人操女人视频网站 | 在线免费观看视频 | 色哟哟免费观看 | 牛牛热在线视频 | 波多野结衣在线影院 | 俄罗斯毛片基地 | 国产一区二区三区在线播放无 | 欧美成人女星 | 免费人妻精品一区二区三区 | 国产成年人网站 | 亚洲图片偷拍区 | 欧美一级啪啪 | 天堂а√在线中文在线新版 | 亚洲成人精品一区二区三区 | 欧美丰满少妇 | 中文在线а√在线 | 秋霞在线观看秋 | 亚洲系列| 在线免费视频一区 | 老司机久久 | 中文字幕视频网 | 在线免费观看中文字幕 | 色婷婷一区二区三区四区 | 99久久99久久精品国产片果冻 | 特级西西人体444www | 久久嫩草精品久久久久 | 9l视频自拍九色9l视频 | 中文字幕人妻精品一区 | 少妇高潮大叫好爽喷水 | 99re在线观看| 久久久久人妻一区 | 麻豆av免费在线观看 | 香蕉视频一级 | 国产的av| 中国毛片在线观看 | 国产日韩欧美中文字幕 | 亚洲一区天堂 | 天天弄天天操 | 色亭亭 | 中文字幕一区二区人妻视频 | 我们的2018在线观看免费高清 | 国产粉嫩av | 久久九九久精品国产免费直播 | 极品尤物魔鬼身材啪啪仙踪林 | 日本人体一区 | 秋霞成人 | 国产美女三级无套内谢 | 色网址在线 | av不卡在线 | juliaann欧美二区三区 | 国产在线二区 | 青草视频在线播放 | 人人爱超碰 | 日韩一级片免费在线观看 | 黑人满足娇妻6699xx | 日剧大尺度床戏做爰 | 日韩少妇裸体做爰视频 | 日本韩国欧美一区二区三区 | 红桃视频在线播放 | 手机在线永久免费观看av片 | 亚洲精品水蜜桃 | 男女激情啪啪 | 免费在线观看你懂的 | 精品人妻午夜一区二区三区四区 | 亚洲日日骚 | 最新永久地址 | 国产第一页在线 |