summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2015-10-29 18:15:17 +0200
committerimarom <imarom@cisco.com>2015-10-29 18:15:17 +0200
commit9a820782c35c6de79d2e724a48087e8ee62fc72d (patch)
tree08b13a55cd5eb4f93d51fca5fc373a9c7a9dfb72 /src
parente0e66e7eef2f9d1f4cb1c93841b2345a42c8d278 (diff)
Hanoch's review comments #1 : fixed performancei issue
with the stateless node
Diffstat (limited to 'src')
-rwxr-xr-xsrc/bp_sim.cpp12
-rwxr-xr-xsrc/bp_sim.h57
-rwxr-xr-xsrc/main_dpdk.cpp3
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.cpp43
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.h10
-rw-r--r--src/stateless/dp/trex_stream_node.h104
6 files changed, 122 insertions, 107 deletions
diff --git a/src/bp_sim.cpp b/src/bp_sim.cpp
index 72da7089..6e291367 100755
--- a/src/bp_sim.cpp
+++ b/src/bp_sim.cpp
@@ -25,6 +25,8 @@ limitations under the License.
#include "msg_manager.h"
#include <common/basic_utils.h>
+#include <trex_stream_node.h>
+
#undef VALG
#ifdef VALG
@@ -3459,8 +3461,14 @@ int CNodeGenerator::flush_file(dsec_t max_time,
if ( type == CGenNode::STATELESS_PKT ) {
m_p_queue.pop();
- // TODO: should this be inlined ? with IPO is this important ?
- thread->m_stateless_dp_info->handle_pkt_event(node);
+ CGenNodeStateless *node_sl = (CGenNodeStateless *)node;
+
+ /* if the stream has been deactivated - end */
+ if (unlikely(!node_sl->is_active())) {
+ thread->free_node(node);
+ } else {
+ node_sl->handle(thread);
+ }
}else{
if ( likely( type == CGenNode::FLOW_PKT ) ) {
diff --git a/src/bp_sim.h b/src/bp_sim.h
index 5747c2da..a11011ce 100755
--- a/src/bp_sim.h
+++ b/src/bp_sim.h
@@ -1639,62 +1639,6 @@ public:
} __rte_cache_aligned;
-/* this is a event for stateless */
-struct CGenNodeStateless : public CGenNodeBase {
-public:
-
- inline uint8_t *get_opaque_storage() {
- return (uint8_t *)&m_pad_end;
- }
-
-private:
- void * m_cache_mbuf;
-
-
- uint64_t m_pad_end[13];
-
-
-public:
-
- void set_socket_id(socket_id_t socket){
- m_socket_id=socket;
- }
-
- socket_id_t get_socket_id(){
- return ( m_socket_id );
- }
-
- inline void set_mbuf_cache_dir(pkt_dir_t dir){
- if (dir) {
- m_flags |=NODE_FLAGS_DIR;
- }else{
- m_flags &=~NODE_FLAGS_DIR;
- }
- }
-
- inline pkt_dir_t get_mbuf_cache_dir(){
- return ((pkt_dir_t)( m_flags &1));
- }
-
-
-
- inline void set_cache_mbuf(rte_mbuf_t * m){
- m_cache_mbuf=(void *)m;
- m_flags |= NODE_FLAGS_MBUF_CACHE;
- }
-
- inline rte_mbuf_t * get_cache_mbuf(){
- if ( m_flags &NODE_FLAGS_MBUF_CACHE ) {
- return ((rte_mbuf_t *)m_cache_mbuf);
- }else{
- return ((rte_mbuf_t *)0);
- }
- }
-
-
-} __rte_cache_aligned; ;
-
-
#if __x86_64__
/* size of 64 bytes */
@@ -1765,7 +1709,6 @@ public:
inline int check_objects_sizes(void){
COMPARE_NODE_OBJECT(CGenNodeDeferPort);
- COMPARE_NODE_OBJECT_SIZE(CGenNodeStateless);
return (0);
}
diff --git a/src/main_dpdk.cpp b/src/main_dpdk.cpp
index cf4de739..46fcb4a2 100755
--- a/src/main_dpdk.cpp
+++ b/src/main_dpdk.cpp
@@ -55,7 +55,10 @@ limitations under the License.
#include <common/arg/SimpleGlob.h>
#include <common/arg/SimpleOpt.h>
#include <common/basic_utils.h>
+
#include <stateless/cp/trex_stateless.h>
+#include <stateless/dp/trex_stream_node.h>
+
#include <../linux_dpdk/version.h>
extern "C" {
diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp
index 73387f0e..9c10504e 100644
--- a/src/stateless/dp/trex_stateless_dp_core.cpp
+++ b/src/stateless/dp/trex_stateless_dp_core.cpp
@@ -21,20 +21,10 @@ limitations under the License.
#include <trex_stateless_dp_core.h>
#include <trex_stateless_messaging.h>
#include <trex_streams_compiler.h>
+#include <trex_stream_node.h>
#include <bp_sim.h>
-/**
- * extended info for the stateless node
- * TODO:
- * static_assert(sizeof(dp_node_extended_info_st) <= sizeof(CGenNodeStateless::m_pad_end), "hello");
- */
-typedef struct dp_node_extended_info_ {
- double next_time_offset;
- uint8_t is_stream_active;
-
-} dp_node_extended_info_st;
-
TrexStatelessDpCore::TrexStatelessDpCore(uint8_t thread_id, CFlowGenListPerThread *core) {
m_thread_id = thread_id;
m_core = core;
@@ -62,29 +52,6 @@ TrexStatelessDpCore::start() {
}
void
-TrexStatelessDpCore::handle_pkt_event(CGenNode *node) {
-
- //TODO: optimize the fast path here...
-
- CGenNodeStateless *node_sl = (CGenNodeStateless *)node;
- dp_node_extended_info_st *opaque = (dp_node_extended_info_st *)node_sl->get_opaque_storage();
-
- /* is this stream active ? */
- if (!opaque->is_stream_active) {
- m_core->free_node(node);
- return;
- }
-
- m_core->m_node_gen.m_v_if->send_node(node);
-
- /* in case of continues */
- node->m_time += opaque->next_time_offset;
-
- /* insert a new event */
- m_core->m_node_gen.m_p_queue.push(node);
-}
-
-void
TrexStatelessDpCore::add_cont_stream(double pps, const uint8_t *pkt, uint16_t pkt_len) {
CGenNodeStateless *node = m_core->create_node_sl();
@@ -100,9 +67,8 @@ TrexStatelessDpCore::add_cont_stream(double pps, const uint8_t *pkt, uint16_t pk
uint16_t pkt_size = pkt_len;
const uint8_t *stream_pkt = pkt;
- dp_node_extended_info_st *opaque = (dp_node_extended_info_st *)node->get_opaque_storage();
- opaque->next_time_offset = 1.0 / pps;
- opaque->is_stream_active = 1;
+ node->m_next_time_offset = 1.0 / pps;
+ node->m_is_stream_active = 1;
/* allocate const mbuf */
rte_mbuf_t *m = CGlobalInfo::pktmbuf_alloc(node->get_socket_id(), pkt_size);
@@ -145,8 +111,7 @@ TrexStatelessDpCore::stop_traffic() {
for every active node - make sure next time
the scheduler invokes it, it will be free */
for (auto node : m_active_nodes) {
- dp_node_extended_info_st *opaque = (dp_node_extended_info_st *)node->get_opaque_storage();
- opaque->is_stream_active = 0;
+ node->m_is_stream_active = 0;
}
m_active_nodes.clear();
diff --git a/src/stateless/dp/trex_stateless_dp_core.h b/src/stateless/dp/trex_stateless_dp_core.h
index d95f7eeb..fa3c5b22 100644
--- a/src/stateless/dp/trex_stateless_dp_core.h
+++ b/src/stateless/dp/trex_stateless_dp_core.h
@@ -29,9 +29,8 @@ limitations under the License.
class TrexStatelessCpToDpMsgBase;
class TrexStatelessDpStart;
class CFlowGenListPerThread;
-class CGenNode;
-class TrexStreamsCompiledObj;
class CGenNodeStateless;
+class TrexStreamsCompiledObj;
class TrexStatelessDpCore {
@@ -52,13 +51,6 @@ public:
void start();
/**
- * handle pkt event
- *
- * @author imarom (27-Oct-15)
- */
- void handle_pkt_event(CGenNode *node);
-
- /**
* dummy traffic creator
*
* @author imarom (27-Oct-15)
diff --git a/src/stateless/dp/trex_stream_node.h b/src/stateless/dp/trex_stream_node.h
new file mode 100644
index 00000000..49481a5c
--- /dev/null
+++ b/src/stateless/dp/trex_stream_node.h
@@ -0,0 +1,104 @@
+/*
+ Itay Marom
+ Cisco Systems, Inc.
+*/
+
+/*
+Copyright (c) 2015-2015 Cisco Systems, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+#ifndef __TREX_STREAM_NODE_H__
+#define __TREX_STREAM_NODE_H__
+
+#include <bp_sim.h>
+
+class TrexStatelessDpCore;
+
+/* this is a event for stateless */
+struct CGenNodeStateless : public CGenNodeBase {
+friend class TrexStatelessDpCore;
+
+private:
+ void * m_cache_mbuf;
+
+ double m_next_time_offset;
+ uint8_t m_is_stream_active;
+
+ /* pad to match the size of CGenNode */
+ uint8_t m_pad_end[39];
+
+
+public:
+
+ inline bool is_active() {
+ return m_is_stream_active;
+ }
+
+
+ /**
+ * main function to handle an event of a packet tx
+ *
+ */
+ inline void handle(CFlowGenListPerThread *thread) {
+
+ thread->m_node_gen.m_v_if->send_node( (CGenNode *)this);
+
+ /* in case of continues */
+ m_time += m_next_time_offset;
+
+ /* insert a new event */
+ thread->m_node_gen.m_p_queue.push( (CGenNode *)this);
+ }
+
+ void set_socket_id(socket_id_t socket){
+ m_socket_id=socket;
+ }
+
+ socket_id_t get_socket_id(){
+ return ( m_socket_id );
+ }
+
+ inline void set_mbuf_cache_dir(pkt_dir_t dir){
+ if (dir) {
+ m_flags |=NODE_FLAGS_DIR;
+ }else{
+ m_flags &=~NODE_FLAGS_DIR;
+ }
+ }
+
+ inline pkt_dir_t get_mbuf_cache_dir(){
+ return ((pkt_dir_t)( m_flags &1));
+ }
+
+
+
+ inline void set_cache_mbuf(rte_mbuf_t * m){
+ m_cache_mbuf=(void *)m;
+ m_flags |= NODE_FLAGS_MBUF_CACHE;
+ }
+
+ inline rte_mbuf_t * get_cache_mbuf(){
+ if ( m_flags &NODE_FLAGS_MBUF_CACHE ) {
+ return ((rte_mbuf_t *)m_cache_mbuf);
+ }else{
+ return ((rte_mbuf_t *)0);
+ }
+ }
+
+
+} __rte_cache_aligned; ;
+
+static_assert(sizeof(CGenNodeStateless) == sizeof(CGenNode), "sizeof(CGenNodeStateless) != sizeof(CGenNode)");
+
+#endif /* __TREX_STREAM_NODE_H__ */