From b53d5c33bc91bdd2e46c67aec3af04a4dc020e26 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 30 Apr 2014 11:07:46 -0700 Subject: [PATCH] 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 --- ofproto/ofproto-dpif.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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); } -- 2.43.0