From 98ed087058d794f10380c175750ea6cf1e884f67 Mon Sep 17 00:00:00 2001 From: Arne Wendt Date: Fri, 6 Mar 2020 14:17:02 +0100 Subject: [PATCH 1/2] allow the use of already enabled sr-iov virtual functions in sr-iov networks managed by xapi network server failed to use already enabled virtual functions, for network adapters that do not allow configurations via sysfs interface, but require manual configuration by user Signed-off-by: Arne Wendt --- networkd/network_server.ml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/networkd/network_server.ml b/networkd/network_server.ml index 62049c223..9a3741976 100644 --- a/networkd/network_server.ml +++ b/networkd/network_server.ml @@ -144,7 +144,14 @@ module Sriov = struct Sysfs.unbind_child_vfs dev >>= fun () -> Ok 0 ) >>= fun numvfs -> - Sysfs.set_sriov_numvfs dev numvfs >>= fun _ -> Ok Sysfs_successful + let sysfs_numvfs = Sysfs.get_sriov_numvfs dev in + ( if sysfs_numvfs <> 0 then ( + debug "%d vfs already enabled on device: %s" sysfs_numvfs dev ; + Ok () + ) else + Sysfs.set_sriov_numvfs dev numvfs + ) + >>= fun _ -> Ok Sysfs_successful let enable dbg name = Debug.with_thread_associated dbg From 6a053067e972cfca398504fc030c1347d38e6606 Mon Sep 17 00:00:00 2001 From: Arne Wendt Date: Thu, 12 Mar 2020 21:00:27 +0000 Subject: [PATCH 2/2] add support for enabling sr-iov-networks on adapters with already enabled sr-iov/vfs Manual configuration is assumed if: no modprobe template is present, setting numvfs to maxvfs via sysfs interface fails, but vfs are present. a new return `Manual_successful` is introduced. Signed-off-by: Arne Wendt --- networkd/network_server.ml | 47 ++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/networkd/network_server.ml b/networkd/network_server.ml index 9a3741976..e12599af0 100644 --- a/networkd/network_server.ml +++ b/networkd/network_server.ml @@ -137,21 +137,40 @@ module Sriov = struct else Ok Modprobe_successful_requires_reboot | None -> - debug "%s SR-IOV on a device: %s via sysfs" op dev ; - ( if enable then - Sysfs.get_sriov_maxvfs dev + (* enable: try sysfs interface to set numfvs = maxvfs. if fails, but vfs are enabled, assume manual configuration. + disable: Net.Sriov.disable will not be called for manually configured interfaces, as determined by `require_operation_on_pci_device` *) + let man_successful () = + debug "SR-IOV/VFs %sd manually on device: %s" op dev ; + Manual_successful + in + if enable then + let present_numvfs = Sysfs.get_sriov_numvfs dev in + match + Sysfs.get_sriov_maxvfs dev >>= fun maxvfs -> + maxvfs |> Sysfs.set_sriov_numvfs dev + with + | Ok _ -> + debug "%s SR-IOV on a device: %s via sysfs" op dev ; + Ok Sysfs_successful + | Error _ when present_numvfs > 0 -> + Ok (man_successful ()) + | exception _ when present_numvfs > 0 -> + Ok (man_successful ()) + | Error err -> + Error err + | exception e -> + let msg = + Printf.sprintf + "Error: trying sysfs SR-IOV interface failed with exception \ + %s on device: %s" + (Printexc.to_string e) dev + in + Error (Other, msg) else - Sysfs.unbind_child_vfs dev >>= fun () -> Ok 0 - ) - >>= fun numvfs -> - let sysfs_numvfs = Sysfs.get_sriov_numvfs dev in - ( if sysfs_numvfs <> 0 then ( - debug "%d vfs already enabled on device: %s" sysfs_numvfs dev ; - Ok () - ) else - Sysfs.set_sriov_numvfs dev numvfs - ) - >>= fun _ -> Ok Sysfs_successful + Sysfs.unbind_child_vfs dev >>= fun () -> + Sysfs.set_sriov_numvfs dev 0 >>= fun _ -> + debug "%s SR-IOV on a device: %s via sysfs" op dev ; + Ok Sysfs_successful let enable dbg name = Debug.with_thread_associated dbg