mirror of
https://github.com/xdp-project/bpf-examples.git
synced 2024-05-06 15:54:53 +00:00
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 <brouer@redhat.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
@@ -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) ({ \
|
||||
|
Reference in New Issue
Block a user