[ovs-dev] [PATCH 5/5] dpif-netdev: batch packet sending

Daniele Di Proietto ddiproietto at vmware.com
Wed Jun 4 00:19:00 UTC 2014


On May 30, 2014, at 4:55 PM, Pravin Shelar <pshelar at nicira.com> wrote:

>> 
>>     int i;
>> 
>> +    memset(&batch, 0, sizeof batch);
>> +
> Is there need to reset batch? can batch_init() take care of it?

You’re right. It should be enough to set batch.flow to NULL.

> 
>> +    for (i = 0; i < c; i++) {
>> +        struct ofpbuf * packet = packets[i];
> extra space before packet.
> need blank line after declaration.

Fixed, sorry.

>> +        if (q->head - q->tail < MAX_QUEUE_LEN) {
>> +            struct dp_netdev_upcall *u = &q->upcalls[q->head++ & QUEUE_MASK];
>> +            struct dpif_upcall *upcall = &u->upcall;
>> +            struct ofpbuf *buf = &u->buf;
>> +            size_t buf_size;
>> +            struct flow flow;
>> +
>> +            upcall->type = type;
>> +
>> +            /* Allocate buffer big enough for everything. */
>> +            buf_size = ODPUTIL_FLOW_KEY_BYTES;
>> +            if (userdata) {
>> +                buf_size += NLA_ALIGN(userdata->nla_len);
>> +            }
>> +            buf_size += ofpbuf_size(packet);
>> +            ofpbuf_init(buf, buf_size);
>> +
>> +            /* Put ODP flow. */
>> +            miniflow_expand(key, &flow);
>> +            odp_flow_key_from_flow(buf, &flow, NULL, flow.in_port.odp_port, true);
>> +            upcall->key = ofpbuf_data(buf);
>> +            upcall->key_len = ofpbuf_size(buf);
>> +
>> +            /* Put userdata. */
>> +            if (userdata) {
>> +                upcall->userdata = ofpbuf_put(buf, userdata,
>> +                                              NLA_ALIGN(userdata->nla_len));
>> +            }
>> 
>> -        ofpbuf_set_data(&upcall->packet,
>> -                        ofpbuf_put(buf, ofpbuf_data(packet), ofpbuf_size(packet)));
>> -        ofpbuf_set_size(&upcall->packet, ofpbuf_size(packet));
>> +            ofpbuf_set_data(&upcall->packet,
>> +                            ofpbuf_put(buf, ofpbuf_data(packet),
>> +                            ofpbuf_size(packet)));
>> +            ofpbuf_set_size(&upcall->packet, ofpbuf_size(packet));
>> 
>> -        seq_change(q->seq);
>> +            seq_change(q->seq);
>> 
>> -        error = 0;
>> -    } else {
>> -        dp_netdev_count_packet(dp, DP_STAT_LOST, 1);
>> -        error = ENOBUFS;
>> +            error = 0;
>> +        } else {
>> +            dp_netdev_count_packet(dp, DP_STAT_LOST, 1);
>> +            error = ENOBUFS;
>> +        }
> Can you make separate function to send a packet for upcall processing?
> it is easier to read that way.

Sure, I did it. At some point, though, we might want to batch that too.

Thanks for the suggestions, I’m about to send an updated patch set.

Daniele

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20140603/df944238/attachment-0005.html>


More information about the dev mailing list