Extend xdp_hints_rx_time with xdp_rx_cpu

The latency or time-delay between XDP and AF_XDP depend highly
on whether the XDP and AF_XDP runs on same CPU or remote CPU.

Extend xdp_hints_rx_time, without worrying about the layout
as BTF will adjust, so we can determine case of same CPU or
remote CPU.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
This commit is contained in:
Jesper Dangaard Brouer
2021-11-19 14:33:58 +01:00
parent 1ba7209fd4
commit 1bb141e9e3
2 changed files with 16 additions and 2 deletions
+2
View File
@@ -46,6 +46,7 @@ struct xdp_hints_mark {
struct xdp_hints_rx_time {
__u64 rx_ktime;
__u32 xdp_rx_cpu;
__u32 btf_id;
} __attribute__((aligned(4))) __attribute__((packed));
@@ -74,6 +75,7 @@ int meta_add_rx_time(struct xdp_md *ctx)
return -2;
meta->rx_ktime = bpf_ktime_get_ns();
meta->xdp_rx_cpu = bpf_get_smp_processor_id();
/* Userspace can identify struct used by BTF id */
meta->btf_id = bpf_core_type_id_local(struct xdp_hints_rx_time);
+14 -2
View File
@@ -97,6 +97,7 @@ struct xdp_hints_rx_time {
__u32 btf_type_id; /* cached xsk_btf__btf_type_id(xbi) */
struct xsk_btf_info *xbi;
struct xsk_btf_member rx_ktime;
struct xsk_btf_member xdp_rx_cpu;
} xdp_hints_rx_time = { 0 };
/* This struct BTF mirrors kernel-side struct xdp_hints_mark */
@@ -144,6 +145,9 @@ int init_btf_info_via_bpf_object(struct bpf_object *bpf_obj)
if (!xsk_btf__field_member("rx_ktime", xbi,
&xdp_hints_rx_time.rx_ktime))
return -EBADSLT;
if (!xsk_btf__field_member("xdp_rx_cpu", xbi,
&xdp_hints_rx_time.xdp_rx_cpu))
return -EBADSLT;
xdp_hints_rx_time.btf_type_id = xsk_btf__btf_type_id(xbi);
xdp_hints_rx_time.xbi = xbi;
}
@@ -479,6 +483,8 @@ static int print_meta_info_time(uint8_t *pkt, struct xdp_hints_rx_time *meta,
__u32 qid)
{
__u64 time_now; // = gettime();
__u32 xdp_rx_cpu = 0xffff;
__u32 cpu_running;
__u64 *rx_ktime_ptr; /* Points directly to member memory */
__u64 rx_ktime;
__u64 diff;
@@ -497,9 +503,15 @@ static int print_meta_info_time(uint8_t *pkt, struct xdp_hints_rx_time *meta,
time_now = gettime();
diff = time_now - rx_ktime;
cpu_running = sched_getcpu();
XSK_BTF_READ_INTO(xdp_rx_cpu, &meta->xdp_rx_cpu, meta->xbi, pkt);
if (debug_meta)
printf("Q[%u] meta-time rx_ktime:%llu time_now:%llu diff:%llu ns\n",
qid, rx_ktime, time_now, diff);
printf("Q[%u] CPU[rx:%d/run:%d]:%s"
" meta-time rx_ktime:%llu time_now:%llu diff:%llu ns\n",
qid, xdp_rx_cpu, cpu_running,
(xdp_rx_cpu == cpu_running) ? "same" : "remote",
rx_ktime, time_now, diff);
return 0;
}