From patchwork Tue Dec 17 22:27:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yi-Hung Wei X-Patchwork-Id: 1211790 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.137; helo=fraxinus.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ZUOG1FVo"; dkim-atps=neutral Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47ct830rzBz9sR4 for ; Wed, 18 Dec 2019 09:28:19 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 5A37F84AF4; Tue, 17 Dec 2019 22:28:17 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id irjAe-D33gNM; Tue, 17 Dec 2019 22:28:14 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by fraxinus.osuosl.org (Postfix) with ESMTP id 8A051862FC; Tue, 17 Dec 2019 22:28:13 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 8278CC1AE8; Tue, 17 Dec 2019 22:28:13 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 677A1C1AE8 for ; Tue, 17 Dec 2019 22:28:12 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 40ED285B0D for ; Tue, 17 Dec 2019 22:28:12 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 6wMmFnGbI3AT for ; Tue, 17 Dec 2019 22:28:10 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pl1-f194.google.com (mail-pl1-f194.google.com [209.85.214.194]) by fraxinus.osuosl.org (Postfix) with ESMTPS id E1E6E8458C for ; Tue, 17 Dec 2019 22:28:10 +0000 (UTC) Received: by mail-pl1-f194.google.com with SMTP id y8so4715pll.13 for ; Tue, 17 Dec 2019 14:28:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=X8WNyHRZblK0BrmHiKr9rVr/k1saOcEIUz90oUnyP8g=; b=ZUOG1FVo28xNUEA4JqlFD0oVt2jZw2CLXNhcFm+t4gP3bMxX4hH5cYP/ZhkoykbCAl iz5vSYFypj+bNZ1nOP6k3ypZ068AiZhozyrwDyWdf47qv195Ah+dU2QqR92p7uk5K77G zL2AH59Xzb3AqXdknaiKxJvGvx50KTEqYYdK9Up5ekszkXtemFyogLuRzFYHYurNqJvC z5qE0Drrzg+VkpkC3ZbDx+hhS7/6JuCabArKJUu/RwbQIUq1yM3d+35padt7uNTbsSwS N9PhKxcDe7l6WSi9AuKgBC2rT1vem0E4/t6S9rNXY6qTtQhmcFGVA58J1GOBv18qVEGR W+Pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=X8WNyHRZblK0BrmHiKr9rVr/k1saOcEIUz90oUnyP8g=; b=N7bv6rKXvas3aNidzBeHKeeKaIPzbERw7k+JUtm1EVy4GEDk+svxa4poSp47HRHvgD HEGVCvf2oVKmwh31eSON9oj8vHICUrYmnQMj52UAguskZzBY0yW1JItyvHGu8Q0l3Ump kAqCKrwM8XuLdy/WbU0kd0lBm0GJViYTkyZQnGLbti1KVWY9dr4y2/tKh1e+OQ7kJ8R9 u9hXZTO5E7Wcjtw7TWfm9fY5JSt3n24/L9IxK19Pn7VYT/Ank8QZXo/5jUjGvsEPr69u ENwXvZXqxOQ1VpNSvJNyCgVXwY0q9cPAfIGkLOA0eu8RQzaWqSJzdF+Nh6nUOVRAayIS y5Rw== X-Gm-Message-State: APjAAAWZ4JQvHaMWi1lQWBfKl/bB8uoS3PyOKKav3odFlFgzWLpEEti8 H1oNBZkvezWm8DY0j0LZI1a5Ab2B X-Google-Smtp-Source: APXvYqyqy/SY+wewGUZw2RhWtdMpF/EoHDSQR41NzWzUL3k2axc/ztnpfPUbYPzs2P6DcMrYSdClKg== X-Received: by 2002:a17:90a:28a1:: with SMTP id f30mr9245813pjd.77.1576621689943; Tue, 17 Dec 2019 14:28:09 -0800 (PST) Received: from bionic.eng.vmware.com ([66.170.99.1]) by smtp.gmail.com with ESMTPSA id e2sm19442pfh.84.2019.12.17.14.28.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Dec 2019 14:28:08 -0800 (PST) From: Yi-Hung Wei To: dev@openvswitch.org, i.maximets@ovn.org, echaudro@redhat.com, u9012063@gmail.com Date: Tue, 17 Dec 2019 14:27:54 -0800 Message-Id: <20191217222754.86810-2-yihung.wei@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191217222754.86810-1-yihung.wei@gmail.com> References: <20191217222754.86810-1-yihung.wei@gmail.com> Subject: [ovs-dev] [PATCH v7 2/2] netdev-afxdp: NUMA-aware memory allocation for XSK related memory X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" Currently, the AF_XDP socket (XSK) related memory are allocated by main thread in the main thread's NUMA domain. With the patch that detects netdev-linux's NUMA node id, the PMD thread of AF_XDP port will be run on the AF_XDP netdev's NUMA domain. If the net device's NUMA domain is different from the main thread's NUMA domain, we will have two cross-NUMA memory accesses (netdev <-> memory, memory <-> CPU). This patch addresses the aforementioned issue by allocating the memory in the net device's NUMA domain. Signed-off-by: Yi-Hung Wei --- Documentation/intro/install/afxdp.rst | 2 +- acinclude.m4 | 5 ++++- include/sparse/automake.mk | 1 + include/sparse/numa.h | 27 +++++++++++++++++++++++++++ lib/netdev-afxdp.c | 21 ++++++++++++++++++--- 5 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 include/sparse/numa.h diff --git a/Documentation/intro/install/afxdp.rst b/Documentation/intro/install/afxdp.rst index 7b0736c96114..c4685fa7ebac 100644 --- a/Documentation/intro/install/afxdp.rst +++ b/Documentation/intro/install/afxdp.rst @@ -164,7 +164,7 @@ If a test case fails, check the log at:: Setup AF_XDP netdev ------------------- -Before running OVS with AF_XDP, make sure the libbpf and libelf are +Before running OVS with AF_XDP, make sure the libbpf, libelf, and libnuma are set-up right:: ldd vswitchd/ovs-vswitchd diff --git a/acinclude.m4 b/acinclude.m4 index 542637ac8cb8..73ed11d701aa 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -286,9 +286,12 @@ AC_DEFUN([OVS_CHECK_LINUX_AF_XDP], [ AC_CHECK_FUNCS([pthread_spin_lock], [], [AC_MSG_ERROR([unable to find pthread_spin_lock for AF_XDP support])]) + AC_CHECK_LIB(numa, numa_alloc_onnode, [], + [AC_MSG_ERROR([unable to find libnuma for AF_XDP support])]) + AC_DEFINE([HAVE_AF_XDP], [1], [Define to 1 if AF_XDP support is available and enabled.]) - LIBBPF_LDADD=" -lbpf -lelf" + LIBBPF_LDADD=" -lbpf -lelf -lnuma" AC_SUBST([LIBBPF_LDADD]) AC_CHECK_DECL([xsk_ring_prod__needs_wakeup], [ diff --git a/include/sparse/automake.mk b/include/sparse/automake.mk index 073631e8c082..974ad3fe55f7 100644 --- a/include/sparse/automake.mk +++ b/include/sparse/automake.mk @@ -5,6 +5,7 @@ noinst_HEADERS += \ include/sparse/bits/floatn.h \ include/sparse/assert.h \ include/sparse/math.h \ + include/sparse/numa.h \ include/sparse/netinet/in.h \ include/sparse/netinet/ip6.h \ include/sparse/netpacket/packet.h \ diff --git a/include/sparse/numa.h b/include/sparse/numa.h new file mode 100644 index 000000000000..3691a0eaf729 --- /dev/null +++ b/include/sparse/numa.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2019 Nicira, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CHECKER__ +#error "Use this header only with sparse. It is not a correct implementation." +#endif + +/* Avoid sparse warning: non-ANSI function declaration of function" */ +#define numa_get_membind_compat() numa_get_membind_compat(void) +#define numa_get_interleave_mask_compat() numa_get_interleave_mask_compat(void) +#define numa_get_run_node_mask_compat() numa_get_run_node_mask_compat(void) + +/* Get actual definitions for us to annotate and build on. */ +#include_next diff --git a/lib/netdev-afxdp.c b/lib/netdev-afxdp.c index 4c1f9c68270a..2d6f739b4b67 100644 --- a/lib/netdev-afxdp.c +++ b/lib/netdev-afxdp.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -469,7 +470,7 @@ xsk_configure_all(struct netdev *netdev) { struct netdev_linux *dev = netdev_linux_cast(netdev); int i, ifindex, n_rxq, n_txq; - int qid = 0; + int qid = 0, err = 0; ifindex = linux_get_ifindex(netdev_get_name(netdev)); @@ -477,6 +478,14 @@ xsk_configure_all(struct netdev *netdev) ovs_assert(dev->tx_locks == NULL); n_rxq = netdev_n_rxq(netdev); + + /* Allocate all the xsk related memory in the netdev's NUMA domain. */ + struct bitmask *old_bm = numa_get_membind(); + struct bitmask *new_bm = numa_allocate_nodemask(); + netdev_get_numa_id(netdev); + numa_bitmask_setbit(new_bm, dev->numa_id); + numa_set_membind(new_bm); + dev->xsks = xcalloc(n_rxq, sizeof *dev->xsks); if (dev->xdp_mode == OVS_AF_XDP_MODE_BEST_EFFORT) { @@ -518,11 +527,17 @@ xsk_configure_all(struct netdev *netdev) ovs_spin_init(&dev->tx_locks[i]); } - return 0; + goto out; err: xsk_destroy_all(netdev); - return EINVAL; + err = EINVAL; + +out: + numa_set_membind(old_bm); + numa_bitmask_free(old_bm); + numa_bitmask_free(new_bm); + return err; } static void