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:58 +0200
commite9f25e020b862de65aba69e78d600b030f506042 (patch)
tree4ccb96a581ab78c93073b20c12e245c4eb412dc9
parentea5db9a009e11ede33861be5766d8a445d32bf06 (diff)
downloadopenvswitch-e9f25e020b862de65aba69e78d600b030f506042.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 91e91955c..e6a0eef34 100644
--- a/lib/netdev.c
+++ b/lib/netdev.c
@@ -387,25 +387,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;
}
}