Hi Patrick,

I appreciate your comments.
I will update and resend patches.

> > +typedef long long gapclock_t;
> 
> It seems you only add to this, does it need to be signed?
> How about using a fixed size type (u64) and getting rid
> of the typedef?
> 
OK. I will use u64 instead of gapclock_t, and remove the typedef.

> > +struct tc_psp_qopt
> > +{
> > +   __u32   defcls;
> > +   __u32   rate;
> > +};
> 
> 
> What unit is rate measured in?
> 
'rate' is the transmission rate in bytes per sec.

> > +struct tc_psp_xstats
> > +{
> > +   __u32   bytes;          /* gap packet statistics */
> > +   __u32   packets;
> > +};
> 
> How about using gnet_stats_basic for this?
> 
OK. I will use gnet_stats_basic.

> > +   if (!skb)
> > +           return NULL;
> > +
> > +   memset(skb->data, 0xff, size);
> 
> memsetting the header portion seems unnecessary since you overwrite
> it again directly below.
> 
The size of a gap packet is variable, so it fills a whole gap packet
with 0xff, where 'size' indicates the interface MTU size.

> > +   skb_put(skb, size);
> 
> This is usually done before putting data in the packet.
> 
Therefore, skb_put() is needed.

> > +static int recalc_gapsize(struct sk_buff *skb, struct Qdisc *sch)
> > +{
> > +   struct psp_sched_data *q = qdisc_priv(sch);
> > +   struct psp_class *cl;
> > +   unsigned int len = skb->len;
> > +   int gapsize = 0;
> > +   int err;
> > +
> > +   cl = psp_classify(skb, sch, &err);
> > +   switch (cl->mode) {
> > +   case MODE_STATIC:
> > +           gapsize = cl->gapsize;
> > +           if (len < q->mtu) /* workaround for overflow */
> > +                   gapsize = (int)((long long)gapsize * len / q->mtu);
> 
> No need to cast to the LHS type. Shouldn't this also be rounded up
> like the other gapsize calculation?
> 
How about this?

        u64 gapsize = 0;
        :
        case MODE_STATIC:
                gapsize = (u64)cl->gapsize * len / q->mtu;
                gapsize = min_t(u64, gapsize, UINT_MAX);
                break;
        }

> > +static struct psp_class *lookup_next_class(struct Qdisc *sch, int *gapsize)
> > +{
> > +   struct psp_sched_data *q = qdisc_priv(sch);
> > +   struct psp_class *cl, *next = NULL;
> > +   gapclock_t diff;
> > +   int shortest;
> > +
> > +   /* pacing class */
> > +   shortest = q->mtu;
> > +   list_for_each_entry(cl, &q->pacing_list, plist) {
> > +           diff = cl->clock - q->clock;
> > +           if (diff > 0) {
> > +                   if ((gapclock_t)shortest > diff)
> > +                           shortest = (int)diff;
> 
> Is diff guaranteed not to exceed an int?
> 
No. But actually, 'diff' is much smaller than INT_MAX.
How about this?

        u64 diff, shortest;
        :
                if (q->clock < cl->clock) {
                        diff = cl->clock - q->clock;
                        if (shortest > diff)
                                shortest = diff;
                        continue;
                }


> > +static void psp_destroy(struct Qdisc *sch)
> > +{
> > +   struct psp_sched_data *q = qdisc_priv(sch);
> > +
> > +   tcf_destroy_chain(q->filter_list);
> > +
> > +   while (!list_empty(&q->root))
> > +           psp_destroy_class(sch, list_entry(q->root.next,
> > +                                             struct psp_class, sibling));
> 
> list_for_each_entry_safe.
> 
I think it works well. Should I need to use list_for_each_entry_safe?

Best regards,
Ryousei Takano
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to