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:
parent
1cecd385f4
commit
378b51c6b0
39
lib/netdev.c
39
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 && 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user