From 7af928b8a85d6d1bbdb5e9ee521495ad7e107313 Mon Sep 17 00:00:00 2001 From: Jesper Dangaard Brouer Date: Thu, 4 Nov 2021 10:25:16 +0100 Subject: [PATCH] lib_xsk_extend: Expose more direct xsk_btf_member API With the current xsk_btf__read() we are seeing a slowdown on the first packet with timestamps. The theory is this is caused by the allocation for the cached hashmap entry. meta-time rx_ktime:870394156129518 time_now:870394156139039 diff:9521 ns meta-time rx_ktime:870396208293894 time_now:870396208295098 diff:1204 ns meta-time rx_ktime:870398256286553 time_now:870398256287772 diff:1219 ns Create a new API that can access struct members more directly via caching the xsk_btf_member offset + size in the C-code API user. Signed-off-by: Jesper Dangaard Brouer --- AF_XDP-interaction/lib_xsk_extend.c | 19 +++++++++++++++---- AF_XDP-interaction/lib_xsk_extend.h | 14 +++++++++++--- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/AF_XDP-interaction/lib_xsk_extend.c b/AF_XDP-interaction/lib_xsk_extend.c index c8f6102..5c0266b 100644 --- a/AF_XDP-interaction/lib_xsk_extend.c +++ b/AF_XDP-interaction/lib_xsk_extend.c @@ -170,6 +170,20 @@ void xsk_btf__free_xdp_hint(struct xsk_btf_info *xbi) free(xbi); } +int xsk_btf__read_member(void **dest, size_t size, + struct xsk_btf_member *entry, + struct xsk_btf_info *xbi, const void *addr) +{ + if (!entry || !xbi || !dest || !addr) + return -EINVAL; + + if (entry->size != size) + return -EFAULT; + + *dest = (void *)((char *)addr - xbi->type->size + entry->offset); + return 0; +} + int xsk_btf__read(void **dest, size_t size, const char *field, struct xsk_btf_info *xbi, const void *addr) { @@ -194,9 +208,6 @@ int xsk_btf__read(void **dest, size_t size, const char *field, hashmap__add(&(xbi->map), field, entry); } - if (entry->size != size) - return -EFAULT; - - *dest = (void *)((char *)addr - xbi->type->size + entry->offset); + xsk_btf__read_member(dest, size, entry, xbi,addr); return 0; } diff --git a/AF_XDP-interaction/lib_xsk_extend.h b/AF_XDP-interaction/lib_xsk_extend.h index 7311bba..db2f7e0 100644 --- a/AF_XDP-interaction/lib_xsk_extend.h +++ b/AF_XDP-interaction/lib_xsk_extend.h @@ -22,9 +22,17 @@ LIBBPF_API void xsk_btf__free_xdp_hint(struct xsk_btf_info *xbi); LIBBPF_API __u32 xsk_btf__btf_type_id(struct xsk_btf_info *xbi); -LIBBPF_API int xsk_btf__read(void **dest, size_t size, const char *field, struct xsk_btf_info *xbi, - const void *addr); -LIBBPF_API bool xsk_btf__has_field(const char *field, struct xsk_btf_info *xbi); +LIBBPF_API int xsk_btf__read(void **dest, size_t size, + const char *field, + struct xsk_btf_info *xbi, const void *addr); + +LIBBPF_API int xsk_btf__read_member(void **dest, size_t size, + struct xsk_btf_member *entry, + struct xsk_btf_info *xbi, const void *addr); + +LIBBPF_API bool xsk_btf__has_field (const char *field, struct xsk_btf_info *xbi); +LIBBPF_API bool xsk_btf__field_member(const char *field, struct xsk_btf_info *xbi, + struct xsk_btf_member *entry); /* Notice: that field must NOT be a C-string as macro will stringify it */ #define XSK_BTF_READ_INTO(dest, field, xbi, addr) ({ \