[ovs-dev] [PATCH 1/8] netdev: Add 'change_seq' back to netdev.

Alex Wang alexw at nicira.com
Thu Apr 10 01:31:35 UTC 2014


Hey Joe,


On Wed, Apr 9, 2014 at 6:16 PM, Joe Stringer <joe at wand.net.nz> wrote:

> It had occurred to me at the time, that this was a possible middle ground
> between making netdev change_seq completely global or retaining this
> per-netdev seq as well as having a global seq. When I looked at perf when
> many ports are configured, a majority of the cost seemed to be just in just
> iterating through the ports to check the seq.
>
> Do you have a sense of the impact this has?
>
>

I haven't tested about it.  And I'd like to measure it.
I only concerned and tested the benefit of updating to database.

Let me update the thread after testing the configuration perf and latency.



> On 5 April 2014 11:00, Alex Wang <alexw at nicira.com> wrote:
>
>> This commit can be seen as a partial revert of commit
>> da4a619179d (netdev: Globally track port status changes)
>> by adding the 'change_seq' to 'struct netdev'.
>>
>> Signed-off-by: Alex Wang <alexw at nicira.com>
>> ---
>>  lib/netdev-bsd.c      |    5 +++++
>>  lib/netdev-dpdk.c     |    1 +
>>  lib/netdev-dummy.c    |    2 ++
>>  lib/netdev-linux.c    |    1 +
>>  lib/netdev-provider.h |   17 +++++++++++++++++
>>  lib/netdev-vport.c    |    3 +++
>>  lib/netdev.c          |    8 ++++++++
>>  lib/netdev.h          |    1 +
>>  8 files changed, 38 insertions(+)
>>
>> diff --git a/lib/netdev-bsd.c b/lib/netdev-bsd.c
>> index 9952aef..affd08a 100644
>> --- a/lib/netdev-bsd.c
>> +++ b/lib/netdev-bsd.c
>> @@ -217,6 +217,7 @@ netdev_bsd_cache_cb(const struct rtbsd_change *change,
>>              if (is_netdev_bsd_class(netdev_class)) {
>>                  dev = netdev_bsd_cast(base_dev);
>>                  dev->cache_valid = 0;
>> +                netdev_change_seq_changed(base_dev);
>>                  seq_change(connectivity_seq_get());
>>              }
>>              netdev_close(base_dev);
>> @@ -236,6 +237,7 @@ netdev_bsd_cache_cb(const struct rtbsd_change *change,
>>              dev = netdev_bsd_cast(netdev);
>>              dev->cache_valid = 0;
>>              seq_change(connectivity_seq_get());
>> +            netdev_change_seq_changed(netdev);
>>              netdev_close(netdev);
>>          }
>>          shash_destroy(&device_shash);
>> @@ -774,6 +776,7 @@ netdev_bsd_set_etheraddr(struct netdev *netdev_,
>>          if (!error) {
>>              netdev->cache_valid |= VALID_ETHERADDR;
>>              memcpy(netdev->etheraddr, mac, ETH_ADDR_LEN);
>> +            netdev_change_seq_changed(netdev_);
>>              seq_change(connectivity_seq_get());
>>          }
>>      }
>> @@ -1228,6 +1231,7 @@ netdev_bsd_set_in4(struct netdev *netdev_, struct
>> in_addr addr,
>>                  netdev->netmask = mask;
>>              }
>>          }
>> +        netdev_change_seq_changed(netdev_);
>>          seq_change(connectivity_seq_get());
>>      }
>>      ovs_mutex_unlock(&netdev->mutex);
>> @@ -1526,6 +1530,7 @@ netdev_bsd_update_flags(struct netdev *netdev_,
>> enum netdev_flags off,
>>          new_flags = (old_flags & ~nd_to_iff_flags(off)) |
>> nd_to_iff_flags(on);
>>          if (new_flags != old_flags) {
>>              error = set_flags(netdev_get_kernel_name(netdev_),
>> new_flags);
>> +            netdev_change_seq_changed(netdev_);
>>              seq_change(connectivity_seq_get());
>>          }
>>      }
>> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
>> index 4b36f52..1ab57cc 100644
>> --- a/lib/netdev-dpdk.c
>> +++ b/lib/netdev-dpdk.c
>> @@ -318,6 +318,7 @@ check_link_status(struct netdev_dpdk *dev)
>>      rte_eth_link_get_nowait(dev->port_id, &link);
>>
>>      if (dev->link.link_status != link.link_status) {
>> +        netdev_change_seq_changed(&dev->up);
>>          seq_change(connectivity_seq_get());
>>
>>          dev->link_reset_cnt++;
>> diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
>> index 995e923..359fc06 100644
>> --- a/lib/netdev-dummy.c
>> +++ b/lib/netdev-dummy.c
>> @@ -873,6 +873,7 @@ netdev_dummy_set_etheraddr(struct netdev *netdev,
>>      ovs_mutex_lock(&dev->mutex);
>>      if (!eth_addr_equals(dev->hwaddr, mac)) {
>>          memcpy(dev->hwaddr, mac, ETH_ADDR_LEN);
>> +        netdev_change_seq_changed(netdev);
>>          seq_change(connectivity_seq_get());
>>      }
>>      ovs_mutex_unlock(&dev->mutex);
>> @@ -968,6 +969,7 @@ netdev_dummy_update_flags__(struct netdev_dummy
>> *netdev,
>>      netdev->flags |= on;
>>      netdev->flags &= ~off;
>>      if (*old_flagsp != netdev->flags) {
>> +        netdev_change_seq_changed(&netdev->up);
>>          seq_change(connectivity_seq_get());
>>      }
>>
>> diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
>> index f9634b6..2f61936 100644
>> --- a/lib/netdev-linux.c
>> +++ b/lib/netdev-linux.c
>> @@ -616,6 +616,7 @@ netdev_linux_changed(struct netdev_linux *dev,
>>                       unsigned int ifi_flags, unsigned int mask)
>>      OVS_REQUIRES(dev->mutex)
>>  {
>> +    netdev_change_seq_changed(&dev->up);
>>      seq_change(connectivity_seq_get());
>>
>>      if ((dev->ifi_flags ^ ifi_flags) & IFF_RUNNING) {
>> diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h
>> index f233c0c..84b62fb 100644
>> --- a/lib/netdev-provider.h
>> +++ b/lib/netdev-provider.h
>> @@ -38,6 +38,14 @@ struct netdev {
>>      const struct netdev_class *netdev_class; /* Functions to control
>>                                                  this device. */
>>
>> +    /* A sequence number which indicates changes in one of 'netdev''s
>> +     * properties.   It must be nonzero so that users have a value which
>> +     * they may use as a reset when tracking 'netdev'.
>> +     *
>> +     * Minimally, the sequence number is required to change whenever
>> +     * 'netdev''s flags, features, ethernet address, or carrier changes.
>> */
>> +    uint64_t change_seq;
>> +
>>      /* The following are protected by 'netdev_mutex' (internal to
>> netdev.c). */
>>      int n_rxq;
>>      int ref_cnt;                        /* Times this devices was
>> opened. */
>> @@ -45,6 +53,15 @@ struct netdev {
>>      struct list saved_flags_list; /* Contains "struct
>> netdev_saved_flags". */
>>  };
>>
>> +static inline void
>> +netdev_change_seq_changed(struct netdev *netdev)
>> +{
>> +    netdev->change_seq++;
>> +    if (!netdev->change_seq) {
>> +        netdev->change_seq++;
>> +    }
>> +}
>> +
>>  const char *netdev_get_type(const struct netdev *);
>>  const struct netdev_class *netdev_get_class(const struct netdev *);
>>  const char *netdev_get_name(const struct netdev *);
>> diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
>> index f52cceb..3697e27 100644
>> --- a/lib/netdev-vport.c
>> +++ b/lib/netdev-vport.c
>> @@ -212,6 +212,7 @@ netdev_vport_set_etheraddr(struct netdev *netdev_,
>>      ovs_mutex_lock(&netdev->mutex);
>>      memcpy(netdev->etheraddr, mac, ETH_ADDR_LEN);
>>      ovs_mutex_unlock(&netdev->mutex);
>> +    netdev_change_seq_changed(netdev_);
>>      seq_change(connectivity_seq_get());
>>
>>      return 0;
>> @@ -486,6 +487,7 @@ set_tunnel_config(struct netdev *dev_, const struct
>> smap *args)
>>
>>      ovs_mutex_lock(&dev->mutex);
>>      dev->tnl_cfg = tnl_cfg;
>> +    netdev_change_seq_changed(dev_);
>>      seq_change(connectivity_seq_get());
>>      ovs_mutex_unlock(&dev->mutex);
>>
>> @@ -660,6 +662,7 @@ set_patch_config(struct netdev *dev_, const struct
>> smap *args)
>>      ovs_mutex_lock(&dev->mutex);
>>      free(dev->peer);
>>      dev->peer = xstrdup(peer);
>> +    netdev_change_seq_changed(dev_);
>>      seq_change(connectivity_seq_get());
>>      ovs_mutex_unlock(&dev->mutex);
>>
>> diff --git a/lib/netdev.c b/lib/netdev.c
>> index 4ec1d7d..9f76052 100644
>> --- a/lib/netdev.c
>> +++ b/lib/netdev.c
>> @@ -340,6 +340,7 @@ netdev_open(const char *name, const char *type,
>> struct netdev **netdevp)
>>                  memset(netdev, 0, sizeof *netdev);
>>                  netdev->netdev_class = rc->class;
>>                  netdev->name = xstrdup(name);
>> +                netdev->change_seq = 1;
>>                  netdev->node = shash_add(&netdev_shash, name, netdev);
>>
>>                  /* By default enable one rx queue per netdev. */
>> @@ -355,6 +356,7 @@ netdev_open(const char *name, const char *type,
>> struct netdev **netdevp)
>>                      int old_ref_cnt;
>>
>>                      atomic_add(&rc->ref_cnt, 1, &old_ref_cnt);
>> +                    netdev_change_seq_changed(netdev);
>>                      seq_change(connectivity_seq_get());
>>                  } else {
>>                      free(netdev->name);
>> @@ -1649,3 +1651,9 @@ restore_all_flags(void *aux OVS_UNUSED)
>>          }
>>      }
>>  }
>> +
>> +uint64_t
>> +netdev_get_change_seq(const struct netdev *netdev)
>> +{
>> +    return netdev->change_seq;
>> +}
>> diff --git a/lib/netdev.h b/lib/netdev.h
>> index 432f327..7cb3c80 100644
>> --- a/lib/netdev.h
>> +++ b/lib/netdev.h
>> @@ -284,6 +284,7 @@ int netdev_set_queue(struct netdev *,
>>  int netdev_delete_queue(struct netdev *, unsigned int queue_id);
>>  int netdev_get_queue_stats(const struct netdev *, unsigned int queue_id,
>>                             struct netdev_queue_stats *);
>> +uint64_t netdev_get_change_seq(const struct netdev *);
>>
>>  struct netdev_queue_dump {
>>      struct netdev *netdev;
>> --
>> 1.7.9.5
>>
>> _______________________________________________
>> dev mailing list
>> dev at openvswitch.org
>> http://openvswitch.org/mailman/listinfo/dev
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20140409/0b3b658a/attachment-0005.html>


More information about the dev mailing list