On 6/14/24 13:33, Simon Jones wrote: > ``` > Date: Fri Jun 14 19:25:43 2024 +0800 > > bugfix of meter tc crash. > > diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c > index 9fde5f7a9..d08c5a35f 100644 > --- a/lib/netdev-offload.c > +++ b/lib/netdev-offload.c > @@ -186,7 +186,6 @@ netdev_assign_flow_api(struct netdev *netdev) > ovsrcu_set(&netdev->flow_api, rfa->flow_api); > VLOG_INFO("%s: Assigned flow API '%s'.", > netdev_get_name(netdev), rfa->flow_api->type); > - return 0; > } > VLOG_DBG("%s: flow API '%s' is not suitable.", > netdev_get_name(netdev), rfa->flow_api->type); > ``` > > ---- > Simon Jones > > > Simon Jones <batmanu...@gmail.com> 于2024年6月14日周五 19:25写道: > >> Maybe reason is this: >> ``` >> @netdev_offload_tc and @netdev_offload_dpdk will always be register. >> Then the @meter_set api will be called. >> The @meter_set could be called only after @init_flow_api, but the BUG >> happens when @meter_set is called before @init_flow_api is called. >> >> Check these code: >> >> static int >> netdev_assign_flow_api(struct netdev *netdev) >> { >> struct netdev_registered_flow_api *rfa; >> >> CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) { >> if (!rfa->flow_api->init_flow_api(netdev)) { >> ovs_refcount_ref(&rfa->refcnt); >> ovsrcu_set(&netdev->flow_api, rfa->flow_api); >> VLOG_INFO("%s: Assigned flow API '%s'.", >> netdev_get_name(netdev), rfa->flow_api->type); >> return 0; >> } >> VLOG_DBG("%s: flow API '%s' is not suitable.", >> netdev_get_name(netdev), rfa->flow_api->type); >> } >> VLOG_INFO("%s: No suitable flow API found.", netdev_get_name(netdev)); >> >> return -1; >> } >> >> ONLY one type of rfa->flow_api->init_flow_api (DPDK or TC) could be called. >> Because after one called, then return 0. >> ``` >> >> So I suggest to just remove 'return 0'.
Hi, Simon. This is not a correct thing to do. By design, only one flow API should be able to accept a particular port type. If two API implementations can accept the same port, that would be a bug. Also, initializing more than one API will cause resource leaks and potentially incorrect datapath behavior. Since you're using userspace datapath, init_flow_api() from the TC implementation should always fail. What is your OVS version? Best regards, Ilya Maximets. >> Like this patch: >> >> ---- >> Simon Jones >> >> >> Simon Jones <batmanu...@gmail.com> 于2024年6月11日周二 17:32写道: >> >>> >>> Hi all, >>> >>> I'm using ovs-dpdk with this patch: >>> ``` >>> commit 4c226944f7c55c9d6e7c85f7c33c5ce11c35ce54 >>> Author: Jianbo Liu <jian...@nvidia.com> >>> Date: Fri Jul 8 03:06:26 2022 +0000 >>> >>> netdev-offload-tc: Implement meter offload API for tc >>> ``` >>> This patch is for offload flow meter by tc. >>> >>> Now I found a bug: ovs crash when add meter openflow. >>> >>> 1. How to produce: >>> (NOTICE: This bug is not always reproducible.) >>> ``` >>> Add these commands: >>> >>> ovs-ofctl -O OpenFlow13 add-meter br-int >>> meter=1,kbps,band=type=drop,rate=1000 >>> ovs-ofctl -O OpenFlow13 add-flow br-int in_port=\"pf0vf0\",ip,nw_src= >>> 16.0.0.0/24,nw_dst=48.0.0.0/24,nw_proto=17,actions=\ >>> <http://16.0.0.0/24,nw_dst=48.0.0.0/24,nw_proto=17,actions=%5C> >>> "meter:1,output:p0\" >>> ovs-ofctl -O OpenFlow13 add-flow br-int >>> in_port=\"pf0vf0\",udp6,ipv6_src=2001:4860:0:2001::/64,ipv6_dst=2001:0:4137:9350:8000:f12a:b9c8:2815,actions=\"meter:1,output:p0\" >>> >>> Then ovs crash, this is core file call trace: >>> >>> (gdb) bt >>> #0 id_pool_alloc_id (pool=0x0, id_=id_@entry=0x7fff180c841c) at >>> lib/id-pool.c:112 >>> #1 0x000000000055f0a0 in meter_alloc_police_index >>> (police_index=0x7fff180c841c) at lib/netdev-offload-tc.c:2530 >>> #2 meter_tc_set_policer (meter_id=..., config=0x7fff180c8538) at >>> lib/netdev-offload-tc.c:2567 >>> #3 0x00000000004af207 in meter_offload_set (meter_id=meter_id@entry=..., >>> config=config@entry=0x7fff180c8538) at lib/netdev-offload.c:207 >>> #4 0x0000000000474c2b in dpif_netdev_meter_set (dpif=<optimized out>, >>> meter_id=..., config=0x7fff180c8538) at lib/dpif-netdev.c:9137 >>> #5 0x000000000048e3fd in dpif_meter_set (dpif=0x28cfd10, meter_id=..., >>> config=<optimized out>) at lib/dpif.c:1973 >>> #6 0x000000000042daf8 in meter_set (ofproto_=0x28cc670, >>> meter_id=0x7fff180c8590, config=<optimized out>) at >>> ofproto/ofproto-dpif.c:6751 >>> #7 0x0000000000423e91 in handle_add_meter (mm=0x7fff180c8530, >>> ofproto=0x28cc670) at ofproto/ofproto.c:6905 >>> #8 handle_meter_mod (ofconn=0x29073d0, oh=0x291bd40) at >>> ofproto/ofproto.c:7013 >>> #9 0x0000000000426d21 in handle_single_part_openflow >>> (type=OFPTYPE_METER_MOD, oh=0x291bd40, ofconn=0x29073d0) at >>> ofproto/ofproto.c:8668 >>> #10 handle_openflow (ofconn=0x29073d0, msgs=0x7fff180c88c0) at >>> ofproto/ofproto.c:8843 >>> #11 0x000000000045b3b4 in ofconn_run (handle_openflow=0x4267b0 >>> <handle_openflow>, ofconn=0x29073d0) at ofproto/connmgr.c:1329 >>> #12 connmgr_run (mgr=0x272a200, >>> handle_openflow=handle_openflow@entry=0x4267b0 >>> <handle_openflow>) at ofproto/connmgr.c:356 >>> #13 0x00000000004209be in ofproto_run (p=0x28cc670) at >>> ofproto/ofproto.c:1964 >>> #14 0x000000000040da44 in bridge_run__ () at vswitchd/bridge.c:3251 >>> #15 0x00000000004138ec in bridge_run () at vswitchd/bridge.c:3310 >>> #16 0x000000000040955d in main (argc=<optimized out>, argv=<optimized >>> out>) at vswitchd/ovs-vswitchd.c:129 >>> >>> ``` >>> >>> 2. Check code: >>> ``` >>> Notice >>> #0 id_pool_alloc_id (pool=0x0, id_=id_@entry=0x7fff180c841c) at >>> lib/id-pool.c:112 >>> the @pool param is NULL. >>> >>> This is happened ONLY when @netdev_tc_init_flow_api is NOT called. >>> But in code, ONLY after @netdev_tc_init_flow_api is called, the >>> @handle_meter_mod could works on netdev with system type. >>> ``` >>> >>> 3. My question: >>> - How this BUG happen? >>> - Is there patch to solve this BUG? >>> >>> >>> ---- >>> Simon Jones >>> >> > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev