From patchwork Wed Feb 3 07:41:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Loftus, Ciara" X-Patchwork-Id: 375835 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 84422C433E6 for ; Wed, 3 Feb 2021 08:12:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3D58064F69 for ; Wed, 3 Feb 2021 08:12:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232550AbhBCIMP (ORCPT ); Wed, 3 Feb 2021 03:12:15 -0500 Received: from mga12.intel.com ([192.55.52.136]:59621 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232489AbhBCIMK (ORCPT ); Wed, 3 Feb 2021 03:12:10 -0500 IronPort-SDR: BkM1nWO4at/uLU1kPmLew1SWglg4sdv/gIBFCwON9PlJK/7j/bDN6HjAHHmBd6t0ZBPO4b2I3q MgEovuwjcApA== X-IronPort-AV: E=McAfee;i="6000,8403,9883"; a="160170053" X-IronPort-AV: E=Sophos;i="5.79,397,1602572400"; d="scan'208";a="160170053" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Feb 2021 00:11:29 -0800 IronPort-SDR: wgP9fcyJIcwunQyR/2QgQSM5Et/9gj2GYqrhezC6nQXQ1c7TFNuiCYtz7vFmWg0UqtJqmndh7B O6GdPMJilTrw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.79,397,1602572400"; d="scan'208";a="413932444" Received: from silpixa00399839.ir.intel.com (HELO localhost.localdomain) ([10.237.222.142]) by fmsmga002.fm.intel.com with ESMTP; 03 Feb 2021 00:11:27 -0800 From: Ciara Loftus To: netdev@vger.kernel.org, bpf@vger.kernel.org, magnus.karlsson@intel.com, bjorn@kernel.org, weqaar.a.janjua@intel.com Cc: daniel@iogearbox.net, Ciara Loftus Subject: [PATCH bpf-next v4 1/6] xsk: add tracepoints for packet drops Date: Wed, 3 Feb 2021 07:41:22 +0000 Message-Id: <20210203074127.8616-2-ciara.loftus@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210203074127.8616-1-ciara.loftus@intel.com> References: <20210203074127.8616-1-ciara.loftus@intel.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This commit introduces tracing infrastructure for AF_XDP sockets (xsks) and a new trace event called 'xsk_packet_drop'. This trace event is triggered when a packet cannot be processed by the socket due to one of the following issues: (1) packet exceeds the maximum permitted size. (2) invalid fill descriptor address. (3) invalid tx descriptor field. The trace provides information about the error to the user. For example the size vs permitted size is provided for (1). For (2) and (3) the relevant descriptor fields are printed. This information should help a user troubleshoot packet drops by providing this extra level of detail which is not available through use of simple counters. The tracepoint can be enabled/disabled by toggling /sys/kernel/debug/tracing/events/xsk/xsk_packet_drop/enable Signed-off-by: Ciara Loftus --- MAINTAINERS | 1 + include/linux/bpf_trace.h | 1 + include/trace/events/xsk.h | 73 +++++++++++++++++++++++++++++++ include/uapi/linux/if_xdp.h | 6 +++ kernel/bpf/core.c | 1 + net/xdp/xsk.c | 7 ++- net/xdp/xsk_buff_pool.c | 3 ++ net/xdp/xsk_queue.h | 4 ++ tools/include/uapi/linux/if_xdp.h | 6 +++ 9 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 include/trace/events/xsk.h diff --git a/MAINTAINERS b/MAINTAINERS index 1df56a32d2df..efe6662d4198 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -19440,6 +19440,7 @@ S: Maintained F: Documentation/networking/af_xdp.rst F: include/net/xdp_sock* F: include/net/xsk_buff_pool.h +F: include/trace/events/xsk.h F: include/uapi/linux/if_xdp.h F: include/uapi/linux/xdp_diag.h F: include/net/netns/xdp.h diff --git a/include/linux/bpf_trace.h b/include/linux/bpf_trace.h index ddf896abcfb6..477d29b6c2c1 100644 --- a/include/linux/bpf_trace.h +++ b/include/linux/bpf_trace.h @@ -3,5 +3,6 @@ #define __LINUX_BPF_TRACE_H__ #include +#include #endif /* __LINUX_BPF_TRACE_H__ */ diff --git a/include/trace/events/xsk.h b/include/trace/events/xsk.h new file mode 100644 index 000000000000..e2984fad372c --- /dev/null +++ b/include/trace/events/xsk.h @@ -0,0 +1,73 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2021 Intel Corporation. */ + +#undef TRACE_SYSTEM +#define TRACE_SYSTEM xsk + +#if !defined(_TRACE_XSK_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_XSK_H + +#include +#include + +#define print_reason(reason) \ + __print_symbolic(reason, \ + { XSK_TRACE_DROP_PKT_TOO_BIG, "packet too big" }, \ + { XSK_TRACE_DROP_INVALID_FILLADDR, "invalid fill addr" }, \ + { XSK_TRACE_DROP_INVALID_TXD, "invalid tx desc" }) + +#define print_val1(reason) \ + __print_symbolic(reason, \ + { XSK_TRACE_DROP_PKT_TOO_BIG, "len" }, \ + { XSK_TRACE_DROP_INVALID_FILLADDR, "addr" }, \ + { XSK_TRACE_DROP_INVALID_TXD, "addr" }) + +#define print_val2(reason) \ + __print_symbolic(reason, \ + { XSK_TRACE_DROP_PKT_TOO_BIG, "max" }, \ + { XSK_TRACE_DROP_INVALID_FILLADDR, "not_used" }, \ + { XSK_TRACE_DROP_INVALID_TXD, "len" }) + +#define print_val3(reason) \ + __print_symbolic(reason, \ + { XSK_TRACE_DROP_PKT_TOO_BIG, "not_used" }, \ + { XSK_TRACE_DROP_INVALID_FILLADDR, "not_used" }, \ + { XSK_TRACE_DROP_INVALID_TXD, "options" }) + + + +TRACE_EVENT(xsk_packet_drop, + + TP_PROTO(char *name, u16 queue_id, u32 reason, u64 val1, u64 val2, u64 val3), + + TP_ARGS(name, queue_id, reason, val1, val2, val3), + + TP_STRUCT__entry( + __field(char *, name) + __field(u16, queue_id) + __field(u32, reason) + __field(u64, val1) + __field(u32, val2) + __field(u32, val3) + ), + + TP_fast_assign( + __entry->name = name; + __entry->queue_id = queue_id; + __entry->reason = reason; + __entry->val1 = val1; + __entry->val2 = val2; + __entry->val3 = val3; + ), + + TP_printk("netdev: %s qid %u reason: %s: %s %llu %s %u %s %u", + __entry->name, __entry->queue_id, print_reason(__entry->reason), + print_val1(__entry->reason), __entry->val1, + print_val2(__entry->reason), __entry->val2, + print_val3(__entry->reason), __entry->val3 + ) +); + +#endif /* _TRACE_XSK_H */ + +#include diff --git a/include/uapi/linux/if_xdp.h b/include/uapi/linux/if_xdp.h index a78a8096f4ce..d7eb031d2465 100644 --- a/include/uapi/linux/if_xdp.h +++ b/include/uapi/linux/if_xdp.h @@ -108,4 +108,10 @@ struct xdp_desc { /* UMEM descriptor is __u64 */ +enum xdp_trace_reasons { + XSK_TRACE_DROP_PKT_TOO_BIG, + XSK_TRACE_DROP_INVALID_FILLADDR, + XSK_TRACE_DROP_INVALID_TXD, +}; + #endif /* _LINUX_IF_XDP_H */ diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 5bbd4884ff7a..442b0d7f9bf8 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -2362,3 +2362,4 @@ EXPORT_SYMBOL(bpf_stats_enabled_key); EXPORT_TRACEPOINT_SYMBOL_GPL(xdp_exception); EXPORT_TRACEPOINT_SYMBOL_GPL(xdp_bulk_tx); +EXPORT_TRACEPOINT_SYMBOL_GPL(xsk_packet_drop); diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 4faabd1ecfd1..689da22c8e4f 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -11,6 +11,7 @@ #define pr_fmt(fmt) "AF_XDP: %s: " fmt, __func__ +#include #include #include #include @@ -189,9 +190,13 @@ static int __xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp) struct xdp_buff *xsk_xdp; int err; u32 len; + u32 max = xsk_pool_get_rx_frame_size(xs->pool); len = xdp->data_end - xdp->data; - if (len > xsk_pool_get_rx_frame_size(xs->pool)) { + if (len > max) { + trace_xsk_packet_drop(xs->dev->name, xs->queue_id, + XSK_TRACE_DROP_PKT_TOO_BIG, + len, max, 0); xs->rx_dropped++; return -ENOSPC; } diff --git a/net/xdp/xsk_buff_pool.c b/net/xdp/xsk_buff_pool.c index 8de01aaac4a0..e0bd1bfd4324 100644 --- a/net/xdp/xsk_buff_pool.c +++ b/net/xdp/xsk_buff_pool.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 +#include #include #include #include @@ -460,6 +461,8 @@ static struct xdp_buff_xsk *__xp_alloc(struct xsk_buff_pool *pool) ok = pool->unaligned ? xp_check_unaligned(pool, &addr) : xp_check_aligned(pool, &addr); if (!ok) { + trace_xsk_packet_drop(pool->netdev->name, pool->queue_id, + XSK_TRACE_DROP_INVALID_FILLADDR, addr, 0, 0); pool->fq->invalid_descs++; xskq_cons_release(pool->fq); continue; diff --git a/net/xdp/xsk_queue.h b/net/xdp/xsk_queue.h index 2823b7c3302d..8e9ba3cfe286 100644 --- a/net/xdp/xsk_queue.h +++ b/net/xdp/xsk_queue.h @@ -6,6 +6,7 @@ #ifndef _LINUX_XSK_QUEUE_H #define _LINUX_XSK_QUEUE_H +#include #include #include #include @@ -175,6 +176,9 @@ static inline bool xskq_cons_is_valid_desc(struct xsk_queue *q, struct xsk_buff_pool *pool) { if (!xp_validate_desc(pool, d)) { + trace_xsk_packet_drop(pool->netdev->name, pool->queue_id, + XSK_TRACE_DROP_INVALID_TXD, d->addr, + d->len, d->options); q->invalid_descs++; return false; } diff --git a/tools/include/uapi/linux/if_xdp.h b/tools/include/uapi/linux/if_xdp.h index a78a8096f4ce..d7eb031d2465 100644 --- a/tools/include/uapi/linux/if_xdp.h +++ b/tools/include/uapi/linux/if_xdp.h @@ -108,4 +108,10 @@ struct xdp_desc { /* UMEM descriptor is __u64 */ +enum xdp_trace_reasons { + XSK_TRACE_DROP_PKT_TOO_BIG, + XSK_TRACE_DROP_INVALID_FILLADDR, + XSK_TRACE_DROP_INVALID_TXD, +}; + #endif /* _LINUX_IF_XDP_H */ From patchwork Wed Feb 3 07:41:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Loftus, Ciara" X-Patchwork-Id: 375834 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6FAD7C43331 for ; Wed, 3 Feb 2021 08:13:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4117164F50 for ; Wed, 3 Feb 2021 08:13:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232688AbhBCINE (ORCPT ); Wed, 3 Feb 2021 03:13:04 -0500 Received: from mga12.intel.com ([192.55.52.136]:59621 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232591AbhBCIM1 (ORCPT ); Wed, 3 Feb 2021 03:12:27 -0500 IronPort-SDR: KOlOIN00P7PlgQjQZFQX6Iws2j5slGmaPLsVsmHCVbkSfaLSINW0veaMDH2uG1cZE7LkUk5o4b xzgHnWMhfiRA== X-IronPort-AV: E=McAfee;i="6000,8403,9883"; a="160170063" X-IronPort-AV: E=Sophos;i="5.79,397,1602572400"; d="scan'208";a="160170063" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Feb 2021 00:11:35 -0800 IronPort-SDR: vPcL4vTIm8S/YIxge0BvP8T7aES9OcBEcoWdGGsPGjLf7a8i/27viRGxpc2UPY5pKaDD15ZEZD zS/ra253uQuw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.79,397,1602572400"; d="scan'208";a="413932472" Received: from silpixa00399839.ir.intel.com (HELO localhost.localdomain) ([10.237.222.142]) by fmsmga002.fm.intel.com with ESMTP; 03 Feb 2021 00:11:33 -0800 From: Ciara Loftus To: netdev@vger.kernel.org, bpf@vger.kernel.org, magnus.karlsson@intel.com, bjorn@kernel.org, weqaar.a.janjua@intel.com Cc: daniel@iogearbox.net, Ciara Loftus Subject: [PATCH bpf-next v4 4/6] selftests/bpf: XSK_TRACE_DROP_PKT_TOO_BIG test Date: Wed, 3 Feb 2021 07:41:25 +0000 Message-Id: <20210203074127.8616-5-ciara.loftus@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210203074127.8616-1-ciara.loftus@intel.com> References: <20210203074127.8616-1-ciara.loftus@intel.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This test increases the UMEM headroom to a size that will cause packets to be dropped. Traces which report these drops are expected which look like so: xsk_packet_drop: netdev: ve3213 qid 0 reason: packet too big: \ len 60 max 1 not_used 0 The test validates that these traces were successfully generated. Signed-off-by: Ciara Loftus --- tools/testing/selftests/bpf/test_xsk.sh | 25 ++++++ tools/testing/selftests/bpf/xdpxceiver.c | 102 ++++++++++++++++++++--- tools/testing/selftests/bpf/xdpxceiver.h | 6 ++ 3 files changed, 123 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/bpf/test_xsk.sh b/tools/testing/selftests/bpf/test_xsk.sh index 2b4a4f42b220..5b4e42ac8c20 100755 --- a/tools/testing/selftests/bpf/test_xsk.sh +++ b/tools/testing/selftests/bpf/test_xsk.sh @@ -83,6 +83,7 @@ done TEST_NAME="PREREQUISITES" DEFAULTPKTS=10000 +TRACEPKTS=64 URANDOM=/dev/urandom [ ! -e "${URANDOM}" ] && { echo "${URANDOM} not found. Skipping tests."; test_exit 1 1; } @@ -246,6 +247,30 @@ retval=$? test_status $retval "${TEST_NAME}" statusList+=($retval) +### TEST 10 +TEST_NAME="SKB TRACE DROP PKT_TOO_BIG" + +vethXDPgeneric ${VETH0} ${VETH1} ${NS1} + +params=("-S" "-t" "0" "-C" "${TRACEPKTS}") +execxdpxceiver params + +retval=$? +test_status $retval "${TEST_NAME}" +statusList+=($retval) + +### TEST 11 +TEST_NAME="DRV TRACE DROP PKT_TOO_BIG" + +vethXDPnative ${VETH0} ${VETH1} ${NS1} + +params=("-N" "-t" "0" "-C" "${TRACEPKTS}") +execxdpxceiver params + +retval=$? +test_status $retval "${TEST_NAME}" +statusList+=($retval) + ## END TESTS cleanup_exit ${VETH0} ${VETH1} ${NS1} diff --git a/tools/testing/selftests/bpf/xdpxceiver.c b/tools/testing/selftests/bpf/xdpxceiver.c index e6e0d42d8074..dda965c3d9ec 100644 --- a/tools/testing/selftests/bpf/xdpxceiver.c +++ b/tools/testing/selftests/bpf/xdpxceiver.c @@ -33,6 +33,8 @@ * Configure sockets as bi-directional tx/rx sockets, sets up fill and * completion rings on each socket, tx/rx in both directions. Only nopoll * mode is used + * e. Tracing - XSK_TRACE_DROP_PKT_TOO_BIG + * Increase the headroom size and send packets. Validate traces. * * 2. AF_XDP DRV/Native mode * Works on any netdevice with XDP_REDIRECT support, driver dependent. Processes @@ -44,8 +46,9 @@ * d. Bi-directional sockets * - Only copy mode is supported because veth does not currently support * zero-copy mode + * e. Tracing - XSK_TRACE_DROP_PKT_TOO_BIG * - * Total tests: 8 + * Total tests: 10 * * Flow: * ----- @@ -272,13 +275,23 @@ static void gen_eth_frame(struct xsk_umem_info *umem, u64 addr) static void xsk_configure_umem(struct ifobject *data, void *buffer, u64 size) { int ret; + struct xsk_umem_config cfg = { + .fill_size = XSK_RING_PROD__DEFAULT_NUM_DESCS, + .comp_size = XSK_RING_CONS__DEFAULT_NUM_DESCS, + .frame_size = XSK_UMEM__DEFAULT_FRAME_SIZE, + .frame_headroom = XSK_UMEM__DEFAULT_FRAME_HEADROOM, + .flags = XSK_UMEM__DEFAULT_FLAGS + }; + + if (opt_trace_code == XSK_TRACE_DROP_PKT_TOO_BIG) + cfg.frame_headroom = XSK_UMEM__DEFAULT_FRAME_SIZE - XDP_PACKET_HEADROOM - 1; data->umem = calloc(1, sizeof(struct xsk_umem_info)); if (!data->umem) exit_with_error(errno); ret = xsk_umem__create(&data->umem->umem, buffer, size, - &data->umem->fq, &data->umem->cq, NULL); + &data->umem->fq, &data->umem->cq, &cfg); if (ret) exit_with_error(ret); @@ -363,7 +376,7 @@ static void usage(const char *prog) " -B, --bidi Bi-directional sockets test\n" " -D, --debug Debug mode - dump packets L2 - L5\n" " -C, --tx-pkt-count=n Number of packets to send\n" - " -t, --trace-enable Enable trace\n"; + " -t, --trace-enable=n Enable trace and execute test 'n'\n"; ksft_print_msg(str, prog); } @@ -450,7 +463,7 @@ static void parse_command_line(int argc, char **argv) opterr = 0; for (;;) { - c = getopt_long(argc, argv, "i:q:pSNcTBDC:t", long_options, &option_index); + c = getopt_long(argc, argv, "i:q:pSNcTBDC:t:", long_options, &option_index); if (c == -1) break; @@ -503,6 +516,7 @@ static void parse_command_line(int argc, char **argv) break; case 't': opt_trace_enable = 1; + opt_trace_code = atoi(optarg); break; default: usage(basename(argv[0])); @@ -730,6 +744,28 @@ static void worker_pkt_dump(void) } } +static void worker_trace_validate(FILE *fp, char *ifname) +{ + char trace_str[128]; + char *line = NULL; + size_t len = 0; + int ret = 0; + + snprintf(trace_str, sizeof(trace_str), "netdev: %s qid 0 reason: %s", + ifname, reason_str); + + while (trace_counter != expected_traces) { + while ((ret = getline(&line, &len, fp)) == EOF) + continue; + if (strstr(line, trace_str) != NULL) + trace_counter++; + } + + sigvar = 1; + + fclose(fp); +} + static void worker_pkt_validate(void) { u32 payloadseqnum = -2; @@ -851,6 +887,25 @@ static int enable_disable_trace(bool enable) return ret; } +static FILE *get_eof_trace(void) +{ + FILE *ret_fp; + char *line = NULL; + size_t len = 0; + int ret = 0; + + ret_fp = fopen(TRACE_FILE, "r"); + if (ret_fp == NULL) { + ksft_print_msg("Error opening %s\n", TRACE_FILE); + return NULL; + } + + /* Go to end of file and record the file pointer */ + while ((ret = getline(&line, &len, ret_fp)) != EOF) + ; + + return ret_fp; +} static void *worker_testapp_validate(void *arg) { @@ -900,12 +955,22 @@ static void *worker_testapp_validate(void *arg) } ksft_print_msg("Sending %d packets on interface %s\n", - (opt_pkt_count - 1), ifobject->ifname); + (opt_trace_enable ? opt_pkt_count : opt_pkt_count - 1), + ifobject->ifname); tx_only_all(ifobject); } else if (ifobject->fv.vector == rx) { struct pollfd fds[MAX_SOCKS] = { }; + FILE *tr_fp = NULL; int ret; + if (opt_trace_enable) { + tr_fp = get_eof_trace(); + if (tr_fp == NULL) { + ksft_print_msg("Error getting EOF of trace\n"); + exit_with_error(-1); + } + } + if (!bidi_pass) thread_common_ops(ifobject, bufs, &sync_mutex_tx, &spinning_rx); @@ -932,15 +997,22 @@ static void *worker_testapp_validate(void *arg) if (ret <= 0) continue; } - rx_pkt(ifobject->xsk, fds); - worker_pkt_validate(); + + if (!opt_trace_enable) { + rx_pkt(ifobject->xsk, fds); + worker_pkt_validate(); + } else { + worker_trace_validate(tr_fp, ifobject->ifname); + } if (sigvar) break; } - ksft_print_msg("Received %d packets on interface %s\n", - pkt_counter, ifobject->ifname); + ksft_print_msg("%s %d packets on interface %s\n", + opt_trace_enable ? "Traced" : "Received", + opt_trace_enable ? trace_counter : pkt_counter, + ifobject->ifname); if (opt_teardown) ksft_print_msg("Destroying socket\n"); @@ -1086,15 +1158,25 @@ int main(int argc, char **argv) parse_command_line(argc, argv); - num_frames = ++opt_pkt_count; + num_frames = opt_trace_enable ? opt_pkt_count : ++opt_pkt_count; init_iface_config(ifaceconfig); if (opt_trace_enable) { + expected_traces = opt_pkt_count; if (enable_disable_trace(1)) { ksft_test_result_fail("ERROR: failed to enable tracing for trace test\n"); ksft_exit_xfail(); } + switch (opt_trace_code) { + case XSK_TRACE_DROP_PKT_TOO_BIG: + reason_str = "packet too big"; + break; + default: + ksft_test_result_fail("ERROR: unsupported trace %i\n", + opt_trace_code); + ksft_exit_xfail(); + } } pthread_init_mutex(); diff --git a/tools/testing/selftests/bpf/xdpxceiver.h b/tools/testing/selftests/bpf/xdpxceiver.h index 5308b501eecc..4cdb8fe81837 100644 --- a/tools/testing/selftests/bpf/xdpxceiver.h +++ b/tools/testing/selftests/bpf/xdpxceiver.h @@ -42,6 +42,8 @@ #define POLL_TMOUT 1000 #define NEED_WAKEUP true #define TRACE_ENABLE_FILE "/sys/kernel/debug/tracing/events/xsk/xsk_packet_drop/enable" +#define TRACE_FILE "/sys/kernel/debug/tracing/trace" +#define TRACE_MAX_PKTS 100 /* limit size to avoid filling trace buffer */ typedef __u32 u32; typedef __u16 u16; @@ -66,11 +68,15 @@ static int opt_teardown; static int opt_bidi; static u32 opt_xdp_bind_flags = XDP_USE_NEED_WAKEUP; static int opt_trace_enable; +static int opt_trace_code = -1; static int reset_trace; static u8 pkt_data[XSK_UMEM__DEFAULT_FRAME_SIZE]; static u32 pkt_counter; +static u32 trace_counter; static u32 prev_pkt = -1; static int sigvar; +static int expected_traces; +static const char *reason_str; struct xsk_umem_info { struct xsk_ring_prod fq; From patchwork Wed Feb 3 07:41:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Loftus, Ciara" X-Patchwork-Id: 375833 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 213D1C43219 for ; Wed, 3 Feb 2021 08:13:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E8AB564F50 for ; Wed, 3 Feb 2021 08:13:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232148AbhBCINU (ORCPT ); Wed, 3 Feb 2021 03:13:20 -0500 Received: from mga12.intel.com ([192.55.52.136]:59616 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232665AbhBCIMx (ORCPT ); Wed, 3 Feb 2021 03:12:53 -0500 IronPort-SDR: EbRQ2N+sMA1mrxXdBVJ8I/5fstt0LzQsn1IGBOLvp4kSEezhUAJ8uGgGnB4i2uo3Zn8Qf9QeRj 28mFgmPvcqKw== X-IronPort-AV: E=McAfee;i="6000,8403,9883"; a="160170071" X-IronPort-AV: E=Sophos;i="5.79,397,1602572400"; d="scan'208";a="160170071" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Feb 2021 00:11:39 -0800 IronPort-SDR: MnbekqiMe+eUxo/ZJ4Dc6u292w7O6qrXn1Io2/dbR8McIEzzLID6vn0W0pgCK8zbRpctGKi/Hl ZwdtdNtMtIyw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.79,397,1602572400"; d="scan'208";a="413932488" Received: from silpixa00399839.ir.intel.com (HELO localhost.localdomain) ([10.237.222.142]) by fmsmga002.fm.intel.com with ESMTP; 03 Feb 2021 00:11:37 -0800 From: Ciara Loftus To: netdev@vger.kernel.org, bpf@vger.kernel.org, magnus.karlsson@intel.com, bjorn@kernel.org, weqaar.a.janjua@intel.com Cc: daniel@iogearbox.net, Ciara Loftus Subject: [PATCH bpf-next v4 6/6] selftests/bpf: XSK_TRACE_INVALID_DESC_TX test Date: Wed, 3 Feb 2021 07:41:27 +0000 Message-Id: <20210203074127.8616-7-ciara.loftus@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210203074127.8616-1-ciara.loftus@intel.com> References: <20210203074127.8616-1-ciara.loftus@intel.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This test sets the length of tx descriptors to an invalid value. When the kernel tries to transmit these descriptors, error traces are expected which look like so: xsk_packet_drop: netdev: ve9266 qid 0 reason: invalid tx desc: \ addr 258048 len 4097 options 0 The test validates that these traces were successfully generated. Signed-off-by: Ciara Loftus --- tools/testing/selftests/bpf/test_xsk.sh | 24 ++++++++++++++++++++++++ tools/testing/selftests/bpf/xdpxceiver.c | 22 ++++++++++++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/bpf/test_xsk.sh b/tools/testing/selftests/bpf/test_xsk.sh index bc026da25d54..4e654eb0a595 100755 --- a/tools/testing/selftests/bpf/test_xsk.sh +++ b/tools/testing/selftests/bpf/test_xsk.sh @@ -295,6 +295,30 @@ retval=$? test_status $retval "${TEST_NAME}" statusList+=($retval) +### TEST 14 +TEST_NAME="SKB TRACE INVALID_DESC_TX" + +vethXDPgeneric ${VETH0} ${VETH1} ${NS1} + +params=("-S" "-t" "2" "-C" "${TRACEPKTS}") +execxdpxceiver params + +retval=$? +test_status $retval "${TEST_NAME}" +statusList+=($retval) + +### TEST 15 +TEST_NAME="DRV TRACE INVALID_DESC_TX" + +vethXDPnative ${VETH0} ${VETH1} ${NS1} + +params=("-N" "-t" "2" "-C" "${TRACEPKTS}") +execxdpxceiver params + +retval=$? +test_status $retval "${TEST_NAME}" +statusList+=($retval) + ## END TESTS cleanup_exit ${VETH0} ${VETH1} ${NS1} diff --git a/tools/testing/selftests/bpf/xdpxceiver.c b/tools/testing/selftests/bpf/xdpxceiver.c index e63dc1c228ed..6cf824a33fdc 100644 --- a/tools/testing/selftests/bpf/xdpxceiver.c +++ b/tools/testing/selftests/bpf/xdpxceiver.c @@ -37,6 +37,8 @@ * Increase the headroom size and send packets. Validate traces. * f. Tracing - XSK_TRACE_DROP_INVALID_FILLADDR * Populate the fill queue with invalid addresses. Validate traces. + * g. Tracing - XSK_TRACE_DROP_INVALID_TXD + * Populate the tx descriptors with invalid addresses. Validate traces. * * 2. AF_XDP DRV/Native mode * Works on any netdevice with XDP_REDIRECT support, driver dependent. Processes @@ -50,8 +52,9 @@ * zero-copy mode * e. Tracing - XSK_TRACE_DROP_PKT_TOO_BIG * f. Tracing - XSK_TRACE_DROP_INVALID_FILLADDR + * g. Tracing - XSK_TRACE_DROP_INVALID_TXD * - * Total tests: 12 + * Total tests: 14 * * Flow: * ----- @@ -560,8 +563,11 @@ static inline void complete_tx_only(struct xsk_socket_info *xsk, int batch_size) if (!xsk->outstanding_tx) return; - if (!NEED_WAKEUP || xsk_ring_prod__needs_wakeup(&xsk->tx)) + if (!NEED_WAKEUP || xsk_ring_prod__needs_wakeup(&xsk->tx)) { kick_tx(xsk); + if (opt_trace_code == XSK_TRACE_DROP_INVALID_TXD) + xsk->outstanding_tx = 0; + } rcvd = xsk_ring_cons__peek(&xsk->umem->cq, batch_size, &idx); if (rcvd) { @@ -632,6 +638,7 @@ static void tx_only(struct xsk_socket_info *xsk, u32 *frameptr, int batch_size) { u32 idx; unsigned int i; + bool invalid_tx_test = opt_trace_code == XSK_TRACE_DROP_INVALID_TXD; while (xsk_ring_prod__reserve(&xsk->tx, batch_size, &idx) < batch_size) complete_tx_only(xsk, batch_size); @@ -640,7 +647,8 @@ static void tx_only(struct xsk_socket_info *xsk, u32 *frameptr, int batch_size) struct xdp_desc *tx_desc = xsk_ring_prod__tx_desc(&xsk->tx, idx + i); tx_desc->addr = (*frameptr + i) << XSK_UMEM__DEFAULT_FRAME_SHIFT; - tx_desc->len = PKT_SIZE; + tx_desc->len = invalid_tx_test ? XSK_UMEM__DEFAULT_FRAME_SIZE + 1 : PKT_SIZE; + } xsk_ring_prod__submit(&xsk->tx, batch_size); @@ -1014,7 +1022,10 @@ static void *worker_testapp_validate(void *arg) rx_pkt(ifobject->xsk, fds); worker_pkt_validate(); } else { - worker_trace_validate(tr_fp, ifobject->ifname); + worker_trace_validate(tr_fp, + opt_trace_code == XSK_TRACE_DROP_INVALID_TXD ? + ifdict[!ifobject->ifdict_index]->ifname : + ifobject->ifname); } if (sigvar) @@ -1187,6 +1198,9 @@ int main(int argc, char **argv) case XSK_TRACE_DROP_INVALID_FILLADDR: reason_str = "invalid fill addr"; break; + case XSK_TRACE_DROP_INVALID_TXD: + reason_str = "invalid tx desc"; + break; default: ksft_test_result_fail("ERROR: unsupported trace %i\n", opt_trace_code);