重新修改Linux 超线程通过添加单个 printk 消息htb_dequeue功能。
static struct sk_buff *htb_dequeue(struct Qdisc *sch)
{
... original code
... original code
for (level = 0; level < TC_HTB_MAXDEPTH; level++) {
printk("Current level in loop is: %d\n", level);
... original code
}
}
官方文档中说:
每个类都分配有级别。叶子类的级别始终为 0,根类的级别为 TC_HTB_MAXDEPTH-1。内部节点的级别比其父节点低一级。
我运行了以下示例:
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 40kbps ceil 100kbps
root
|
|
class rate 100kbps ceil 100kbps
|
Leaf rate 40kbps ceil 100kbps
高度应为 2 或 3,不超过 3
但是,运行此程序后,我检查 dmesg 中的输出,得到以下信息:
Current level in loop is: 0
Current level in loop is: 1
Current level in loop is: 2
Current level in loop is: 3
Current level in loop is: 4
Current level in loop is: 5
Current level in loop is: 6
Current level in loop is: 7
我不知道为什么会出现这样的输出,所以我用下面的图表再次运行了它
root
|
|
class rate 100kbps ceil 100kbps
|
class rate 70kbps ceil 100kbps
|
Leaf rate 40kbps ceil 100kbps
我在 dmesg 中看到了相同的输出......
添加 printk 后,我确保正确编译了内核
make
make modules_install
make install
update-initramfs -c -k 4.17.0+
update-grub
重新启动机器,并且内核已更新,因为我有 printk 的输出。
我的问题是:为什么高度是 7 而不是 2 ?