Acked-by: Ethan Jackson <et...@nicira.com>
On Fri, Dec 27, 2013 at 11:03 PM, Ben Pfaff <b...@nicira.com> wrote: > Until now, netdev_dummy_rx_wait() has only checked whether the receive > queue for the dummy device is currently empty. This has worked OK because > in practice packets were queued to dummy devices only from the same thread > that attempted to receive them. An upcoming commit will use different > threads for these purposes, so this commit switches to a notification > method that works cross-thread. > > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > lib/netdev-dummy.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c > index 8ad9af6..6286f6b 100644 > --- a/lib/netdev-dummy.c > +++ b/lib/netdev-dummy.c > @@ -87,6 +87,7 @@ struct netdev_rx_dummy { > struct list node; /* In netdev_dummy's "rxes" list. */ > struct list recv_queue; > int recv_queue_len; /* list_size(&recv_queue). */ > + struct seq *seq; /* Reports newly queued packets. */ > }; > > static unixctl_cb_func netdev_dummy_set_admin_state; > @@ -418,6 +419,7 @@ netdev_dummy_rx_construct(struct netdev_rx *rx_) > list_push_back(&netdev->rxes, &rx->node); > list_init(&rx->recv_queue); > rx->recv_queue_len = 0; > + rx->seq = seq_create(); > ovs_mutex_unlock(&netdev->mutex); > > return 0; > @@ -433,6 +435,7 @@ netdev_dummy_rx_destruct(struct netdev_rx *rx_) > list_remove(&rx->node); > ofpbuf_list_delete(&rx->recv_queue); > ovs_mutex_unlock(&netdev->mutex); > + seq_destroy(rx->seq); > } > > static void > @@ -485,10 +488,13 @@ netdev_dummy_rx_wait(struct netdev_rx *rx_) > { > struct netdev_rx_dummy *rx = netdev_rx_dummy_cast(rx_); > struct netdev_dummy *netdev = netdev_dummy_cast(rx->up.netdev); > + uint64_t seq = seq_read(rx->seq); > > ovs_mutex_lock(&netdev->mutex); > if (!list_is_empty(&rx->recv_queue)) { > poll_immediate_wake(); > + } else { > + seq_wait(rx->seq, seq); > } > ovs_mutex_unlock(&netdev->mutex); > } > @@ -504,6 +510,8 @@ netdev_dummy_rx_drain(struct netdev_rx *rx_) > rx->recv_queue_len = 0; > ovs_mutex_unlock(&netdev->mutex); > > + seq_change(rx->seq); > + > return 0; > } > > @@ -795,6 +803,7 @@ netdev_dummy_queue_packet__(struct netdev_rx_dummy *rx, > struct ofpbuf *packet) > { > list_push_back(&rx->recv_queue, &packet->list_node); > rx->recv_queue_len++; > + seq_change(rx->seq); > } > > static void > -- > 1.7.10.4 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev