From: Ben Pfaff Date: Wed, 30 Apr 2014 18:07:46 +0000 (-0700) Subject: ofproto-dpif: Close race between processing packet_ins and checking seqno. X-Git-Tag: sliver-openvswitch-2.2.90-1~3^2~27 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=b53d5c33bc91bdd2e46c67aec3af04a4dc020e26 ofproto-dpif: Close race between processing packet_ins and checking seqno. If a packet-in were to be queued, and the sequence number changed, after grabbing the list of packet-ins, then the existing code could have gone to sleep until something happened. By grabbing the sequence number before the list of packet-ins, we avoid this race. Found by inspection. Signed-off-by: Ben Pfaff --- diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 4cebd7797..5eea5ab60 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -1357,6 +1357,12 @@ run(struct ofproto *ofproto_) ovs_rwlock_unlock(&ofproto->ml->rwlock); } + /* 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); + /* Do not perform any periodic activity required by 'ofproto' while * waiting for flow restore to complete. */ if (!ofproto_get_flow_restore_wait()) { @@ -1372,12 +1378,6 @@ 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); }