[PATCH i-g-t v7 6/7] lib/igt_sriov_device: add helpers for VF DRM driver bind and unbind

Laguna, Lukasz lukasz.laguna at intel.com
Wed Dec 13 21:29:32 UTC 2023


On 12/13/2023 16:00, Kamil Konieczny wrote:
> Hi Lukasz,
> On 2023-12-05 at 09:16:17 +0100, Lukasz Laguna wrote:
>> Helpers allow to bind and unbind a DRM driver for specified VF of a
>> given PF device.
>>
>> Cc: Marcin Bernatowicz <marcin.bernatowicz at linux.intel.com>
>> Cc: Michal Wajdeczko <michal.wajdeczko at intel.com>
>> Signed-off-by: Lukasz Laguna <lukasz.laguna at intel.com>
>> ---
>>   lib/igt_sriov_device.c | 52 ++++++++++++++++++++++++++++++++++++++++++
>>   lib/igt_sriov_device.h |  2 ++
>>   2 files changed, 54 insertions(+)
>>
>> diff --git a/lib/igt_sriov_device.c b/lib/igt_sriov_device.c
>> index c643f47d1..354125974 100644
>> --- a/lib/igt_sriov_device.c
>> +++ b/lib/igt_sriov_device.c
>> @@ -5,9 +5,11 @@
>>   
>>   #include <dirent.h>
>>   #include <errno.h>
>> +#include <pciaccess.h>
>>   
>>   #include "drmtest.h"
>>   #include "igt_core.h"
>> +#include "igt_device.h"
>>   #include "igt_sriov_device.h"
>>   #include "igt_sysfs.h"
>>   
>> @@ -287,3 +289,53 @@ bool igt_sriov_is_vf_drm_driver_probed(int pf, unsigned int vf_num)
>>   
>>   	return ret;
>>   }
>> +
>> +static bool __igt_sriov_bind_vf_drm_driver(int pf, unsigned int vf_num, bool bind)
> Why bool here? imho better name would be:


Bool, because it returns only a result from igt_sysfs_set which is bool. 
I see that "ret" is int actually, but I can change it to bool.
I can also change return type to int and return -1 in case of false from 
igt_sysfs_set(), but it introduces new unnecessary logic and I don't see 
any advantage of such approach.


> static bool __igt_sriov_set_vf_pci_slot(int pf, unsigned int vf_num, const char *bind)


It wouldn't be clear to me what's the responsibility of a function with 
such name and how to use it. I prefer to leave current name and form of 
the implementation.


>> +{
>> +	int sysfs, ret;
>> +	struct pci_device *pci_dev;
>> +	char pci_slot[14];
>> +
>> +	igt_assert(vf_num > 0);
>> +
>> +	pci_dev = __igt_device_get_pci_device(pf, vf_num);
>> +	igt_assert_f(pci_dev, "No PCI device for given VF number: %d\n", vf_num);
>> +	sprintf(pci_slot, "%04x:%02x:%02x.%x",
>> +		pci_dev->domain_16, pci_dev->bus, pci_dev->dev, pci_dev->func);
>> +
>> +	sysfs = igt_sysfs_open(pf);
>> +	igt_assert_fd(sysfs);
>> +
>> +	igt_debug("vf_num: %u, pci_slot: %s\n", vf_num, pci_slot);
>> +	ret = igt_sysfs_set(sysfs, bind ? "device/driver/bind" : "device/driver/unbind", pci_slot);
> So here would be:
> 	ret = igt_sysfs_set(sysfs, bind, pci_slot);
>
> You could also add bind param into prints.
>
>> +
>> +	close(sysfs);
>> +
>> +	return ret;
>> +}
>> +
>> +/**
>> + * igt_sriov_bind_vf_drm_driver - Bind DRM driver to VF
>> + * @pf: PF device file descriptor
>> + * @vf_num: VF number (1-based to identify single VF)
>> + *
>> + * Bind the DRM driver to given VF.
>> + * It asserts on failure.
>> + */
>> +void igt_sriov_bind_vf_drm_driver(int pf, unsigned int vf_num)
>> +{
>> +	igt_assert(__igt_sriov_bind_vf_drm_driver(pf, vf_num, true));
> imho assert on
> 	__igt_sriov_set_vf_pci_slot(pf, vf_num, "device/driver/bind");
>
>> +}
>> +
>> +/**
>> + * igt_sriov_unbind_vf_drm_driver - Unbind DRM driver from VF
>> + * @pf: PF device file descriptor
>> + * @vf_num: VF number (1-based to identify single VF)
>> + *
>> + * Unbind the DRM driver from given VF.
>> + * It asserts on failure.
>> + */
>> +void igt_sriov_unbind_vf_drm_driver(int pf, unsigned int vf_num)
>> +{
>> +	igt_assert(__igt_sriov_bind_vf_drm_driver(pf, vf_num, false));
> imho assert on
> 	__igt_sriov_set_vf_pci_slot(pf, vf_num, "device/driver/unbind");
>
> Regards,
> Kamil
>
>> +}
>> diff --git a/lib/igt_sriov_device.h b/lib/igt_sriov_device.h
>> index c442c41a7..a3a08f8e1 100644
>> --- a/lib/igt_sriov_device.h
>> +++ b/lib/igt_sriov_device.h
>> @@ -25,6 +25,8 @@ void igt_sriov_enable_driver_autoprobe(int pf);
>>   void igt_sriov_disable_driver_autoprobe(int pf);
>>   int igt_sriov_open_vf_drm_device(int pf, unsigned int vf_num);
>>   bool igt_sriov_is_vf_drm_driver_probed(int pf, unsigned int vf_num);
>> +void igt_sriov_bind_vf_drm_driver(int pf, unsigned int vf_num);
>> +void igt_sriov_unbind_vf_drm_driver(int pf, unsigned int vf_num);
>>   
>>   /**
>>    * for_each_sriov_vf - Helper for running code on each VF
>> -- 
>> 2.40.0
>>


More information about the igt-dev mailing list