diff mbox series

[ovs-dev] netdev-offload-dpdk: Fix crash in debug log.

Message ID 20230526150449.2796703-1-david.marchand@redhat.com
State Accepted
Commit c3e410a03ad0068fabf309d3714ecb9f08d66839
Headers show
Series [ovs-dev] netdev-offload-dpdk: Fix crash in debug log. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation fail test: fail

Commit Message

David Marchand May 26, 2023, 3:04 p.m. UTC
The offload thread calling ufid_to_rte_flow_disassociate() may be the
last one holding a reference on the netdev and physdev.
So displaying informations about them might trigger a crash when
removing a physical port.

Fixes: faf71e492263 ("netdev-dpdk: Print port name in offload API messages.")
Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 lib/netdev-offload-dpdk.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Mike Pattrick May 26, 2023, 8:32 p.m. UTC | #1
On Fri, May 26, 2023 at 11:05 AM David Marchand
<david.marchand@redhat.com> wrote:
>
> The offload thread calling ufid_to_rte_flow_disassociate() may be the
> last one holding a reference on the netdev and physdev.
> So displaying informations about them might trigger a crash when
> removing a physical port.
>
> Fixes: faf71e492263 ("netdev-dpdk: Print port name in offload API messages.")
> Signed-off-by: David Marchand <david.marchand@redhat.com>

LGTM.

Acked-by: Mike Pattrick <mkp@redhat.com>

> ---
>  lib/netdev-offload-dpdk.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
> index 7c91f8a799..14bc877719 100644
> --- a/lib/netdev-offload-dpdk.c
> +++ b/lib/netdev-offload-dpdk.c
> @@ -2345,13 +2345,13 @@ netdev_offload_dpdk_flow_destroy(struct ufid_to_rte_flow_data *rte_flow_data)
>              ovsrcu_get(void *, &netdev->hw_info.offload_data);
>          data->rte_flow_counters[tid]--;
>
> -        ufid_to_rte_flow_disassociate(rte_flow_data);
>          VLOG_DBG_RL(&rl, "%s/%s: rte_flow 0x%"PRIxPTR
>                      " flow destroy %d ufid " UUID_FMT,
>                      netdev_get_name(netdev), netdev_get_name(physdev),
>                      (intptr_t) rte_flow,
>                      netdev_dpdk_get_port_id(physdev),
>                      UUID_ARGS((struct uuid *) ufid));
> +        ufid_to_rte_flow_disassociate(rte_flow_data);
>      } else {
>          VLOG_ERR("Failed flow: %s/%s: flow destroy %d ufid " UUID_FMT,
>                   netdev_get_name(netdev), netdev_get_name(physdev),
> --
> 2.40.1
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
Ilya Maximets May 29, 2023, 7:24 p.m. UTC | #2
On 5/26/23 22:32, Mike Pattrick wrote:
> On Fri, May 26, 2023 at 11:05 AM David Marchand
> <david.marchand@redhat.com> wrote:
>>
>> The offload thread calling ufid_to_rte_flow_disassociate() may be the
>> last one holding a reference on the netdev and physdev.
>> So displaying informations about them might trigger a crash when
>> removing a physical port.
>>
>> Fixes: faf71e492263 ("netdev-dpdk: Print port name in offload API messages.")
>> Signed-off-by: David Marchand <david.marchand@redhat.com>
> 
> LGTM.
> 
> Acked-by: Mike Pattrick <mkp@redhat.com>

Thanks!  Applied and backported down to 2.17.

Best regards, Ilya Maximets.
diff mbox series

Patch

diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index 7c91f8a799..14bc877719 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -2345,13 +2345,13 @@  netdev_offload_dpdk_flow_destroy(struct ufid_to_rte_flow_data *rte_flow_data)
             ovsrcu_get(void *, &netdev->hw_info.offload_data);
         data->rte_flow_counters[tid]--;
 
-        ufid_to_rte_flow_disassociate(rte_flow_data);
         VLOG_DBG_RL(&rl, "%s/%s: rte_flow 0x%"PRIxPTR
                     " flow destroy %d ufid " UUID_FMT,
                     netdev_get_name(netdev), netdev_get_name(physdev),
                     (intptr_t) rte_flow,
                     netdev_dpdk_get_port_id(physdev),
                     UUID_ARGS((struct uuid *) ufid));
+        ufid_to_rte_flow_disassociate(rte_flow_data);
     } else {
         VLOG_ERR("Failed flow: %s/%s: flow destroy %d ufid " UUID_FMT,
                  netdev_get_name(netdev), netdev_get_name(physdev),