summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2020-07-13 17:13:23 +0800
committerQiuwen Lu <[email protected]>2020-07-13 17:13:23 +0800
commitd88306ecbe19ac393ef8206f8cdbb64b022c8c05 (patch)
tree0d8700f5eb252c55233e755f530933416274161c
parent29189285e1261a0be8bcb1b037b1e0cec91f68e3 (diff)
提供send_burst_flush接口,避免开启burst后小流量情况下报文在发送队列内堆积导致的延迟提高。v4.3.25-20200714
-rw-r--r--app/src/rawio.c8
-rw-r--r--app/src/version.map3
-rw-r--r--include/external/marsio.h1
-rw-r--r--infra/src/vnode_mirror.c2
-rw-r--r--tunnat/include/tunnat.h6
-rw-r--r--tunnat/src/core.cc5
-rw-r--r--tunnat/src/runtime.cc15
7 files changed, 36 insertions, 4 deletions
diff --git a/app/src/rawio.c b/app/src/rawio.c
index c30b410..51e00f8 100644
--- a/app/src/rawio.c
+++ b/app/src/rawio.c
@@ -250,6 +250,12 @@ err:
return RT_ERR;
}
+void marsio_send_burst_flush(struct mr_sendpath * sendpath, queue_id_t sid)
+{
+ vnode_mirror_flush(sendpath->target_vdi->vnode_tx_prod, sid);
+ vnode_mirror_flush(sendpath->target_vdi->vnode_ftx_prod, sid);
+}
+
int marsio_idle_poll(struct mr_instance * instance)
{
return 0;
@@ -298,4 +304,4 @@ int marsio_ipv4_header_construct(marsio_buff_t * buff, uint32_t s_ip, uint32_t d
ip_hdr->hdr_checksum = 0;
ip_hdr->hdr_checksum = rte_ipv4_cksum(ip_hdr);
return 0;
-} \ No newline at end of file
+}
diff --git a/app/src/version.map b/app/src/version.map
index 1e5f639..aa965ac 100644
--- a/app/src/version.map
+++ b/app/src/version.map
@@ -13,6 +13,7 @@ global:
marsio_recv_all_burst;
marsio_send_burst;
marsio_send_burst_with_options;
+ marsio_send_burst_flush;
marsio_buff_malloc_device;
marsio_buff_malloc_global;
marsio_buff_free;
@@ -72,4 +73,4 @@ global:
marsio_buff_set_rehash_index;
local: *;
-}; \ No newline at end of file
+};
diff --git a/include/external/marsio.h b/include/external/marsio.h
index 6a08331..a4d6d15 100644
--- a/include/external/marsio.h
+++ b/include/external/marsio.h
@@ -151,6 +151,7 @@ int marsio_recv_all_burst(struct mr_instance * instance, queue_id_t qid, marsio_
int marsio_send_burst(struct mr_sendpath * sendpath, queue_id_t qid, marsio_buff_t * mbufs[], int nr_mbufs);
int marsio_send_burst_with_options(struct mr_sendpath * sendpath, queue_id_t sid, marsio_buff_t * mbufs[],
int nr_mbufs, uint16_t options);
+void marsio_send_burst_flush(struct mr_sendpath * sendpath, queue_id_t sid);
int marsio_udp_header_construct(marsio_buff_t * buff, uint16_t s_port, uint16_t d_port);
int marsio_ipv4_header_construct(marsio_buff_t * buff, uint32_t s_ip, uint32_t d_ip, uint8_t proto);
diff --git a/infra/src/vnode_mirror.c b/infra/src/vnode_mirror.c
index f9dd672..43e7cb2 100644
--- a/infra/src/vnode_mirror.c
+++ b/infra/src/vnode_mirror.c
@@ -396,4 +396,4 @@ __USE_COMMON_VNODE_CONS_STAT_GET(mirror)
__USE_COMMON_VNODE_PROD_ATTACH(mirror)
__USE_COMMON_VNODE_CONS_ATTACH(mirror)
__USE_COMMON_VNODE_UNPOISON_PROD(mirror)
-__USE_COMMON_VNODE_UNPOISON_CONS(mirror) \ No newline at end of file
+__USE_COMMON_VNODE_UNPOISON_CONS(mirror)
diff --git a/tunnat/include/tunnat.h b/tunnat/include/tunnat.h
index 17a322f..a104768 100644
--- a/tunnat/include/tunnat.h
+++ b/tunnat/include/tunnat.h
@@ -59,6 +59,10 @@ struct TunnatThreadInstance;
#define MR_TUNNAT_DEFAULT_SESSION_EXPIRE_TIME 0
#endif
+#ifndef MR_TUNNAT_DEFAULT_IDLE_POLL_THRESHOLD
+#define MR_TUNNAT_DEFAULT_IDLE_POLL_THRESHOLD 1000000
+#endif
+
enum bridge_mode
{
MR_TUNNAT_BRIDGE_MODE_DISABLE,
@@ -91,6 +95,8 @@ struct TunnatInstance
unsigned int nr_burst{MR_TUNNAT_DEFAULT_NR_BURST};
/* 运行数据面线程核心掩码 */
cpu_set_t coremask{};
+ /* IDLE POLL Threshold */
+ unsigned int idle_threshold{MR_TUNNAT_DEFAULT_IDLE_POLL_THRESHOLD};
/* 会话表使用四元组还是二元组 */
unsigned int sess_tb_order_by_tuple4{MR_TUNNAT_DEFAULT_SESSION_TUPLE4};
diff --git a/tunnat/src/core.cc b/tunnat/src/core.cc
index 0588f44..1999d96 100644
--- a/tunnat/src/core.cc
+++ b/tunnat/src/core.cc
@@ -340,6 +340,11 @@ int tunnat_mrinstance_setup(TunnatInstance * instance)
}
instance->mr_instance = _mr_instance;
+
+ // Idle threshold
+ MESA_load_profile_uint_def(instance->cfgfile.c_str(), "tunnat", "idle_threshold",
+ &instance->idle_threshold, MR_TUNNAT_DEFAULT_IDLE_POLL_THRESHOLD);
+
return RT_SUCCESS;
}
diff --git a/tunnat/src/runtime.cc b/tunnat/src/runtime.cc
index cb0c7ae..6055d1a 100644
--- a/tunnat/src/runtime.cc
+++ b/tunnat/src/runtime.cc
@@ -705,11 +705,24 @@ void * tunnat_thread_loop(void * arg)
auto & virtdev = instance->virtdevs[0];
auto & phydev = instance->phydevs[0];
+ /* Idle Counter*/
+ unsigned long idle_counter = 0;
+
while (g_keep_running)
{
__phy_to_virt_one_device(instance, th_instance, &phydev, &virtdev);
__virt_to_phy_one_device(instance, th_instance, &phydev, &virtdev);
+
+ if(likely(instance->idle_threshold > 0) &&
+ unlikely(idle_counter >= instance->idle_threshold))
+ {
+ marsio_send_burst_flush(virtdev.vdev_sendpath, th_instance->thread_id);
+ marsio_send_burst_flush(phydev.vdev_sendpath, th_instance->thread_id);
+ idle_counter = 0;
+ }
+
+ idle_counter++;
}
- return 0;
+ return (void *)nullptr;
}