From cfc50ae514f805dcd9c14589f21158185424daf6 Mon Sep 17 00:00:00 2001 From: Alex Wang Date: Thu, 17 Apr 2014 12:24:45 -0700 Subject: [PATCH] ofproto-dpif: Use sequence number to wake up main thread for packet-in I/O. This commit adds per 'struct ofproto_dpif' sequence number for packet-in I/O. Whenever ofproto_dpif_send_packet_in() is called, the calling thread will change the sequence number to wake up the main thread. Signed-off-by: Alex Wang Acked-by: Joe Stringer --- ofproto/ofproto-dpif.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 30cbb24c5..040730230 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. */ @@ -388,6 +390,9 @@ ofproto_dpif_send_packet_in(struct ofproto_dpif *ofproto, free(CONST_CAST(void *, pin->up.packet)); free(pin); } + + /* Wakes up main thread for packet-in I/O. */ + seq_change(ofproto->pins_seq); } /* The default "table-miss" behaviour for OpenFlow1.3+ is to drop the @@ -1160,6 +1165,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; @@ -1333,6 +1341,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); } @@ -1365,6 +1375,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); } @@ -1474,6 +1490,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 -- 2.43.0