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:
Jesper Dangaard Brouer
2021-11-04 10:25:16 +01:00
parent 6b200aa8d5
commit 7af928b8a8
2 changed files with 26 additions and 7 deletions

View File

@@ -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;
}

View File

@@ -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) ({ \