Re: [libvirt] [PATCH 10/19] util: new function virNetDevPFGetVF()

2017-03-17 Thread Michal Privoznik

On 03/10/2017 09:35 PM, Laine Stump wrote:

Given an SRIOV PF netdev name (e.g. "enp2s0f0") and VF#, this new
function returns the netdev name of the referenced VF device
(e.g. "enp2s11f6"), or NULL if the device isn't bound to a net driver.
---
 src/libvirt_private.syms |  1 +
 src/util/virnetdev.c | 58 
 src/util/virnetdev.h |  3 +++
 3 files changed, 62 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index ef027cc..e9705ae 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1997,6 +1997,7 @@ virNetDevGetVLanID;
 virNetDevIfStateTypeFromString;
 virNetDevIfStateTypeToString;
 virNetDevIsVirtualFunction;
+virNetDevPFGetVF;
 virNetDevReplaceMacAddress;
 virNetDevReplaceNetConfig;
 virNetDevRestoreMacAddress;
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
index ffc2fb4..49a11f3 100644
--- a/src/util/virnetdev.c
+++ b/src/util/virnetdev.c
@@ -1311,6 +1311,54 @@ virNetDevGetPhysicalFunction(const char *ifname, char 
**pfname)
 return ret;
 }

+
+/**
+ * virNetDevPFGetVF:
+ *
+ * @pfname: netdev name of the physical function (PF)
+ * @vf: virtual function (VF) number for the device of interest
+ * @vfname: name of the physical function interface name
+ *
+ * Finds the netdev name of VF# @vf of SRIOV PF @pfname, and puts it
+ * in @vfname. The caller must free @vfname when it's finished with
+ * it.
+ *
+ * Returns 0 on success, -1 on failure


Not entirely true. After your patch of 06/19 virPCIGetNetName() can 
return 0 (which in turn is the return value of virNetDevPFGetVF()), and 
still not fetch vfname - if virDirOpenQuiet() fails. I'd recommend to at 
least note this in the comment.



+ *
+ */
+int
+virNetDevPFGetVF(const char *pfname, int vf, char **vfname)
+{
+char *virtfnName = NULL;
+char *virtfnSysfsPath = NULL;
+int ret = -1;
+
+if (virAsprintf(, "virtfn%d", vf) < 0)
+goto cleanup;
+
+/* this provides the path to the VF's directory in sysfs,
+ * e.g. "/sys/class/net/enp2s0f0/virtfn3"
+ */
+if (virNetDevSysfsDeviceFile(, pfname, virtfnName) < 0)
+goto cleanup;
+
+/* and this gets the netdev name associated with it, which is a
+ * directory entry in [virtfnSysfsPath]/net,
+ * e.g. "/sys/class/net/enp2s0f0/virtfn3/net/enp2s11f4" - in this
+ * example the VF for enp2s0f0 vf#3 is "enp2s11f4". (If the VF
+ * isn't bound to a netdev driver, it won't have a netdev name,
+ * and vfname will be NULL).
+ */
+ret = virPCIGetNetName(virtfnSysfsPath, vfname);
+
+ cleanup:
+VIR_FREE(virtfnName);
+VIR_FREE(virtfnSysfsPath);
+
+return ret;
+}
+
+


ACK with that fixed.

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 10/19] util: new function virNetDevPFGetVF()

2017-03-10 Thread Laine Stump
Given an SRIOV PF netdev name (e.g. "enp2s0f0") and VF#, this new
function returns the netdev name of the referenced VF device
(e.g. "enp2s11f6"), or NULL if the device isn't bound to a net driver.
---
 src/libvirt_private.syms |  1 +
 src/util/virnetdev.c | 58 
 src/util/virnetdev.h |  3 +++
 3 files changed, 62 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index ef027cc..e9705ae 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1997,6 +1997,7 @@ virNetDevGetVLanID;
 virNetDevIfStateTypeFromString;
 virNetDevIfStateTypeToString;
 virNetDevIsVirtualFunction;
+virNetDevPFGetVF;
 virNetDevReplaceMacAddress;
 virNetDevReplaceNetConfig;
 virNetDevRestoreMacAddress;
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
index ffc2fb4..49a11f3 100644
--- a/src/util/virnetdev.c
+++ b/src/util/virnetdev.c
@@ -1311,6 +1311,54 @@ virNetDevGetPhysicalFunction(const char *ifname, char 
**pfname)
 return ret;
 }
 
+
+/**
+ * virNetDevPFGetVF:
+ *
+ * @pfname: netdev name of the physical function (PF)
+ * @vf: virtual function (VF) number for the device of interest
+ * @vfname: name of the physical function interface name
+ *
+ * Finds the netdev name of VF# @vf of SRIOV PF @pfname, and puts it
+ * in @vfname. The caller must free @vfname when it's finished with
+ * it.
+ *
+ * Returns 0 on success, -1 on failure
+ *
+ */
+int
+virNetDevPFGetVF(const char *pfname, int vf, char **vfname)
+{
+char *virtfnName = NULL;
+char *virtfnSysfsPath = NULL;
+int ret = -1;
+
+if (virAsprintf(, "virtfn%d", vf) < 0)
+goto cleanup;
+
+/* this provides the path to the VF's directory in sysfs,
+ * e.g. "/sys/class/net/enp2s0f0/virtfn3"
+ */
+if (virNetDevSysfsDeviceFile(, pfname, virtfnName) < 0)
+goto cleanup;
+
+/* and this gets the netdev name associated with it, which is a
+ * directory entry in [virtfnSysfsPath]/net,
+ * e.g. "/sys/class/net/enp2s0f0/virtfn3/net/enp2s11f4" - in this
+ * example the VF for enp2s0f0 vf#3 is "enp2s11f4". (If the VF
+ * isn't bound to a netdev driver, it won't have a netdev name,
+ * and vfname will be NULL).
+ */
+ret = virPCIGetNetName(virtfnSysfsPath, vfname);
+
+ cleanup:
+VIR_FREE(virtfnName);
+VIR_FREE(virtfnSysfsPath);
+
+return ret;
+}
+
+
 /**
  * virNetDevGetVirtualFunctionInfo:
  * @vfname: name of the virtual function interface
@@ -1391,6 +1439,16 @@ virNetDevGetPhysicalFunction(const char *ifname 
ATTRIBUTE_UNUSED,
 }
 
 int
+virNetDevPFGetVF(const char *pfname ATTRIBUTE_UNUSED,
+ int vf ATTRIBUTE_UNUSED,
+ char **vfname ATTRUBUTE_UNUSED)
+{
+virReportSystemError(ENOSYS, "%s",
+ _("Unable to get virtual function name on this 
platform"));
+return -1;
+}
+
+int
 virNetDevGetVirtualFunctionInfo(const char *vfname ATTRIBUTE_UNUSED,
 char **pfname ATTRIBUTE_UNUSED,
 int *vf ATTRIBUTE_UNUSED)
diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h
index 236cf83..ecc28c8 100644
--- a/src/util/virnetdev.h
+++ b/src/util/virnetdev.h
@@ -178,6 +178,9 @@ int virNetDevGetVirtualFunctionIndex(const char *pfname, 
const char *vfname,
 int virNetDevGetPhysicalFunction(const char *ifname, char **pfname)
 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
 
+int virNetDevPFGetVF(const char *pfname, int vf, char **vfname)
+ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
+
 int virNetDevGetVirtualFunctions(const char *pfname,
  char ***vfname,
  virPCIDeviceAddressPtr **virt_fns,
-- 
2.9.3

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list