[dpdk-dev] igb_uio: fix uevent montior issue

Message ID 1517306475-2153-1-git-send-email-jia.guo@intel.com
State Superseded, archived
Delegated to: Thomas Monjalon
Headers show

Checks

Context Check Description
ci/Intel-compilation success Compilation OK
ci/checkpatch warning coding style issues

Commit Message

Jeff Guo Jan. 30, 2018, 10:01 a.m.
udev could not detect remove and add event of device when hotplug in
and out devices, that related with the fix about using pointer of
rte_uio_pci_dev as dev_id instead of uio_device for irq device handler,
that would result igb uio irq failure when kernel version after than 3.17.
so this patch correct it by use kernel version check before handle the
pci interrupt.

Fixes: 6b9ed026a870 ("igb_uio: fix build with kernel <= 3.17")
Signed-off-by: Jeff Guo <jia.guo@intel.com>
---
 lib/librte_eal/linuxapp/igb_uio/igb_uio.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

Comments

Wu, Jingjing Jan. 31, 2018, 2:15 a.m. | #1
> -----Original Message-----
> From: Guo, Jia
> Sent: Tuesday, January 30, 2018 6:01 PM
> To: Yigit, Ferruh <ferruh.yigit@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>; Tan,
> Jianfeng <jianfeng.tan@intel.com>
> Cc: thomas@monjalon.net; dev@dpdk.org; Guo, Jia <jia.guo@intel.com>
> Subject: [PATCH] igb_uio: fix uevent montior issue
> 
> udev could not detect remove and add event of device when hotplug in
> and out devices, that related with the fix about using pointer of
> rte_uio_pci_dev as dev_id instead of uio_device for irq device handler,
> that would result igb uio irq failure when kernel version after than 3.17.
> so this patch correct it by use kernel version check before handle the
> pci interrupt.
> 
> Fixes: 6b9ed026a870 ("igb_uio: fix build with kernel <= 3.17")
> Signed-off-by: Jeff Guo <jia.guo@intel.com>

Reviewed-by: Jingjing Wu <jingjing.wu@intel.com>
Thomas Monjalon Feb. 8, 2018, 10:01 p.m. | #2
30/01/2018 11:01, Jeff Guo:
> udev could not detect remove and add event of device when hotplug in
> and out devices, that related with the fix about using pointer of
> rte_uio_pci_dev as dev_id instead of uio_device for irq device handler,
> that would result igb uio irq failure when kernel version after than 3.17.
> so this patch correct it by use kernel version check before handle the
> pci interrupt.
> 
> Fixes: 6b9ed026a870 ("igb_uio: fix build with kernel <= 3.17")
> Signed-off-by: Jeff Guo <jia.guo@intel.com>
> ---
> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
>  	struct rte_uio_pci_dev *udev = (struct rte_uio_pci_dev *)dev_id;
>  	struct uio_info *info = &udev->info;
> -
> +#else
> +	struct uio_device *idev = (struct uio_device *)dev_id;
> +	struct uio_info *info = idev->info;
> +	struct rte_uio_pci_dev *udev = info->priv;
> +#endif

Can we avoid checking Linux version number?
This method won't work with kernel backports.
Jeff Guo Feb. 12, 2018, 8:28 a.m. | #3
On 2/9/2018 6:01 AM, Thomas Monjalon wrote:
> 30/01/2018 11:01, Jeff Guo:
>> udev could not detect remove and add event of device when hotplug in
>> and out devices, that related with the fix about using pointer of
>> rte_uio_pci_dev as dev_id instead of uio_device for irq device handler,
>> that would result igb uio irq failure when kernel version after than 3.17.
>> so this patch correct it by use kernel version check before handle the
>> pci interrupt.
>>
>> Fixes: 6b9ed026a870 ("igb_uio: fix build with kernel <= 3.17")
>> Signed-off-by: Jeff Guo <jia.guo@intel.com>
>> ---
>> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
>>   	struct rte_uio_pci_dev *udev = (struct rte_uio_pci_dev *)dev_id;
>>   	struct uio_info *info = &udev->info;
>> -
>> +#else
>> +	struct uio_device *idev = (struct uio_device *)dev_id;
>> +	struct uio_info *info = idev->info;
>> +	struct rte_uio_pci_dev *udev = info->priv;
>> +#endif
> Can we avoid checking Linux version number?
> This method won't work with kernel backports.
i don't think that is a bug rather than a kernel feature parameter 
change , so i am not sure if it will definitely a chance exist for the 
kernel backport fix for that.
Thomas Monjalon Feb. 12, 2018, 9:46 a.m. | #4
12/02/2018 09:28, Guo, Jia:
> 
> On 2/9/2018 6:01 AM, Thomas Monjalon wrote:
> > 30/01/2018 11:01, Jeff Guo:
> >> udev could not detect remove and add event of device when hotplug in
> >> and out devices, that related with the fix about using pointer of
> >> rte_uio_pci_dev as dev_id instead of uio_device for irq device handler,
> >> that would result igb uio irq failure when kernel version after than 3.17.
> >> so this patch correct it by use kernel version check before handle the
> >> pci interrupt.
> >>
> >> Fixes: 6b9ed026a870 ("igb_uio: fix build with kernel <= 3.17")
> >> Signed-off-by: Jeff Guo <jia.guo@intel.com>
> >> ---
> >> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
> >>   	struct rte_uio_pci_dev *udev = (struct rte_uio_pci_dev *)dev_id;
> >>   	struct uio_info *info = &udev->info;
> >> -
> >> +#else
> >> +	struct uio_device *idev = (struct uio_device *)dev_id;
> >> +	struct uio_info *info = idev->info;
> >> +	struct rte_uio_pci_dev *udev = info->priv;
> >> +#endif
> > Can we avoid checking Linux version number?
> > This method won't work with kernel backports.
> i don't think that is a bug rather than a kernel feature parameter 
> change , so i am not sure if it will definitely a chance exist for the 
> kernel backport fix for that.

Features are also backported in some kernels.
Ferruh Yigit Feb. 13, 2018, 9:32 a.m. | #5
On 2/12/2018 8:28 AM, Guo, Jia wrote:
> 
> 
> On 2/9/2018 6:01 AM, Thomas Monjalon wrote:
>> 30/01/2018 11:01, Jeff Guo:
>>> udev could not detect remove and add event of device when hotplug in
>>> and out devices, that related with the fix about using pointer of
>>> rte_uio_pci_dev as dev_id instead of uio_device for irq device handler,
>>> that would result igb uio irq failure when kernel version after than 3.17.
>>> so this patch correct it by use kernel version check before handle the
>>> pci interrupt.
>>>
>>> Fixes: 6b9ed026a870 ("igb_uio: fix build with kernel <= 3.17")
>>> Signed-off-by: Jeff Guo <jia.guo@intel.com>
>>> ---
>>> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
>>>   	struct rte_uio_pci_dev *udev = (struct rte_uio_pci_dev *)dev_id;
>>>   	struct uio_info *info = &udev->info;
>>> -
>>> +#else
>>> +	struct uio_device *idev = (struct uio_device *)dev_id;
>>> +	struct uio_info *info = idev->info;
>>> +	struct rte_uio_pci_dev *udev = info->priv;
>>> +#endif
>> Can we avoid checking Linux version number?
>> This method won't work with kernel backports.
> i don't think that is a bug rather than a kernel feature parameter 
> change , so i am not sure if it will definitely a chance exist for the 
> kernel backport fix for that.

Hi Jeff,

What we tend to do is add version check to compat.h and define a feature based
on that check and use feature define in .c . This makes .c file more readable
and if in the future we need to add more check because of backported kernels
(mostly we need to do) that checks all goes into compat.h and .c file remains clean.

