This commit uses the 'change_seq' in 'struct netdev' to determine whether to update the 'ofport'. This helps eliminate unnecessary update.
Signed-off-by: Alex Wang <al...@nicira.com> --- ofproto/ofproto-provider.h | 1 + ofproto/ofproto.c | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h index 9f37f71..adf080f 100644 --- a/ofproto/ofproto-provider.h +++ b/ofproto/ofproto-provider.h @@ -174,6 +174,7 @@ struct ofport { struct netdev *netdev; struct ofputil_phy_port pp; ofp_port_t ofp_port; /* OpenFlow port number. */ + uint64_t change_seq; long long int created; /* Time created, in msec. */ int mtu; }; diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 677da8c..cd1ec27 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -1495,7 +1495,13 @@ ofproto_run(struct ofproto *p) * need this two-phase approach. */ sset_init(&devnames); HMAP_FOR_EACH (ofport, hmap_node, &p->ports) { - sset_add(&devnames, netdev_get_name(ofport->netdev)); + uint64_t port_change_seq; + + port_change_seq = netdev_get_change_seq(ofport->netdev); + if (ofport->change_seq != port_change_seq) { + ofport->change_seq = port_change_seq; + sset_add(&devnames, netdev_get_name(ofport->netdev)); + } } SSET_FOR_EACH (devname, &devnames) { update_port(p, devname); @@ -2191,6 +2197,7 @@ ofport_install(struct ofproto *p, } ofport->ofproto = p; ofport->netdev = netdev; + ofport->change_seq = netdev_get_change_seq(netdev); ofport->pp = *pp; ofport->ofp_port = pp->port_no; ofport->created = time_msec(); @@ -2427,6 +2434,7 @@ update_port(struct ofproto *ofproto, const char *name) * Don't close the old netdev yet in case port_modified has to * remove a retained reference to it.*/ port->netdev = netdev; + port->change_seq = netdev_get_change_seq(netdev); if (port->ofproto->ofproto_class->port_modified) { port->ofproto->ofproto_class->port_modified(port); -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev