本文共 1994 字,大约阅读时间需要 6 分钟。
trace功能
在使能trace功能后,发现dpdk-input的feature节点是没有开启trace的,因为
查看代码\vpp-1701\vnet\vnet\devices\dpdk\node.c
关键函数是
static_always_inline u32dpdk_device_input (dpdk_main_t * dm, dpdk_device_t * xd, vlib_node_runtime_t * node, u32 cpu_index, u16 queue_id){ ...... while (n_buffers > 0) { ...... vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next); while (n_buffers > 8 && n_left_to_next > 4) { } while (n_buffers > 0 && n_left_to_next > 0) { /* Do we have any driver RX features configured on the interface? */ vnet_feature_start_device_input_x1 (xd->vlib_sw_if_index, &next0, b0, l3_offset0); vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next, n_left_to_next, bi0, next0); n_buffers--; mb_index++; } vlib_put_next_frame (vm, node, next_index, n_left_to_next); } if (PREDICT_FALSE (vec_len (xd->d_trace_buffers[cpu_index]) > 0)) { dpdk_rx_trace (dm, node, xd, queue_id, xd->d_trace_buffers[cpu_index], vec_len (xd->d_trace_buffers[cpu_index])); vlib_set_trace_count (vm, node, n_trace - vec_len (xd->d_trace_buffers[cpu_index])); } vlib_increment_combined_counter (vnet_get_main ()->interface_main.combined_sw_if_counters + VNET_INTERFACE_COUNTER_RX, cpu_index, xd->vlib_sw_if_index, mb_index, n_rx_bytes); dpdk_worker_t *dw = vec_elt_at_index (dm->workers, cpu_index); dw->aggregate_rx_packets += mb_index; return mb_index;}
dpdk_rx_trace开始使能node trace,注意上面函数dpdk_rx_trace函数的执行位置。
if (PREDICT_FALSE (vec_len (xd->d_trace_buffers[cpu_index]) > 0)) { dpdk_rx_trace (dm, node, xd, queue_id, xd->d_trace_buffers[cpu_index], vec_len (xd->d_trace_buffers[cpu_index])); vlib_set_trace_count (vm, node, n_trace - vec_len (xd->d_trace_buffers[cpu_index])); }
在dpdk-input node 后添加feature node 后,vlib_put_next_frame (vm, node, next_index, n_left_to_next)中 next_index,会是feature node的索引,
而dpdk_rx_trace里的下一节点索引还是默认的,所以feature node 就不会trace了
转载地址:http://dbqci.baihongyu.com/