2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-29 13:27:59 +00:00

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>
This commit is contained in:
Tao Liu 2022-06-30 16:34:04 +08:00 committed by Ilya Maximets
parent 1cecd385f4
commit 378b51c6b0

View File

@ -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 && 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);
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;
}
}