Checks
Commit Message
The device event interrupt handler was always freed.
Bugzilla ID: 845
Fixes: c2bd9367e18f ("lib: remove direct access to interrupt handle")
Signed-off-by: David Marchand <david.marchand@redhat.com>
---
lib/eal/linux/eal_dev.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
Comments
> -----Original Message-----
> From: David Marchand <david.marchand@redhat.com>
> Sent: Tuesday, November 2, 2021 3:53 PM
> To: dev@dpdk.org
> Cc: Jiang, YuX <yux.jiang@intel.com>; Harman Kalra <hkalra@marvell.com>
> Subject: [PATCH] eal: fix device hotplug
>
> The device event interrupt handler was always freed.
>
> Bugzilla ID: 845
> Fixes: c2bd9367e18f ("lib: remove direct access to interrupt handle")
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> lib/eal/linux/eal_dev.c | 12 +++++++++---
> 1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/lib/eal/linux/eal_dev.c b/lib/eal/linux/eal_dev.c index
> 06820a3666..925cdba553 100644
> --- a/lib/eal/linux/eal_dev.c
> +++ b/lib/eal/linux/eal_dev.c
> @@ -317,10 +317,12 @@ rte_dev_event_monitor_start(void)
> goto exit;
> }
>
> - if (rte_intr_type_set(intr_handle, RTE_INTR_HANDLE_DEV_EVENT))
> + ret = rte_intr_type_set(intr_handle,
> RTE_INTR_HANDLE_DEV_EVENT);
> + if (ret)
> goto exit;
>
> - if (rte_intr_fd_set(intr_handle, -1))
> + ret = rte_intr_fd_set(intr_handle, -1);
> + if (ret)
> goto exit;
>
> ret = dev_uev_socket_fd_create();
> @@ -339,7 +341,10 @@ rte_dev_event_monitor_start(void)
> monitor_refcount++;
>
> exit:
> - rte_intr_instance_free(intr_handle);
> + if (ret) {
> + rte_intr_instance_free(intr_handle);
> + intr_handle = NULL;
> + }
> rte_rwlock_write_unlock(&monitor_lock);
> return ret;
> }
> @@ -370,6 +375,7 @@ rte_dev_event_monitor_stop(void)
>
> close(rte_intr_fd_get(intr_handle));
> rte_intr_instance_free(intr_handle);
> + intr_handle = NULL;
>
> monitor_refcount--;
>
> --
> 2.23.0
Hi David,
The patch https://patchwork.dpdk.org/project/dpdk/patch/20211102075259.3392-1-david.marchand@redhat.com/
failed to verify.
after executing "device_del dev1" in the qemu window, the testpmd window hangs to death and output as following:
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
EAL: Cannot find bus for device (0000:00:05.0)
On 11/2/21 08:52, David Marchand wrote:
> The device event interrupt handler was always freed.
>
> Bugzilla ID: 845
> Fixes: c2bd9367e18f ("lib: remove direct access to interrupt handle")
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> lib/eal/linux/eal_dev.c | 12 +++++++++---
> 1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/lib/eal/linux/eal_dev.c b/lib/eal/linux/eal_dev.c
> index 06820a3666..925cdba553 100644
> --- a/lib/eal/linux/eal_dev.c
> +++ b/lib/eal/linux/eal_dev.c
> @@ -317,10 +317,12 @@ rte_dev_event_monitor_start(void)
> goto exit;
> }
>
> - if (rte_intr_type_set(intr_handle, RTE_INTR_HANDLE_DEV_EVENT))
> + ret = rte_intr_type_set(intr_handle, RTE_INTR_HANDLE_DEV_EVENT);
> + if (ret)
> goto exit;
>
> - if (rte_intr_fd_set(intr_handle, -1))
> + ret = rte_intr_fd_set(intr_handle, -1);
> + if (ret)
> goto exit;
>
> ret = dev_uev_socket_fd_create();
> @@ -339,7 +341,10 @@ rte_dev_event_monitor_start(void)
> monitor_refcount++;
>
> exit:
> - rte_intr_instance_free(intr_handle);
> + if (ret) {
> + rte_intr_instance_free(intr_handle);
> + intr_handle = NULL;
> + }
> rte_rwlock_write_unlock(&monitor_lock);
> return ret;
> }
> @@ -370,6 +375,7 @@ rte_dev_event_monitor_stop(void)
>
> close(rte_intr_fd_get(intr_handle));
> rte_intr_instance_free(intr_handle);
> + intr_handle = NULL;
>
> monitor_refcount--;
>
>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Thanks,
Maxime
On Tue, Nov 2, 2021 at 10:35 AM Jiang, YuX <yux.jiang@intel.com> wrote:
> > -----Original Message-----
> > From: David Marchand <david.marchand@redhat.com>
> > Sent: Tuesday, November 2, 2021 3:53 PM
> > To: dev@dpdk.org
> > Cc: Jiang, YuX <yux.jiang@intel.com>; Harman Kalra <hkalra@marvell.com>
> > Subject: [PATCH] eal: fix device hotplug
> >
> > The device event interrupt handler was always freed.
> >
> > Bugzilla ID: 845
> > Fixes: c2bd9367e18f ("lib: remove direct access to interrupt handle")
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
> > ---
> > lib/eal/linux/eal_dev.c | 12 +++++++++---
> > 1 file changed, 9 insertions(+), 3 deletions(-)
> >
> > diff --git a/lib/eal/linux/eal_dev.c b/lib/eal/linux/eal_dev.c index
> > 06820a3666..925cdba553 100644
> > --- a/lib/eal/linux/eal_dev.c
> > +++ b/lib/eal/linux/eal_dev.c
> > @@ -317,10 +317,12 @@ rte_dev_event_monitor_start(void)
> > goto exit;
> > }
> >
> > - if (rte_intr_type_set(intr_handle, RTE_INTR_HANDLE_DEV_EVENT))
> > + ret = rte_intr_type_set(intr_handle,
> > RTE_INTR_HANDLE_DEV_EVENT);
> > + if (ret)
> > goto exit;
> >
> > - if (rte_intr_fd_set(intr_handle, -1))
> > + ret = rte_intr_fd_set(intr_handle, -1);
> > + if (ret)
> > goto exit;
> >
> > ret = dev_uev_socket_fd_create();
> > @@ -339,7 +341,10 @@ rte_dev_event_monitor_start(void)
> > monitor_refcount++;
> >
> > exit:
> > - rte_intr_instance_free(intr_handle);
> > + if (ret) {
> > + rte_intr_instance_free(intr_handle);
> > + intr_handle = NULL;
> > + }
> > rte_rwlock_write_unlock(&monitor_lock);
> > return ret;
> > }
> > @@ -370,6 +375,7 @@ rte_dev_event_monitor_stop(void)
> >
> > close(rte_intr_fd_get(intr_handle));
> > rte_intr_instance_free(intr_handle);
> > + intr_handle = NULL;
> >
> > monitor_refcount--;
> >
> > --
> > 2.23.0
> Hi David,
>
> The patch https://patchwork.dpdk.org/project/dpdk/patch/20211102075259.3392-1-david.marchand@redhat.com/
> failed to verify.
>
> after executing "device_del dev1" in the qemu window, the testpmd window hangs to death and output as following:
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
> EAL: Cannot find bus for device (0000:00:05.0)
Replying on the ml, since the discussion mainly happened in bugzilla.
This first patch was not enough, another issue was caught in the pci
bus hotplug code.
On Thu, Nov 4, 2021 at 3:11 PM Maxime Coquelin
<maxime.coquelin@redhat.com> wrote:
> On 11/2/21 08:52, David Marchand wrote:
> > The device event interrupt handler was always freed.
> >
> > Bugzilla ID: 845
> > Fixes: c2bd9367e18f ("lib: remove direct access to interrupt handle")
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
Tested-by: Yan Xia <yanx.xia@intel.com>
> Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Applied, thanks.
@@ -317,10 +317,12 @@ rte_dev_event_monitor_start(void)
goto exit;
}
- if (rte_intr_type_set(intr_handle, RTE_INTR_HANDLE_DEV_EVENT))
+ ret = rte_intr_type_set(intr_handle, RTE_INTR_HANDLE_DEV_EVENT);
+ if (ret)
goto exit;
- if (rte_intr_fd_set(intr_handle, -1))
+ ret = rte_intr_fd_set(intr_handle, -1);
+ if (ret)
goto exit;
ret = dev_uev_socket_fd_create();
@@ -339,7 +341,10 @@ rte_dev_event_monitor_start(void)
monitor_refcount++;
exit:
- rte_intr_instance_free(intr_handle);
+ if (ret) {
+ rte_intr_instance_free(intr_handle);
+ intr_handle = NULL;
+ }
rte_rwlock_write_unlock(&monitor_lock);
return ret;
}
@@ -370,6 +375,7 @@ rte_dev_event_monitor_stop(void)
close(rte_intr_fd_get(intr_handle));
rte_intr_instance_free(intr_handle);
+ intr_handle = NULL;
monitor_refcount--;