#pragma once #ifdef __cplusplus extern "C" { #endif #ifndef VNODE_STAT_ENABLE #define VNODE_STAT_ENABLE 1 #endif #include #include #define __DECLARE_COMMON_VNODE_CREATE_PROD(_type) \ struct vnode_prod * vnode_##_type##_create_prod(struct vnode * vnode, const char * symbol, int nr_prodq); #define __DECLARE_COMMON_VNODE_CREATE_CONS(_type) \ struct vnode_cons * vnode_##_type##_create_cons(struct vnode * vnode, const char * symbol, int nr_prodq); #define __DECLARE_COMMON_VNODE_PROD_LOOKUP(_type) \ struct vnode_prod * vnode_##_type##_prod_lookup(struct vnode * vnode, const char * sym); #define __DECLARE_COMMON_VNODE_CONS_LOOKUP(_type) \ struct vnode_cons * vnode_##_type##_cons_lookup(struct vnode * vnode, const char * sym); #define __DECLARE_COMMON_VNODE_PROD_ATTACH(_type) \ int vnode_##_type##_prod_attach(struct vnode * node, struct vnode_prod* prod); #define __DECLARE_COMMON_VNODE_CONS_ATTACH(_type) \ int vnode_##_type##_cons_attach(struct vnode * node, struct vnode_cons * cons); #define __DECLARE_COMMON_VNODE_PROD_STAT_GET(_type) \ struct vnode_prod_stat * vnode_##_type##_prod_stat_get(struct vnode_prod * prod); #define __DECLARE_COMMON_VNODE_CONS_STAT_GET(_type) \ struct vnode_cons_stat * vnode_##_type##_cons_stat_get(struct vnode_cons * cons); #define __DECLARE_COMMON_VNODE_DELETE_PROD(_type) \ int vnode_##_type##_delete_prod(struct vnode_prod * prod); #define __DECLARE_COMMON_VNODE_DELETE_CONS(_type) \ int vnode_##_type##_delete_cons(struct vnode_cons * cons); #define __DECLARE_COMMON_VNODE_UNPOISON_PROD(_type) \ void vnode_##_type##_unpoison_prod(struct vnode_prod * prod); #define __DECLARE_COMMON_VNODE_UNPOISON_CONS(_type) \ void vnode_##_type##_unpoison_cons(struct vnode_cons * cons); #define __DECLARE_COMMON_VNODE_NOTIFY_CTX_CONS(_type) \ struct vnode_cons_notify * vnode_##_type##_notify_ctx_cons(struct vnode_cons * cons); struct vnode_cons_stat { volatile uint64_t on_line; volatile uint64_t deliver; volatile uint64_t missed; volatile uint64_t total_len; volatile unsigned int q_len_max; volatile float q_len_avg_max; } __rte_cache_aligned; struct vnode_prod_stat { volatile uint64_t on_line; volatile uint64_t deliver; volatile uint64_t missed; volatile uint64_t total_len; volatile int64_t ring_elem_count_avg; volatile int64_t ring_shared_credict_avg; /* notify */ volatile uint64_t notify_state_waiting; volatile uint64_t notify_state_running; volatile uint64_t notify_state_ready; /* batch size */ volatile uint64_t batch_size_total; volatile uint64_t batch_size_count; } __rte_cache_aligned; enum cons_running_status { CONS_STATUS_RUNNING, CONS_STATUS_WAITING, CONS_STATUS_READY, }; struct vnode_cons_notify { int enable; int cons_notify_eventfd; volatile int cons_running_status; }; #define VNODE_STAT_READ(_addr) *(_addr) enum _vnode_type { VNODE_TYPE_MIRROR, }; struct vnode; struct vnode_prod; struct vnode_cons; int vnode_mirror_enqueue_bulk(struct vnode_prod * prod, unsigned int prodq, struct rte_mbuf * objects[], uint32_t hash[], unsigned int nr_objects); int vnode_mirror_dequeue_burst(struct vnode_cons * cons, unsigned int consq, struct rte_mbuf * objects[], int nr_max_objects); int vnode_mirror_rt_object_retrieve(struct vnode_prod * prod, unsigned int prodq, struct rte_mbuf * objects[], unsigned int nr_max_objects); struct vnode * vnode_mirror_create(const char * sym, unsigned int sz_exclusive, unsigned int sz_max_inflight, unsigned int notify_cons_when_rx, unsigned int batch_interval_us); int vnode_mirror_delete(struct vnode * vnode); void vnode_mirror_flush(struct vnode_prod * prod, unsigned int prodq); __DECLARE_COMMON_VNODE_CREATE_PROD(mirror) __DECLARE_COMMON_VNODE_CREATE_CONS(mirror) __DECLARE_COMMON_VNODE_DELETE_PROD(mirror) __DECLARE_COMMON_VNODE_DELETE_CONS(mirror) __DECLARE_COMMON_VNODE_CONS_LOOKUP(mirror) __DECLARE_COMMON_VNODE_PROD_LOOKUP(mirror) __DECLARE_COMMON_VNODE_PROD_STAT_GET(mirror) __DECLARE_COMMON_VNODE_CONS_STAT_GET(mirror) __DECLARE_COMMON_VNODE_PROD_ATTACH(mirror) __DECLARE_COMMON_VNODE_CONS_ATTACH(mirror) __DECLARE_COMMON_VNODE_UNPOISON_PROD(mirror) __DECLARE_COMMON_VNODE_UNPOISON_CONS(mirror) __DECLARE_COMMON_VNODE_NOTIFY_CTX_CONS(mirror) #ifdef __cplusplus } #endif