From patchwork Tue Jun 28 12:18:21 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Loftus, Ciara" X-Patchwork-Id: 113501 X-Patchwork-Delegate: andrew.rybchenko@oktetlabs.ru Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 14783A0568; Tue, 28 Jun 2022 14:19:34 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DD9BF40691; Tue, 28 Jun 2022 14:19:33 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mails.dpdk.org (Postfix) with ESMTP id 2E089400D7 for ; Tue, 28 Jun 2022 14:19:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1656418772; x=1687954772; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=TRTeRC+Kp9qLpfNowCHwfy7SfepOWiWFBUowGd0N504=; b=gIa6i+LtM0TvPvWCiETkacRXWZ8r4zUOLIRzBbCuYXW91LGQRUPIC8sF 2wGHRoskLd7nwWiRkfFo8b5JGgtu2rWRZ+dXYZZaRdK2W5tLt9XsTb+2M mZwA4JNlUNSSpEPJZK7appzfNwiq2XtwrqKUW/i3d/KNmD9wXpFAhl4JI OPxzQuDbHBEDpepykyvBsNQrYJh1NL+v31zSspdCNIDPix7WwlCUdhRyz o8D1u/ipY/grBJheEgObzQ8ah8oYv07J+sYlTuTAqz5IwFHGujqjSzeaE 6gnca93sDe8ppis5KmScvlc/X3XtTw5rRUZD1sMcu+xzeXKBpp/xsh5q2 A==; X-IronPort-AV: E=McAfee;i="6400,9594,10391"; a="261528479" X-IronPort-AV: E=Sophos;i="5.92,227,1650956400"; d="scan'208";a="261528479" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2022 05:19:30 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.92,227,1650956400"; d="scan'208";a="680025615" Received: from silpixa00401086.ir.intel.com (HELO localhost.localdomain) ([10.55.128.124]) by FMSMGA003.fm.intel.com with ESMTP; 28 Jun 2022 05:19:29 -0700 From: Ciara Loftus To: dev@dpdk.org Cc: andrew.rybchenko@oktetlabs.ru, ferruh.yigit@xilinx.com, thomas@monjalon.net, Ciara Loftus Subject: [PATCH v2] net/af_xdp: make compatible with libbpf v0.8.0 Date: Tue, 28 Jun 2022 12:18:21 +0000 Message-Id: <20220628121821.1326012-1-ciara.loftus@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220624102354.1516606-1-ciara.loftus@intel.com> References: <20220624102354.1516606-1-ciara.loftus@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org libbpf v0.8.0 deprecates the bpf_get_link_xdp_id and bpf_set_link_xdp_fd functions. Use meson to detect if libbpf >= v0.7.0 is linked and if so, use the recommended replacement functions bpf_xdp_query_id, bpf_xdp_attach and bpf_xdp_detach which are available to use since libbpf v0.7.0. Signed-off-by: Ciara Loftus --- v2: * Updated release notes * Removed version limiting to libbpf v0.8.0 --- doc/guides/nics/af_xdp.rst | 3 ++- doc/guides/rel_notes/release_22_07.rst | 4 +++ drivers/net/af_xdp/compat.h | 36 +++++++++++++++++++++++++- drivers/net/af_xdp/meson.build | 2 +- drivers/net/af_xdp/rte_eth_af_xdp.c | 19 +++----------- 5 files changed, 45 insertions(+), 19 deletions(-) diff --git a/doc/guides/nics/af_xdp.rst b/doc/guides/nics/af_xdp.rst index d42e0f1f79..ca23940e22 100644 --- a/doc/guides/nics/af_xdp.rst +++ b/doc/guides/nics/af_xdp.rst @@ -45,7 +45,8 @@ Prerequisites This is a Linux-specific PMD, thus the following prerequisites apply: * A Linux Kernel (version > v4.18) with XDP sockets configuration enabled; -* Both libxdp >=v1.2.2 and libbpf libraries installed, or, libbpf <=v0.6.0 +* Both libxdp >=v1.2.2 and libbpf <=v0.8.0 libraries installed, or, libbpf + <=v0.6.0. * If using libxdp, it requires an environment variable called LIBXDP_OBJECT_PATH to be set to the location of where libxdp placed its bpf object files. This is usually in /usr/local/lib/bpf or /usr/local/lib64/bpf. diff --git a/doc/guides/rel_notes/release_22_07.rst b/doc/guides/rel_notes/release_22_07.rst index 6365800313..562d12abb2 100644 --- a/doc/guides/rel_notes/release_22_07.rst +++ b/doc/guides/rel_notes/release_22_07.rst @@ -125,6 +125,10 @@ New Features * Added new devargs option ``max_conf_threads`` defining the number of management threads for parallel configurations. +* **Updated AF_XDP PMD.** + + * Made compatible with libbpf v0.8.0 (when used with libxdp). + * **Updated Amazon ena driver.** The new driver version (v2.7.0) includes: diff --git a/drivers/net/af_xdp/compat.h b/drivers/net/af_xdp/compat.h index 28ea64aeaa..8f4ac8b5ea 100644 --- a/drivers/net/af_xdp/compat.h +++ b/drivers/net/af_xdp/compat.h @@ -60,7 +60,7 @@ tx_syscall_needed(struct xsk_ring_prod *q __rte_unused) } #endif -#ifdef RTE_NET_AF_XDP_LIBBPF_OBJ_OPEN +#ifdef RTE_NET_AF_XDP_LIBBPF_V070 static int load_program(const char *prog_path, struct bpf_object **obj) { struct bpf_program *prog; @@ -85,6 +85,23 @@ static int load_program(const char *prog_path, struct bpf_object **obj) bpf_object__close(*obj); return -1; } + +static int +remove_xdp_program(int ifindex) +{ + uint32_t curr_prog_id = 0; + + if (bpf_xdp_query_id(ifindex, XDP_FLAGS_UPDATE_IF_NOEXIST, + &curr_prog_id)) + return -1; + + return bpf_xdp_detach(ifindex, XDP_FLAGS_UPDATE_IF_NOEXIST, NULL); +} + +static int link_xdp_prog_with_dev(int ifindex, int fd, __u32 flags) +{ + return bpf_xdp_attach(ifindex, fd, flags, NULL); +} #else static int load_program(const char *prog_path, struct bpf_object **obj) { @@ -96,4 +113,21 @@ static int load_program(const char *prog_path, struct bpf_object **obj) return prog_fd; } + +static int +remove_xdp_program(int ifindex) +{ + uint32_t curr_prog_id = 0; + + if (bpf_get_link_xdp_id(ifindex, &curr_prog_id, + XDP_FLAGS_UPDATE_IF_NOEXIST)) + return -1; + + return bpf_set_link_xdp_fd(ifindex, -1, XDP_FLAGS_UPDATE_IF_NOEXIST); +} + +static int link_xdp_prog_with_dev(int ifindex, int fd, __u32 flags) +{ + return bpf_set_link_xdp_fd(ifindex, fd, flags); +} #endif diff --git a/drivers/net/af_xdp/meson.build b/drivers/net/af_xdp/meson.build index 1e0de23705..6075a69c00 100644 --- a/drivers/net/af_xdp/meson.build +++ b/drivers/net/af_xdp/meson.build @@ -25,7 +25,7 @@ if cc.has_header('linux/if_xdp.h') bpf_ver_dep = dependency('libbpf', version : '>=0.7.0', required: false, method: 'pkg-config') if bpf_ver_dep.found() - cflags += ['-DRTE_NET_AF_XDP_LIBBPF_OBJ_OPEN'] + cflags += ['-DRTE_NET_AF_XDP_LIBBPF_V070'] endif else build = false diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c index fce649c2a1..355130087a 100644 --- a/drivers/net/af_xdp/rte_eth_af_xdp.c +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c @@ -866,20 +866,6 @@ eth_stats_reset(struct rte_eth_dev *dev) return 0; } -static void -remove_xdp_program(struct pmd_internals *internals) -{ - uint32_t curr_prog_id = 0; - - if (bpf_get_link_xdp_id(internals->if_index, &curr_prog_id, - XDP_FLAGS_UPDATE_IF_NOEXIST)) { - AF_XDP_LOG(ERR, "bpf_get_link_xdp_id failed\n"); - return; - } - bpf_set_link_xdp_fd(internals->if_index, -1, - XDP_FLAGS_UPDATE_IF_NOEXIST); -} - static void xdp_umem_destroy(struct xsk_umem_info *umem) { @@ -932,7 +918,8 @@ eth_dev_close(struct rte_eth_dev *dev) */ dev->data->mac_addrs = NULL; - remove_xdp_program(internals); + if (remove_xdp_program(internals->if_index)) + AF_XDP_LOG(ERR, "Error while removing XDP program.\n"); if (internals->shared_umem) { struct internal_list *list; @@ -1198,7 +1185,7 @@ load_custom_xdp_prog(const char *prog_path, int if_index, struct bpf_map **map) } /* Link the program with the given network device */ - ret = bpf_set_link_xdp_fd(if_index, prog_fd, + ret = link_xdp_prog_with_dev(if_index, prog_fd, XDP_FLAGS_UPDATE_IF_NOEXIST); if (ret) { AF_XDP_LOG(ERR, "Failed to set prog fd %d on interface\n",