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