On 05/08/2018 10:24 PM, Cong Wang wrote:
On Tue, May 8, 2018 at 5:59 AM, Michel Machado <mic...@digirati.com.br> wrote:
Overall it looks good to me, just one thing below:
+struct Qdisc_ops gkprio_qdisc_ops __read_mostly = {
+ .id = "gkprio",
+ .priv_size = sizeof(struct gkprio_sched_data),
+ .enqueue = gkprio_enqueue,
+ .dequeue = gkprio_dequeue,
+ .peek = qdisc_peek_dequeued,
+ .init = gkprio_init,
+ .reset = gkprio_reset,
+ .change = gkprio_change,
+ .dump = gkprio_dump,
+ .destroy = gkprio_destroy,
+ .owner = THIS_MODULE,
+};
You probably want to add Qdisc_class_ops here so that you can
dump the stats of each internal queue.
Hi Cong,
In the production scenario we are targeting, this priority queue must be
classless; being classful would only bloat the code for us. I don't see
making this queue classful as a problem per se, but I suggest leaving it as
a future improvement for when someone can come up with a useful scenario for
it.
Take a look at sch_prio, it is fairly simple since your internal
queues are just an array... Per-queue stats are quite useful
in production, we definitely want to observe which queues are
full which are not.
DSprio cannot add Qdisc_class_ops without a rewrite of other queue
disciplines, which doesn't seem desirable. Since the method cops->leaf
is required (see register_qdisc()), we would need to replace the array
struct sk_buff_head qdiscs[GKPRIO_MAX_PRIORITY] in struct
gkprio_sched_data with the array struct Qdisc
*queues[GKPRIO_MAX_PRIORITY] to be able to return a Qdisc in
dsprio_leaf(). The problem with this change is that Qdisc does not have
a method to dequeue from its tail. This new method may not even make
sense in other queue disciplines. But without this method,
gkprio_enqueue() cannot drop the lowest priority packet when the queue
is full and an incoming packet has higher priority.
Nevertheless, I see your point on being able to observe the distribution
of queued packets per priority. A solution for that would be to add the
array __u32 qlen[GKPRIO_MAX_PRIORITY] in struct tc_gkprio_qopt. This
solution even avoids adding overhead in the critical paths of DSprio. Do
you see a better solution?
By the way, I've used GKPRIO_MAX_PRIORITY and other names that include
"gkprio" above to reflect the version 1 of this patch that we are
discussing. We will rename these identifiers for version 2 of this patch
to replace "gkprio" with "dsprio".
[ ]'s
Michel Machado