diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index 0a649c3d7f..29061f3d6a 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -14086,7 +14086,8 @@ can_reapply_change(NMDevice *self, return nm_device_hash_check_invalid_keys(diffs, NM_SETTING_SRIOV_SETTING_NAME, error, - NM_SETTING_SRIOV_PRESERVE_ON_DOWN); + NM_SETTING_SRIOV_PRESERVE_ON_DOWN, + NM_SETTING_SRIOV_VFS); } out_fail: @@ -14264,9 +14265,35 @@ check_and_reapply_connection(NMDevice *self, nm_device_link_properties_set(self, TRUE); - if (priv->state >= NM_DEVICE_STATE_CONFIG) + if (priv->state >= NM_DEVICE_STATE_CONFIG) { + GHashTable *sriov_diff; + lldp_setup(self, NM_TERNARY_DEFAULT); + sriov_diff = nm_g_hash_table_lookup(diffs, NM_SETTING_SRIOV_SETTING_NAME); + + if (sriov_diff && nm_g_hash_table_lookup(sriov_diff, NM_SETTING_SRIOV_VFS)) { + nm_auto_freev NMPlatformVF **plat_vfs = NULL; + NMSettingSriov *s_sriov; + + s_sriov = (NMSettingSriov *) nm_connection_get_setting(applied, NM_TYPE_SETTING_SRIOV); + + if (s_sriov) { + gs_free_error GError *local = NULL; + + if (!sriov_gen_platform_vfs(self, s_sriov, &plat_vfs, &local) + || !nm_platform_link_set_sriov_vfs(nm_device_get_platform(self), + priv->ifindex, + (const NMPlatformVF *const *) plat_vfs)) { + _LOGE(LOGD_DEVICE, + "failed to reapply SRIOV VFs%s%s", + local ? ": " : "", + local ? local->message : ""); + } + } + } + } + if (priv->state >= NM_DEVICE_STATE_IP_CONFIG) { /* Allow reapply of MTU */ priv->mtu_source = NM_DEVICE_MTU_SOURCE_NONE;