On 15 August 2012 19:12, Ben Pfaff <b...@nicira.com> wrote: > This is easy enough, so it seems worthwhile now that FreeBSD is starting > to make more use of the "userspace switch". > > CC: Ed Maste <ema...@freebsd.org> > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > lib/dpif-netdev.c | 33 +++++++++++++++++++-------------- > 1 files changed, 19 insertions(+), 14 deletions(-) > > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c > index 3d01b17..144b6b6 100644 > --- a/lib/dpif-netdev.c > +++ b/lib/dpif-netdev.c > @@ -70,8 +70,13 @@ enum { MAX_QUEUE_LEN = 128 }; /* Maximum number of > packets per queue. */ > enum { QUEUE_MASK = MAX_QUEUE_LEN - 1 }; > BUILD_ASSERT_DECL(IS_POW2(MAX_QUEUE_LEN)); > > +struct dp_netdev_upcall { > + struct dpif_upcall upcall; /* Queued upcall information. */ > + struct ofpbuf buf; /* ofpbuf instance for upcall.packet. */ > +}; > + > struct dp_netdev_queue { > - struct dpif_upcall *upcalls[MAX_QUEUE_LEN]; > + struct dp_netdev_upcall upcalls[MAX_QUEUE_LEN]; > unsigned int head, tail; > }; > > @@ -259,10 +264,8 @@ dp_netdev_purge_queues(struct dp_netdev *dp) > struct dp_netdev_queue *q = &dp->queues[i]; > > while (q->tail != q->head) { > - struct dpif_upcall *upcall = q->upcalls[q->tail++ & QUEUE_MASK]; > - > - ofpbuf_delete(upcall->packet); > - free(upcall); > + struct dp_netdev_upcall *u = &q->upcalls[q->tail++ & QUEUE_MASK]; > + ofpbuf_uninit(&u->buf); > } > } > } > @@ -960,13 +963,13 @@ dpif_netdev_recv(struct dpif *dpif, struct dpif_upcall > *upcall, > { > struct dp_netdev_queue *q = find_nonempty_queue(dpif); > if (q) { > - struct dpif_upcall *u = q->upcalls[q->tail++ & QUEUE_MASK]; > - *upcall = *u; > - free(u); > + struct dp_netdev_upcall *u = &q->upcalls[q->tail++ & QUEUE_MASK]; > + > + *upcall = u->upcall; > + upcall->packet = buf;
Doesn't upcall->key still point into the static buf from upcalls[] in this case? -Ed _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev