summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2017-12-05 10:43:03 +0800
committerQiuwen Lu <[email protected]>2017-12-05 10:43:03 +0800
commit807ec9b870a9e1b28f4176d92fcdd8dfe052148f (patch)
treebb96dd5903d27ae61a66f1abdae11c50501c42e1
parent8817d1203b309a8ca9ffcd8e3223b207c16a2f6c (diff)
增加申请/释放共享内存的接口,增加新的时间戳接口。v4.2.35-20171205
- 增加申请/释放共享内存的接口,该共享内存基于DPDK的大页内存,可以跨进程共享通信。 - 增加新的时间戳接口,获取128位时间戳,报文复制时该时间戳也随之复制。
-rw-r--r--app/include/mrapp.h3
-rw-r--r--app/src/mrb.c49
-rw-r--r--app/src/version.map5
-rw-r--r--cmake/Package.cmake4
-rw-r--r--include/external/marsio.h10
-rw-r--r--include/internal/mrb_define.h9
-rw-r--r--service/src/fwd.c11
7 files changed, 80 insertions, 11 deletions
diff --git a/app/include/mrapp.h b/app/include/mrapp.h
index c412070..7d42dc2 100644
--- a/app/include/mrapp.h
+++ b/app/include/mrapp.h
@@ -30,6 +30,9 @@ struct mrapp_stat
uint64_t packet_recv_drop;
uint64_t packet_send_drop;
+
+ uint64_t shared_mem_alloc;
+ uint64_t shared_men_free;
};
diff --git a/app/src/mrb.c b/app/src/mrb.c
index e5e8d32..912e9e2 100644
--- a/app/src/mrb.c
+++ b/app/src/mrb.c
@@ -2,6 +2,7 @@
#include <rte_common.h>
#include <rte_mbuf.h>
+#include <rte_malloc.h>
#include <assert.h>
#include <marsio.h>
#include <mrapp.h>
@@ -525,12 +526,52 @@ void marsio_pktmbuf_dump(FILE *f, const marsio_buff_t *m, unsigned dump_len)
uint64_t marsio_buff_get_timestamp(marsio_buff_t *m)
{
- struct rte_mbuf * __m = (struct rte_mbuf *)m;
- return __m->timestamp;
+ struct mrb_priv_zone * priv_zone = mrbuf_priv(m);
+ return priv_zone->ts.ts_app_rx_or_alloc.tv_nsec;
}
void marsio_buff_set_timestamp(marsio_buff_t *m, uint64_t timestamp)
{
- struct rte_mbuf * __m = (struct rte_mbuf *)m;
- __m->timestamp = timestamp;
+ return;
+}
+
+
+int marsio_buff_get_timestamp_ex(marsio_buff_t * m, enum mr_timestamp_type ts_type,
+ struct timespec * ts)
+{
+ struct mrb_priv_zone * priv_zone = mrbuf_priv(m);
+
+ switch (ts_type)
+ {
+ case MR_TIMESTAMP_RX_OR_ALLOC:
+ *ts = priv_zone->ts.ts_srv_rx_or_alloc;
+ break;
+
+ default:
+ assert(0);
+ return -EINVAL;
+ }
+
+ return RT_SUCCESS;
+}
+
+
+void * marsio_shared_mem_alloc(struct mr_instance * instance, size_t len)
+{
+ unsigned int thread_id = thread_info.thread_id;
+ instance->stat[thread_id].shared_mem_alloc += len;
+
+ return rte_malloc(NULL, len, 0);
+}
+
+void marsio_shared_mem_free(struct mr_instance * instance, void * mem)
+{
+ size_t sz_shared_mem;
+ rte_malloc_validate(mem, &sz_shared_mem);
+ rte_free(mem);
+
+ unsigned int thread_id = thread_info.thread_id;
+ instance->stat[thread_id].shared_men_free += sz_shared_mem;
+
+ return;
} \ No newline at end of file
diff --git a/app/src/version.map b/app/src/version.map
index 90c355d..7b4e91d 100644
--- a/app/src/version.map
+++ b/app/src/version.map
@@ -64,6 +64,11 @@ global:
marsio_buff_offset_get;
marsio_buff_get_timestamp;
marsio_buff_set_timestamp;
+
+ marsio_shared_mem_alloc;
+ marsio_shared_mem_free;
+
+ marsio_buff_get_timestamp_ex;
local: *;
}; \ No newline at end of file
diff --git a/cmake/Package.cmake b/cmake/Package.cmake
index c51eac0..ee1fca6 100644
--- a/cmake/Package.cmake
+++ b/cmake/Package.cmake
@@ -18,12 +18,12 @@ set(CPACK_RPM_AUTO_GENERATED_FILE_NAME ON)
set(CPACK_RPM_FILE_NAME "RPM-DEFAULT")
set(CPACK_RPM_PACKAGE_VENDOR "Mesasoft@IIE")
set(CPACK_RPM_PACKAGE_AUTOREQPROV "no")
-set(CPACK_RPM_PACKAGE_REQUIRES "/boot/vmlinuz-${MARSIO_VERSION_KERNEL}")
set(CPACK_RPM_PACKAGE_RELEASE_DIST on)
set(CPACK_RPM_DEBUGINFO_PACKAGE on)
set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/cmake/PostInstall.in)
set(CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/cmake/PostUninstall.in)
set(CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/cmake/PreUninstall.in)
+#set(CPACK_RPM_PACKAGE_REQUIRES "/boot/vmlinuz-${MARSIO_VERSION_KERNEL}")
# Must uninstall the debug package before install release package
@@ -37,7 +37,7 @@ endif()
set(CPACK_RPM_USER_FILELIST "/usr/lib/systemd/system/mrenv.service"
"/usr/lib/systemd/system/mrzcpd.service"
"/usr/lib/systemd/system/mrtunnat.service"
- "/usr/lib/systemd/system/mrmonit.service"
+ "/usr/lib/systemd/system/mrmonit.service"
"/etc/ld.so.conf.d/mrzcpd.conf"
"/etc/profile.d/mrzcpd.sh"
"${CMAKE_INSTALL_PREFIX}/lib/pkgconfig/mrzcpd.pc"
diff --git a/include/external/marsio.h b/include/external/marsio.h
index 457903e..f18e416 100644
--- a/include/external/marsio.h
+++ b/include/external/marsio.h
@@ -89,6 +89,12 @@ enum mr_thread_affinity_mode
MR_THREAD_AFFINITY_USER = 255
};
+enum mr_timestamp_type
+{
+ /* 从网卡收取时或报文缓冲区申请时的时间戳 */
+ MR_TIMESTAMP_RX_OR_ALLOC = 0,
+};
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -239,6 +245,10 @@ void marsio_buff_set_ctrlbuf(marsio_buff_t *m);
uint64_t marsio_buff_get_timestamp(marsio_buff_t *m);
void marsio_buff_set_timestamp(marsio_buff_t *m, uint64_t timestamp);
+int marsio_buff_get_timestamp_ex(marsio_buff_t * m, enum mr_timestamp_type ts_type, struct timespec * ts);
+
+void * marsio_shared_mem_alloc(struct mr_instance * instance, size_t len);
+void marsio_shared_mem_free(struct mr_instance * instance, void * mem);
#ifdef __cplusplus
}
diff --git a/include/internal/mrb_define.h b/include/internal/mrb_define.h
index c0f1df9..6d49776 100644
--- a/include/internal/mrb_define.h
+++ b/include/internal/mrb_define.h
@@ -12,9 +12,18 @@ struct mrb_zone_idx
uint8_t size;
};
+/* Private Zone for DEBUG */
+struct mrb_zone_ts
+{
+ struct timespec ts_srv_rx_or_alloc;
+ struct timespec ts_app_rx_or_alloc;
+};
+
struct mrb_priv_zone
{
struct rte_mbuf * next;
+ struct mrb_zone_ts ts;
+
uint8_t cz_num;
struct mrb_zone_idx idx[MRB_MAX_CTRLZONE_NUM];
}__rte_packed;
diff --git a/service/src/fwd.c b/service/src/fwd.c
index f4a7949..e8978d2 100644
--- a/service/src/fwd.c
+++ b/service/src/fwd.c
@@ -18,6 +18,7 @@
#include <rte_string_fns.h>
#include <MESA_prof_load.h>
#include <ldbc.h>
+#include <mrb_define.h>
struct dev_pair_stat
{
@@ -71,15 +72,13 @@ struct sw_forward_main
void timestamp_caculate(struct sc_main * sc, struct rte_mbuf * mbufs[], unsigned int nr_mbufs)
{
- if (!sc->en_pkt_timestamp) return;
-
struct timespec __timespec;
clock_gettime(CLOCK_MONOTONIC, &__timespec);
- uint64_t __timespec_conv = *(uint64_t *)&__timespec.tv_nsec;
for (int i = 0; i < nr_mbufs; i++)
{
- mbufs[i]->timestamp = __timespec_conv;
+ struct mrb_priv_zone * private_zone = mrbuf_priv(mbufs[i]);
+ private_zone->ts.ts_srv_rx_or_alloc = __timespec;
}
return;
@@ -144,7 +143,9 @@ void sw_forward_pv(struct sc_main * sc, struct fwd_rule * fwd_rule, unsigned int
unsigned int rx_nr_mbufs = rte_eth_rx_burst(phydev_from->port_id, local_rxq_id, mbufs, nr_rx_burst);
if (unlikely(rx_nr_mbufs == 0)) return;
- timestamp_caculate(sc, mbufs, rx_nr_mbufs);
+ if(unlikely(sc->en_pkt_timestamp))
+ timestamp_caculate(sc, mbufs, rx_nr_mbufs);
+
distributer_caculate(sc->dist_object, mbufs, rx_nr_mbufs);
vdev_dispatch(vdev_to, local_txq_id, mbufs, rx_nr_mbufs, 0);
return;