vnet/interface: vnet_(put|get)frame_to_sw_interface is not worker thread aware 51/10851/2
authorSteven <sluong@cisco.com>
Tue, 27 Feb 2018 22:43:40 +0000 (14:43 -0800)
committerSteven <sluong@cisco.com>
Tue, 27 Feb 2018 23:15:02 +0000 (15:15 -0800)
When heavy traffic is running using worker threads, it may crash here

DBGvpp# 0: /home/sluong/vpp3/vpp/build-data/../src/vlib/main.c:1128 (dispatch_pending_node) assertion `f->flags & VLIB_FRAME_PENDING' fails

Thread 1 "vpp_main" received signal SIGABRT, Aborted.
0x00007ffff5d50428 in __GI_raise (sig=sig@entry=6)
    at ../sysdeps/unix/sysv/linux/raise.c:54
54 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb)

No crash was observed if only main thread was used.

Change-Id: I96f8b02ec23accc85c0f1ddecfeff6043b5e3c2b
Signed-off-by: Steven <sluong@cisco.com>
src/vnet/interface_funcs.h

index 5aecaff..9c96027 100644 (file)
@@ -245,7 +245,7 @@ always_inline vlib_frame_t *
 vnet_get_frame_to_sw_interface (vnet_main_t * vnm, u32 sw_if_index)
 {
   vnet_hw_interface_t *hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
-  return vlib_get_frame_to_node (vnm->vlib_main, hw->output_node_index);
+  return vlib_get_frame_to_node (vlib_get_main (), hw->output_node_index);
 }
 
 always_inline void
@@ -253,7 +253,7 @@ vnet_put_frame_to_sw_interface (vnet_main_t * vnm, u32 sw_if_index,
                                vlib_frame_t * f)
 {
   vnet_hw_interface_t *hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
-  return vlib_put_frame_to_node (vnm->vlib_main, hw->output_node_index, f);
+  return vlib_put_frame_to_node (vlib_get_main (), hw->output_node_index, f);
 }
 
 /* Change interface flags (e.g. up, down, enable, disable). */