diff options
author | imarom <imarom@cisco.com> | 2015-10-29 18:15:17 +0200 |
---|---|---|
committer | imarom <imarom@cisco.com> | 2015-10-29 18:15:17 +0200 |
commit | 9a820782c35c6de79d2e724a48087e8ee62fc72d (patch) | |
tree | 08b13a55cd5eb4f93d51fca5fc373a9c7a9dfb72 /src/stateless/dp | |
parent | e0e66e7eef2f9d1f4cb1c93841b2345a42c8d278 (diff) |
Hanoch's review comments #1 : fixed performancei issue
with the stateless node
Diffstat (limited to 'src/stateless/dp')
-rw-r--r-- | src/stateless/dp/trex_stateless_dp_core.cpp | 43 | ||||
-rw-r--r-- | src/stateless/dp/trex_stateless_dp_core.h | 10 | ||||
-rw-r--r-- | src/stateless/dp/trex_stream_node.h | 104 |
3 files changed, 109 insertions, 48 deletions
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__ */ |