diff options
| author | Qiuwen Lu <[email protected]> | 2017-12-05 10:43:03 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2017-12-05 10:43:03 +0800 |
| commit | 807ec9b870a9e1b28f4176d92fcdd8dfe052148f (patch) | |
| tree | bb96dd5903d27ae61a66f1abdae11c50501c42e1 | |
| parent | 8817d1203b309a8ca9ffcd8e3223b207c16a2f6c (diff) | |
增加申请/释放共享内存的接口,增加新的时间戳接口。v4.2.35-20171205
- 增加申请/释放共享内存的接口,该共享内存基于DPDK的大页内存,可以跨进程共享通信。
- 增加新的时间戳接口,获取128位时间戳,报文复制时该时间戳也随之复制。
| -rw-r--r-- | app/include/mrapp.h | 3 | ||||
| -rw-r--r-- | app/src/mrb.c | 49 | ||||
| -rw-r--r-- | app/src/version.map | 5 | ||||
| -rw-r--r-- | cmake/Package.cmake | 4 | ||||
| -rw-r--r-- | include/external/marsio.h | 10 | ||||
| -rw-r--r-- | include/internal/mrb_define.h | 9 | ||||
| -rw-r--r-- | service/src/fwd.c | 11 |
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; |
