Realized that we should always seq_change() in the
ofproto_dpif_send_packet_in()

Will send another version, should be very straight forward,


On Thu, Apr 24, 2014 at 5:54 AM, Joe Stringer <j...@wand.net.nz> wrote:

> Good to see this as a separate change.
>
> Acked-by: Joe Stringer <joestrin...@nicira.com>
>
>
> On 18 April 2014 08:32, Alex Wang <al...@nicira.com> wrote:
>
>>  This commit adds per 'struct ofproto_dpif' sequence number for
>> packet-in I/O.  Whenever a packet-in is inserted into the 'pins'
>> queue, the inserting thread will change the sequence number to
>> wake up the main thread.
>>
>> Signed-off-by: Alex Wang <al...@nicira.com>
>>
>> ---
>> V4:
>> - this is a functional change separated from the next patch.
>> ---
>>  ofproto/ofproto-dpif.c |   17 +++++++++++++++++
>>  1 file changed, 17 insertions(+)
>>
>> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
>> index 5b0f6bd..f15c399 100644
>> --- a/ofproto/ofproto-dpif.c
>> +++ b/ofproto/ofproto-dpif.c
>> @@ -317,6 +317,8 @@ struct ofproto_dpif {
>>
>>      /* Work queues. */
>>      struct guarded_list pins;      /* Contains "struct
>> ofputil_packet_in"s. */
>> +    struct seq *pins_seq;          /* For notifying 'pins' reception. */
>> +    uint64_t pins_seqno;
>>  };
>>
>>  /* All existing ofproto_dpif instances, indexed by ->up.name. */
>> @@ -375,6 +377,9 @@ ofproto_dpif_send_packet_in(struct ofproto_dpif
>> *ofproto,
>>          COVERAGE_INC(packet_in_overflow);
>>          free(CONST_CAST(void *, pin->up.packet));
>>          free(pin);
>> +    } else {
>> +        /* Wakes up main thread for packet-in I/O. */
>> +        seq_change(ofproto->pins_seq);
>>      }
>>  }
>>
>> @@ -1148,6 +1153,9 @@ construct(struct ofproto *ofproto_)
>>      sset_init(&ofproto->port_poll_set);
>>      ofproto->port_poll_errno = 0;
>>      ofproto->change_seq = 0;
>> +    ofproto->pins_seq = seq_create();
>> +    ofproto->pins_seqno = seq_read(ofproto->pins_seq);
>> +
>>
>>      SHASH_FOR_EACH_SAFE (node, next, &init_ofp_ports) {
>>          struct iface_hint *iface_hint = node->data;
>> @@ -1321,6 +1329,8 @@ destruct(struct ofproto *ofproto_)
>>      ovs_mutex_destroy(&ofproto->stats_mutex);
>>      ovs_mutex_destroy(&ofproto->vsp_mutex);
>>
>> +    seq_destroy(ofproto->pins_seq);
>> +
>>      close_dpif_backer(ofproto->backer);
>>  }
>>
>> @@ -1353,6 +1363,12 @@ run(struct ofproto *ofproto_)
>>          }
>>      }
>>
>> +    /* Always updates the ofproto->pins_seqno to avoid frequent wakeup
>> during
>> +     * flow restore.  Even though nothing is processed during flow
>> restore,
>> +     * all queued 'pins' will be handled immediately when flow restore
>> +     * completes. */
>> +    ofproto->pins_seqno = seq_read(ofproto->pins_seq);
>> +
>>      if (ofproto->netflow) {
>>          netflow_run(ofproto->netflow);
>>      }
>> @@ -1462,6 +1478,7 @@ wait(struct ofproto *ofproto_)
>>      }
>>
>>      seq_wait(udpif_dump_seq(ofproto->backer->udpif), ofproto->dump_seq);
>> +    seq_wait(ofproto->pins_seq, ofproto->pins_seqno);
>>  }
>>
>>  static void
>> --
>> 1.7.9.5
>>
>> _______________________________________________
>> dev mailing list
>> dev@openvswitch.org
>> http://openvswitch.org/mailman/listinfo/dev
>>
>
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to