On Fri, May 23, 2014 at 11:04 AM, Daniele Di Proietto <ddiproie...@vmware.com> wrote: > The netdev_send_batch function allows netdevs to send packets > more efficiently. This will be useful for netdev-dpdk. > If a netdev does not implement send_batch, netdev_send_batch > calls send repeatedly. >
.... > > +/* Sends 'c' 'buffers' on 'netdev'. If 'netdev' supports batching, uses > + * send_batch(), otherwise iterates through 'buffers' and uses send(). > + * Returns 0 if successful, otherwise a positive errno value. > + * > + * To retain ownership of 'buffer' caller can set may_steal to false. > + * > + * If any error occurs during the transmission of one buffer, the function > + * stops and return the error. */ > +int > +netdev_send_batch(struct netdev *netdev, struct ofpbuf **buffers, int c, > + bool may_steal) > +{ > + int error; > + > + error = (netdev->netdev_class->send_batch > + ? netdev->netdev_class->send_batch(netdev, buffers, c, > may_steal) > + : EOPNOTSUPP); > + Can you just add extra parameter to send call. Lets not add extra checks in fast path. > + if (error == EOPNOTSUPP) { > + int i; > + > + for (i = 0; i < c; i++) { > + error = (netdev->netdev_class->send > + ? netdev->netdev_class->send(netdev, buffers[i], > may_steal) > + : EOPNOTSUPP); > + if (error) { > + break; > + } > + } > + > + if (error && may_steal) { > + int j; > + > + for (j = (error == EOPNOTSUPP) ? i : i+1; j < c; j++) { > + ofpbuf_delete(buffers[j]); > + } > + } > + } > + if (!error) { > + COVERAGE_INC(netdev_sent); > + } > + return error; > +} > + > /* Registers with the poll loop to wake up from the next call to poll_block() > * when the packet transmission queue has sufficient room to transmit a > packet > * with netdev_send(). > diff --git a/lib/netdev.h b/lib/netdev.h > index a4bd01a..dff516f 100644 > --- a/lib/netdev.h > +++ b/lib/netdev.h > @@ -172,6 +172,7 @@ int netdev_rxq_drain(struct netdev_rxq *); > > /* Packet transmission. */ > int netdev_send(struct netdev *, struct ofpbuf *, bool may_steal); > +int netdev_send_batch(struct netdev *, struct ofpbuf **, int c, bool > may_steal); > void netdev_send_wait(struct netdev *); > > /* Hardware address. */ > -- > 2.0.0.rc0 > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev