[ovs-dev] [dpif-netdev 03/15] netdev-dummy: Make netdev_rx_wait() wakeups work cross-thread for dummies.
Ethan Jackson
ethan at nicira.com
Tue Dec 31 20:47:34 UTC 2013
Acked-by: Ethan Jackson <ethan at nicira.com>
On Fri, Dec 27, 2013 at 11:03 PM, Ben Pfaff <blp at 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 <blp at 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 at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list