Thanks,
ferruh
Jeff Guo Feb. 27, 2018, 6:17 a.m. | #6
On 2/13/2018 5:32 PM, Ferruh Yigit wrote:
> On 2/12/2018 8:28 AM, Guo, Jia wrote:
>>
>> On 2/9/2018 6:01 AM, Thomas Monjalon wrote:
>>> 30/01/2018 11:01, Jeff Guo:
>>>> udev could not detect remove and add event of device when hotplug in
>>>> and out devices, that related with the fix about using pointer of
>>>> rte_uio_pci_dev as dev_id instead of uio_device for irq device handler,
>>>> that would result igb uio irq failure when kernel version after than 3.17.
>>>> so this patch correct it by use kernel version check before handle the
>>>> pci interrupt.
>>>>
>>>> Fixes: 6b9ed026a870 ("igb_uio: fix build with kernel <= 3.17")
>>>> Signed-off-by: Jeff Guo <jia.guo@intel.com>
>>>> ---
>>>> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
>>>>    	struct rte_uio_pci_dev *udev = (struct rte_uio_pci_dev *)dev_id;
>>>>    	struct uio_info *info = &udev->info;
>>>> -
>>>> +#else
>>>> +	struct uio_device *idev = (struct uio_device *)dev_id;
>>>> +	struct uio_info *info = idev->info;
>>>> +	struct rte_uio_pci_dev *udev = info->priv;
>>>> +#endif
>>> Can we avoid checking Linux version number?
>>> This method won't work with kernel backports.
>> i don't think that is a bug rather than a kernel feature parameter
>> change , so i am not sure if it will definitely a chance exist for the
>> kernel backport fix for that.
> Hi Jeff,
>
> What we tend to do is add version check to compat.h and define a feature based
> on that check and use feature define in .c . This makes .c file more readable
> and if in the future we need to add more check because of backported kernels
> (mostly we need to do) that checks all goes into compat.h and .c file remains clean.
>
> Thanks,
> ferruh
make sense, let me check the compat.h file and use it in this case.

Patch

diff --git a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
index 9f0fb5e..14ce2ea 100644
--- a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
+++ b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
@@ -192,9 +192,14 @@  igbuio_pci_irqcontrol(struct uio_info *info, s32 irq_state)
 static irqreturn_t
 igbuio_pci_irqhandler(int irq, void *dev_id)
 {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
 	struct rte_uio_pci_dev *udev = (struct rte_uio_pci_dev *)dev_id;
 	struct uio_info *info = &udev->info;
-
+#else
+	struct uio_device *idev = (struct uio_device *)dev_id;
+	struct uio_info *info = idev->info;
+	struct rte_uio_pci_dev *udev = info->priv;
+#endif
 	/* Legacy mode need to mask in hardware */
 	if (udev->mode == RTE_INTR_MODE_LEGACY &&
 	    !pci_check_and_mask_intx(udev->pdev))
@@ -279,9 +284,15 @@  igbuio_pci_enable_interrupts(struct rte_uio_pci_dev *udev)
 	}
 
 	if (udev->info.irq != UIO_IRQ_NONE)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
 		err = request_irq(udev->info.irq, igbuio_pci_irqhandler,
 				  udev->info.irq_flags, udev->info.name,
 				  udev);
+#else
+		err = request_irq(udev->info.irq, igbuio_pci_irqhandler,
+				  udev->info.irq_flags, udev->info.name,
+				  udev->info.uio_dev);
+#endif
 	dev_info(&udev->pdev->dev, "uio device registered with irq %lx\n",
 		 udev->info.irq);
 
@@ -292,7 +303,11 @@  static void
 igbuio_pci_disable_interrupts(struct rte_uio_pci_dev *udev)
 {
 	if (udev->info.irq) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
 		free_irq(udev->info.irq, udev);
+#else
+		free_irq(udev->info.irq, udev->info.uio_dev);
+#endif
 		udev->info.irq = 0;
 	}