summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTao Liu <thomas.liu@ucloud.cn>2022-06-30 16:34:04 +0800
committerIlya Maximets <i.maximets@ovn.org>2022-07-26 12:50:59 +0200
commit384e7f9501b8d84a95331c0cac38d95cefd7087f (patch)
treea9a3f411bde23c1ea3ef535306b492eb9fff8a4e
parentb6403e9d0fca8cce91b5a07b477d013a795034ff (diff)
downloadopenvswitch-384e7f9501b8d84a95331c0cac38d95cefd7087f.tar.gz
netdev: Clear auto_classified if netdev reopened with the type specified.
When netdev first opened by netdev_open(..., NULL, ...), netdev_class sets to system by default, and auto_classified sets to true. If netdev reopens by netdev_open(..., "system", ...), auto_classified should be cleared. This will be used in next patch to fix lag issue. Fixes: 8c2c225e481d ("netdev: Fix netdev_open() to track and recreate classless interfaces") Signed-off-by: Tao Liu <thomas.liu@ucloud.cn> Acked-by: Roi Dayan <roid@nvidia.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
-rw-r--r--lib/netdev.c41
1 files changed, 23 insertions, 18 deletions
diff --git a/lib/netdev.c b/lib/netdev.c
index 8c44eee8e..186b435b1 100644
--- a/lib/netdev.c
+++ b/lib/netdev.c
@@ -386,25 +386,30 @@ netdev_open(const char *name, const char *type, struct netdev **netdevp)
ovs_mutex_lock(&netdev_mutex);
netdev = shash_find_data(&netdev_shash, name);
- if (netdev &&
- type && type[0] && strcmp(type, netdev->netdev_class->type)) {
-
- if (netdev->auto_classified) {
- /* If this device was first created without a classification type,
- * for example due to routing or tunneling code, and they keep a
- * reference, a "classified" call to open will fail. In this case
- * we remove the classless device, and re-add it below. We remove
- * the netdev from the shash, and change the sequence, so owners of
- * the old classless device can release/cleanup. */
- if (netdev->node) {
- shash_delete(&netdev_shash, netdev->node);
- netdev->node = NULL;
- netdev_change_seq_changed(netdev);
- }
+ if (netdev && type && type[0]) {
+ if (strcmp(type, netdev->netdev_class->type)) {
+
+ if (netdev->auto_classified) {
+ /* If this device was first created without a classification
+ * type, for example due to routing or tunneling code, and they
+ * keep a reference, a "classified" call to open will fail.
+ * In this case we remove the classless device, and re-add it
+ * below. We remove the netdev from the shash, and change the
+ * sequence, so owners of the old classless device can
+ * release/cleanup. */
+ if (netdev->node) {
+ shash_delete(&netdev_shash, netdev->node);
+ netdev->node = NULL;
+ netdev_change_seq_changed(netdev);
+ }
- netdev = NULL;
- } else {
- error = EEXIST;
+ netdev = NULL;
+ } else {
+ error = EEXIST;
+ }
+ } else if (netdev->auto_classified) {
+ /* If netdev reopened with type "system", clear auto_classified. */
+ netdev->auto_classified = false;
}
}