// 1.设备描述符与队列规则相关的字段:
// 1.1 dev->tx_queue_len 指示驱动程序规则队列的队列长度,在注册设备时使用,通知核心是否为设备提供队列规则机制.
// 1.1.1 不适用队列规则=0
// 1.1.2 使用队列规则>0
// 1.2 dev->qdisc,执行设备传输时,qdisc_run,dev_queue_xmit始终通过该字段获取设备当前使用的队列规则。
// 1.3 dev->qdisc_sleep, 保存设备具备传输能力时,使用的设备队列。
// 2.设备队列规则设置的时机:
// 2.1 注册设备(register_netdevice)时,设置为noop_qdisc
// 2.2 开启设备(dev_open)时,创建新的队列规则。
// 2.3 关闭设备(dev_close)时,设置dev->qdisc为noop_qdisc,表示在设备关闭的过程中,任何的传输都会被丢弃
// 初始化设备的队列规则
// 调用路径:register_netdevice->dev_init_scheduler
1.1 void dev_init_scheduler(struct net_device *dev)
{
//获取qdisc_tree_lock,dev->queue_lock,并关软中断
qdisc_lock_tree(dev);
//设置dev的队列规则
dev->qdisc = &noop_qdisc;
dev->qdisc_sleeping = &noop_qdisc;
INIT_LIST_HEAD(&dev->qdisc_list);
//开锁
qdisc_unlock_tree(dev);
//队列看门狗
dev_watchdog_init(dev);
}
//初始化看门狗
1.2 static void dev_watchdog_init(struct net_device *dev)
{
//初始化定时器
init_timer(&dev->watchdog_timer);
dev->watchdog_timer.data = (unsigned long)dev;
//定时器函数
dev->watchdog_timer.function = dev_watchdog;
}
// 队列规则使用的看门狗定时器
// 看门狗函数执行的条件:
// 1.设备在系统中
// 2.设备处于IFF_UP状态
// 3.设备有载波
// 4.传输没有被关闭
// 5,上一次传输距离现在已经超过了到期时间
1.3 static void dev_watchdog(unsigned long arg)
{
struct net_device *dev = (struct net_device *)arg;
//持有hard_start_xmit的保护锁
spin_lock(&dev->xmit_lock);
//判断如果设备的队列规则不是noop_qdisc
if (dev->qdisc != &noop_qdisc) {
//检查设备是否存在,_PRESENT标志
if (netif_device_present(dev) && netif_running(dev) && netif_carrie
网络子系统5_设备队列规则
最新推荐文章于 2023-08-25 15:01:03 发布
本文详细介绍了Linux内核网络子系统中关于设备队列规则的实现,包括设备描述符与队列规则相关字段、队列规则设置的时机、初始化及关闭过程。重点讲解了noop_qdisc和pfifo_fast_qdisc的使用,以及队列规则的创建、销毁和管理机制。
摘要由CSDN通过智能技术生成