网络子系统5_设备队列规则

本文详细介绍了Linux内核网络子系统中关于设备队列规则的实现,包括设备描述符与队列规则相关字段、队列规则设置的时机、初始化及关闭过程。重点讲解了noop_qdisc和pfifo_fast_qdisc的使用,以及队列规则的创建、销毁和管理机制。
摘要由CSDN通过智能技术生成
//	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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值