Linux认证辅导:Linux内核中流量控制(6)Linux认证考试
文章作者 100test 发表时间 2009:11:11 16:18:21
来源 100Test.Com百考试题网
4.2 Qdisc操作结构的一些基本操作/* net/sched/sch_api.c */ // 登记Qdisc操作结构, 每种排队算法都是通过Qdisc操作结构实现的
int register_qdisc(struct Qdisc_ops *qops)
{
struct Qdisc_ops *q, **qp.
int rc = -EEXIST.
write_lock(&.qdisc_mod_lock).
// qdisc_base是全局变量, 系统的Qdisc操作结构链表头
//遍历Qdisc操作链表
for (qp = &.qdisc_base. (q = *qp) != NULL. qp = &.q->.next) // 如果ID相同, 返回已经存在错误if (!strcmp(qops->.id, q->.id))
goto out.
// 如果操作结构中没有定义入队,出队和重入队操作的话, 用系统缺省的
if (qops->.enqueue == NULL)
qops->.enqueue = noop_qdisc_ops.enqueue.
if (qops->.requeue == NULL)
qops->.requeue = noop_qdisc_ops.requeue.
if (qops->.dequeue == NULL)
qops->.dequeue = noop_qdisc_ops.dequeue.
// 将结构节点添加到链表, 注意这里没使用内核里最常见的list链表操作
//这是个单向链表
qops->.next = NULL.
*qp = qops.
rc = 0.
out:
write_unlock(&.qdisc_mod_lock).
return rc.
}
//拆除Qdisc操作结构
int unregister_qdisc(struct Qdisc_ops *qops)
{
struct Qdisc_ops *q, **qp.
int err = -ENOENT.
write_lock(&.qdisc_mod_lock).
// 由于没有用list, 必须遍历链表找到节点在链表中的位置for (qp = &.qdisc_base. (q=*qp)!=NULL. qp = &.q->.next)
if (q == qops)
break.