Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2229657/?format=api
{ "id": 2229657, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2229657/?format=api", "web_url": "http://patchwork.ozlabs.org/project/openvswitch/patch/20260428151926.3798626-4-i.maximets@ovn.org/", "project": { "id": 47, "url": "http://patchwork.ozlabs.org/api/1.1/projects/47/?format=api", "name": "Open vSwitch", "link_name": "openvswitch", "list_id": "ovs-dev.openvswitch.org", "list_email": "ovs-dev@openvswitch.org", "web_url": "http://openvswitch.org/", "scm_url": "git@github.com:openvswitch/ovs.git", "webscm_url": "https://github.com/openvswitch/ovs" }, "msgid": "<20260428151926.3798626-4-i.maximets@ovn.org>", "date": "2026-04-28T15:19:08", "name": "[ovs-dev,3/6] dpif-netdev: Remove deprecated AVX512-optimized datapath interface.", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "7eb9731d226724e46f4f4ce12ba6b5488c195d52", "submitter": { "id": 76798, "url": "http://patchwork.ozlabs.org/api/1.1/people/76798/?format=api", "name": "Ilya Maximets", "email": "i.maximets@ovn.org" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/openvswitch/patch/20260428151926.3798626-4-i.maximets@ovn.org/mbox/", "series": [ { "id": 501877, "url": "http://patchwork.ozlabs.org/api/1.1/series/501877/?format=api", "web_url": "http://patchwork.ozlabs.org/project/openvswitch/list/?series=501877", "date": "2026-04-28T15:19:05", "name": "dpif-netdev: Remove deprecated AVX512-based optimizations.", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/501877/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2229657/comments/", "check": "success", "checks": "http://patchwork.ozlabs.org/api/patches/2229657/checks/", "tags": {}, "headers": { "Return-Path": "<ovs-dev-bounces@openvswitch.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "ovs-dev@openvswitch.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "ovs-dev@lists.linuxfoundation.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=140.211.166.137; helo=smtp4.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)", "smtp1.osuosl.org;\n dmarc=none (p=none dis=none) header.from=ovn.org" ], "Received": [ "from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g4kdG6sS4z1xvV\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 29 Apr 2026 01:20:02 +1000 (AEST)", "from localhost (localhost [127.0.0.1])\n\tby smtp4.osuosl.org (Postfix) with ESMTP id 0BFCE406EB;\n\tTue, 28 Apr 2026 15:20:01 +0000 (UTC)", "from smtp4.osuosl.org ([127.0.0.1])\n by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id U3c7REaVMVDB; Tue, 28 Apr 2026 15:19:58 +0000 (UTC)", "from lists.linuxfoundation.org (lf-lists.osuosl.org\n [IPv6:2605:bc80:3010:104::8cd3:938])\n\tby smtp4.osuosl.org (Postfix) with ESMTPS id 15BDE402BC;\n\tTue, 28 Apr 2026 15:19:58 +0000 (UTC)", "from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id E342AC04FB;\n\tTue, 28 Apr 2026 15:19:57 +0000 (UTC)", "from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 06597C04FA\n for <ovs-dev@openvswitch.org>; Tue, 28 Apr 2026 15:19:57 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n by smtp1.osuosl.org (Postfix) with ESMTP id 6B5E680579\n for <ovs-dev@openvswitch.org>; Tue, 28 Apr 2026 15:19:48 +0000 (UTC)", "from smtp1.osuosl.org ([127.0.0.1])\n by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id g7BCKG-gv1qa for <ovs-dev@openvswitch.org>;\n Tue, 28 Apr 2026 15:19:45 +0000 (UTC)", "from mail-wr1-f68.google.com (mail-wr1-f68.google.com\n [209.85.221.68])\n by smtp1.osuosl.org (Postfix) with ESMTPS id 0999F83C24\n for <ovs-dev@openvswitch.org>; Tue, 28 Apr 2026 15:19:44 +0000 (UTC)", "by mail-wr1-f68.google.com with SMTP id\n ffacd0b85a97d-43d7badbd7dso5715080f8f.2\n for <ovs-dev@openvswitch.org>; Tue, 28 Apr 2026 08:19:44 -0700 (PDT)", "from im-t490s.redhat.com (89-24-34-32.nat.epc.tmcz.cz.\n [89.24.34.32])\n by smtp.gmail.com with ESMTPSA id\n ffacd0b85a97d-4463fa89038sm7080967f8f.26.2026.04.28.08.19.41\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 28 Apr 2026 08:19:41 -0700 (PDT)" ], "X-Virus-Scanned": [ "amavis at osuosl.org", "amavis at osuosl.org" ], "X-Comment": "SPF check N/A for local connections -\n client-ip=2605:bc80:3010:104::8cd3:938; helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ", "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 smtp4.osuosl.org 15BDE402BC", "OpenDKIM Filter v2.11.0 smtp1.osuosl.org 0999F83C24" ], "Received-SPF": "Pass (mailfrom) identity=mailfrom; client-ip=209.85.221.68;\n helo=mail-wr1-f68.google.com; envelope-from=i.maximets.ovn@gmail.com;\n receiver=<UNKNOWN>", "DMARC-Filter": "OpenDMARC Filter v1.4.2 smtp1.osuosl.org 0999F83C24", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777389583; x=1777994383;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=pj/WbNeus+I68+xb8nfJtI6iHzreRneEgpDWi+ZmKHQ=;\n b=bt1gH/x5q0Vpu5y0lfEZ3iILo6D3qhApBrEN+b36jHg2DVDtS6Ca+1nDcTwGHZPMhK\n PeHRMvjjP6vpVGLJD2uCT3iqZGaG0fpUoSfYKyBTG+Gbxy/j96EQftVMTRX++lBFCwKx\n nOJyGf//TREXjwwtZ9B64/VeS90QJWxaFSVurxB0Jn1XGC0PZqbgqnhAmB/kC37T0uHK\n 2CxkRLP8OZEEEqYmXOhBPY6E4o9IsJ6xDC+WNMZ3yOZLr3pUkln2IxYkYIiHwuCG7r8p\n 6X/HC7PKPRKHUzsJSHXrWZasy9Q/n2ri3Z34pRnw2eZ5fKPraJB7Rx/m6/x8/yo4s8Bw\n Y1WQ==", "X-Gm-Message-State": "AOJu0YyT/ktb5yNah9IEH0fdpEPQrTT45iTmdCFQtRKroBIWbDHAfjLh\n SgEaVLmUdX1rSxIqHY+erLDFuXoTotdC6w8dOIP6W0Jlf9doNDCvr/uBD7+iz8Ko5bg=", "X-Gm-Gg": "AeBDiesyBHRWPAcohRk9TmuXVPHMXk54rTnEbZn3roy3X9A58T2LKjyJDulpE2zqf3Y\n WlmJWDP9Pba7nG22v0mtFMfirpvmMH0zwNCqqo5TA6AUK7ZDbk2TmsKpLkhapdizJQg4DRWjSfc\n tsWMKL+xIX+XfVYtTvtpB4oy9AQLkxd1zYuSSMS4LrVL3dfe43otAxsdqQUA4o08OH/oxR2L82S\n yG2tGeSj81EN+ingxHDV1wXGFjB7ljkBVvl5f2JnrkXlmfWCPRnfRCH/xLw/LG9Eh+yBsGzsTLA\n nAiOIfVl2zcBSOUDdvF64UfMPUr9tq2+J65lT9/Y/BV7MKsN8HzOisuJZipSzYHjW0TduwWXbje\n pjriESsEE1vx9n8mtcrhpSkgd92azqpmbPpu50dYPAblGWC8WDs8FCxWuxwPp8FL/ofGeEM1BZa\n 0ED7L7L7p7XumMa/PvCkHvvK6gP2ebHpT5A03Xm2/xtQc6MIjmGk02tY2IBByX/O4gpxo=", "X-Received": "by 2002:a05:6000:250c:b0:43d:7946:badd with SMTP id\n ffacd0b85a97d-4464a913497mr6615979f8f.35.1777389582345;\n Tue, 28 Apr 2026 08:19:42 -0700 (PDT)", "From": "Ilya Maximets <i.maximets@ovn.org>", "To": "ovs-dev@openvswitch.org", "Cc": "Ilya Maximets <i.maximets@ovn.org>", "Date": "Tue, 28 Apr 2026 17:19:08 +0200", "Message-ID": "<20260428151926.3798626-4-i.maximets@ovn.org>", "X-Mailer": "git-send-email 2.53.0", "In-Reply-To": "<20260428151926.3798626-1-i.maximets@ovn.org>", "References": "<20260428151926.3798626-1-i.maximets@ovn.org>", "MIME-Version": "1.0", "Subject": "[ovs-dev] [PATCH 3/6] dpif-netdev: Remove deprecated\n AVX512-optimized datapath interface.", "X-BeenThere": "ovs-dev@openvswitch.org", "X-Mailman-Version": "2.1.30", "Precedence": "list", "List-Id": "<ovs-dev.openvswitch.org>", "List-Unsubscribe": "<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=unsubscribe>", "List-Archive": "<http://mail.openvswitch.org/pipermail/ovs-dev/>", "List-Post": "<mailto:ovs-dev@openvswitch.org>", "List-Help": "<mailto:ovs-dev-request@openvswitch.org?subject=help>", "List-Subscribe": "<https://mail.openvswitch.org/mailman/listinfo/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=subscribe>", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Errors-To": "ovs-dev-bounces@openvswitch.org", "Sender": "\"dev\" <ovs-dev-bounces@openvswitch.org>" }, "content": "This functionality was deprecated in 3.7 due to lack of use, testing\nand maintenance. It's time to remove it.\n\nSigned-off-by: Ilya Maximets <i.maximets@ovn.org>\n---\n Documentation/topics/dpdk/bridge.rst | 32 ---\n Documentation/topics/testing.rst | 11 -\n NEWS | 1 +\n acinclude.m4 | 20 --\n configure.ac | 1 -\n lib/automake.mk | 6 +-\n lib/dpif-netdev-avx512.c | 392 ---------------------------\n lib/dpif-netdev-private-dpif.c | 171 ------------\n lib/dpif-netdev-private-dpif.h | 88 ------\n lib/dpif-netdev-private-thread.h | 8 -\n lib/dpif-netdev-unixctl.man | 6 -\n lib/dpif-netdev.c | 112 +-------\n tests/pmd.at | 16 --\n 13 files changed, 9 insertions(+), 855 deletions(-)\n delete mode 100644 lib/dpif-netdev-avx512.c\n delete mode 100644 lib/dpif-netdev-private-dpif.c\n delete mode 100644 lib/dpif-netdev-private-dpif.h", "diff": "diff --git a/Documentation/topics/dpdk/bridge.rst b/Documentation/topics/dpdk/bridge.rst\nindex 3c7896f28..ab09f89f1 100644\n--- a/Documentation/topics/dpdk/bridge.rst\n+++ b/Documentation/topics/dpdk/bridge.rst\n@@ -253,35 +253,3 @@ match with the numbers in the provided command output\n \n Please send an email to the OVS mailing list ovs-dev@openvswitch.org with\n the output of the ``dp-extra-info:miniflow_bits(4,1)`` values.\n-\n-Datapath Interface Performance\n-------------------------------\n-\n-.. note::\n-\n- The AVX512 Datapath Interface Performance feature is deprecated and will be\n- removed in a future release.\n-\n-The datapath interface (DPIF) is responsible for taking packets through the\n-major components of the userspace datapath; such as packet parsing, caches and\n-datapath classifier lookups.\n-\n-Just like with the datapath classifier, SIMD instructions can be applied to the\n-datapath interface implementation to improve performance.\n-\n-OVS provides multiple implementations of the userspace datapath interface.\n-Available implementations can be listed with the following command::\n-\n- $ ovs-appctl dpif-netdev/dpif-impl-get\n- Available DPIF implementations:\n- dpif_scalar (pmds: none)\n- dpif_avx512 (pmds: 1,2,6,7)\n-\n-By default, ``dpif_scalar`` is used. Implementations can be selected by\n-name::\n-\n- $ ovs-appctl dpif-netdev/dpif-impl-set dpif_avx512\n- DPIF implementation set to dpif_avx512.\n-\n- $ ovs-appctl dpif-netdev/dpif-impl-set dpif_scalar\n- DPIF implementation set to dpif_scalar.\ndiff --git a/Documentation/topics/testing.rst b/Documentation/topics/testing.rst\nindex 6c835c663..e3b06321a 100644\n--- a/Documentation/topics/testing.rst\n+++ b/Documentation/topics/testing.rst\n@@ -364,17 +364,6 @@ options are used::\n Compile OVS in debug mode to have `ovs_assert` statements error out if\n there is a mismatch in the datapath classifier lookup.\n \n-Since the AVX512 implementation of the datapath interface is disabled by\n-default, a compile time option is available in order to test it with the OVS\n-unit test suite::\n-\n- $ ./configure --enable-dpif-default-avx512\n-\n-The following line should be seen in the configuration log when the above\n-option is used::\n-\n- checking whether DPIF AVX512 is default implementation... yes\n-\n .. note::\n Run all the available testsuites including `make check`,\n `make check-system-userspace` and `make check-dpdk` to ensure the optimal\ndiff --git a/NEWS b/NEWS\nindex 81be6dcd7..cfaafe534 100644\n--- a/NEWS\n+++ b/NEWS\n@@ -7,6 +7,7 @@ Post-v3.7.0\n datapath are now removed:\n * AVX512-optimized action handling.\n * AVX512-optimized packet parsing (miniflow extraction).\n+ * AVX512-optimized DPIF input processing.\n \n \n v3.7.0 - 16 Feb 2026\ndiff --git a/acinclude.m4 b/acinclude.m4\nindex 43c8e9d03..58d5b9df8 100644\n--- a/acinclude.m4\n+++ b/acinclude.m4\n@@ -36,26 +36,6 @@ AC_DEFUN([OVS_CHECK_DPCLS_AUTOVALIDATOR], [\n fi\n ])\n \n-dnl Set OVS DPIF default implementation at configure time for running the unit\n-dnl tests on the whole codebase without modifying tests per DPIF impl\n-AC_DEFUN([OVS_CHECK_DPIF_AVX512_DEFAULT], [\n- AC_ARG_ENABLE([dpif-default-avx512],\n- [AS_HELP_STRING([--enable-dpif-default-avx512],\n- [Enable DPIF AVX512 implementation as default.])],\n- [dpifavx512=yes],[dpifavx512=no])\n- AC_MSG_CHECKING([whether DPIF AVX512 is default implementation])\n- if test \"$dpifavx512\" != yes; then\n- AC_MSG_RESULT([no])\n- else\n- AC_DEFINE([DPIF_AVX512_DEFAULT], [1],\n- [DPIF AVX512 is a default implementation of the userspace\n- datapath interface.])\n- AC_MSG_RESULT([yes])\n- AC_MSG_WARN(\n- [Explicit AVX512 feature support will be deprecated in the next release.])\n- fi\n-])\n-\n dnl OVS_CHECK_AVX512\n dnl\n dnl Checks if compiler and binutils supports various AVX512 ISA.\ndiff --git a/configure.ac b/configure.ac\nindex e57778d8d..bc5fabcd8 100644\n--- a/configure.ac\n+++ b/configure.ac\n@@ -191,7 +191,6 @@ OVS_ENABLE_WERROR_TOP\n OVS_ENABLE_SPARSE\n OVS_CTAGS_IDENTIFIERS\n OVS_CHECK_DPCLS_AUTOVALIDATOR\n-OVS_CHECK_DPIF_AVX512_DEFAULT\n OVS_CHECK_AVX512\n \n AC_ARG_VAR(KARCH, [Kernel Architecture String])\ndiff --git a/lib/automake.mk b/lib/automake.mk\nindex e482a92a1..bcd79f0d8 100644\n--- a/lib/automake.mk\n+++ b/lib/automake.mk\n@@ -34,14 +34,12 @@ lib_libopenvswitchavx512_la_CFLAGS = \\\n \t-mbmi2 \\\n \t-fPIC \\\n \t$(AM_CFLAGS)\n-lib_libopenvswitchavx512_la_SOURCES = \\\n-\tlib/dpif-netdev-avx512.c\n if HAVE_AVX512BW\n if HAVE_AVX512VL\n lib_libopenvswitchavx512_la_CFLAGS += \\\n \t-mavx512bw \\\n \t-mavx512vl\n-lib_libopenvswitchavx512_la_SOURCES += \\\n+lib_libopenvswitchavx512_la_SOURCES = \\\n \tlib/dpif-netdev-lookup-avx512-gather.c\n endif # HAVE_AVX512VL\n endif # HAVE_AVX512BW\n@@ -128,8 +126,6 @@ lib_libopenvswitch_la_SOURCES = \\\n \tlib/dpif-netdev-private-dfc.c \\\n \tlib/dpif-netdev-private-dfc.h \\\n \tlib/dpif-netdev-private-dpcls.h \\\n-\tlib/dpif-netdev-private-dpif.c \\\n-\tlib/dpif-netdev-private-dpif.h \\\n \tlib/dpif-netdev-private-flow.h \\\n \tlib/dpif-netdev-private-thread.h \\\n \tlib/dpif-netdev-private.h \\\ndiff --git a/lib/dpif-netdev-avx512.c b/lib/dpif-netdev-avx512.c\ndeleted file mode 100644\nindex b530889d6..000000000\n--- a/lib/dpif-netdev-avx512.c\n+++ /dev/null\n@@ -1,392 +0,0 @@\n-/*\n- * Copyright (c) 2021 Intel Corporation.\n- *\n- * Licensed under the Apache License, Version 2.0 (the \"License\");\n- * you may not use this file except in compliance with the License.\n- * You may obtain a copy of the License at:\n- *\n- * http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-#ifdef __x86_64__\n-/* Sparse cannot handle the AVX512 instructions. */\n-#if !defined(__CHECKER__)\n-\n-#include <config.h>\n-\n-#include \"dpif-netdev.h\"\n-#include \"dpif-netdev-perf.h\"\n-#include \"dpif-netdev-private.h\"\n-#include \"dpif-offload.h\"\n-\n-#include <errno.h>\n-#include <immintrin.h>\n-\n-#include \"dp-packet.h\"\n-#include \"netdev.h\"\n-\n-/* Each AVX512 register (zmm register in assembly notation) can contain up to\n- * 512 bits, which is equivalent to 8 uint64_t variables. This is the maximum\n- * number of miniflow blocks that can be processed in a single pass of the\n- * AVX512 code at a time.\n- */\n-#define NUM_U64_IN_ZMM_REG (8)\n-\n-/* Structure to contain per-packet metadata that must be attributed to the\n- * dp netdev flow. This is unfortunate to have to track per packet, however\n- * it's a bit awkward to maintain them in a performant way. This structure\n- * helps to keep two variables on a single cache line per packet.\n- */\n-struct pkt_flow_meta {\n- uint16_t bytes;\n- uint16_t tcp_flags;\n-};\n-\n-/* Structure of heap allocated memory for DPIF internals. */\n-struct dpif_userdata {\n- OVS_ALIGNED_VAR(CACHE_LINE_SIZE)\n- struct netdev_flow_key keys[NETDEV_MAX_BURST];\n- OVS_ALIGNED_VAR(CACHE_LINE_SIZE)\n- struct netdev_flow_key *key_ptrs[NETDEV_MAX_BURST];\n- OVS_ALIGNED_VAR(CACHE_LINE_SIZE)\n- struct pkt_flow_meta pkt_meta[NETDEV_MAX_BURST];\n-};\n-\n-int32_t\n-dp_netdev_input_outer_avx512(struct dp_netdev_pmd_thread *pmd,\n- struct dp_packet_batch *packets,\n- odp_port_t in_port)\n-{\n- /* Allocate DPIF userdata. */\n- if (OVS_UNLIKELY(!pmd->netdev_input_func_userdata)) {\n- pmd->netdev_input_func_userdata =\n- xmalloc_pagealign(sizeof(struct dpif_userdata));\n- }\n-\n- struct dpif_userdata *ud = pmd->netdev_input_func_userdata;\n- struct netdev_flow_key *keys = ud->keys;\n- struct netdev_flow_key **key_ptrs = ud->key_ptrs;\n- struct pkt_flow_meta *pkt_meta = ud->pkt_meta;\n-\n- /* The AVX512 DPIF implementation handles rules in a way that is optimized\n- * for reducing data-movement between HWOL/EMC/SMC and DPCLS. This is\n- * achieved by separating the rule arrays. Bitmasks are kept for each\n- * packet, indicating if it matched in the HWOL/EMC/SMC array or DPCLS\n- * array. Later the two arrays are merged by AVX-512 expand instructions.\n- */\n-\n- /* Stores the computed output: a rule pointer for each packet. */\n- /* Used initially for HWOL/EMC/SMC and Simple Match. */\n- struct dpcls_rule *rules[NETDEV_MAX_BURST];\n- /* Used for DPCLS. */\n- struct dpcls_rule *dpcls_rules[NETDEV_MAX_BURST];\n-\n- uint32_t dpcls_key_idx = 0;\n-\n- for (uint32_t i = 0; i < NETDEV_MAX_BURST; i += NUM_U64_IN_ZMM_REG) {\n- _mm512_storeu_si512(&rules[i], _mm512_setzero_si512());\n- _mm512_storeu_si512(&dpcls_rules[i], _mm512_setzero_si512());\n- }\n-\n- const size_t batch_size = dp_packet_batch_size(packets);\n-\n- /* Prefetch 2 packets ahead when processing. This was found to perform best\n- * through testing. */\n- const uint32_t prefetch_ahead = 2;\n- const uint32_t initial_prefetch = MIN(prefetch_ahead, batch_size);\n- for (int i = 0; i < initial_prefetch; i++) {\n- struct dp_packet *packet = packets->packets[i];\n- OVS_PREFETCH(dp_packet_data(packet));\n- pkt_metadata_prefetch_init(&packet->md);\n- }\n-\n- const bool simple_match_enabled = dp_netdev_simple_match_enabled(pmd,\n- in_port);\n- /* Check if EMC or SMC are enabled. */\n- struct dfc_cache *cache = &pmd->flow_cache;\n- const uint32_t hwol_enabled = dpif_offload_enabled();\n- const uint32_t emc_enabled = pmd->ctx.emc_insert_min != 0;\n- const uint32_t smc_enabled = pmd->ctx.smc_enable_db;\n-\n- uint32_t n_simple_hit = 0;\n- uint32_t emc_hits = 0;\n- uint32_t smc_hits = 0;\n- uint32_t phwol_hits = 0;\n-\n- /* A 1 bit in this mask indicates a hit, so no DPCLS lookup on the pkt. */\n- uint32_t hwol_emc_smc_hitmask = 0;\n- uint32_t smc_hitmask = 0;\n-\n- /* The below while loop is based on the 'iter' variable which has a number\n- * of bits set representing packets that we want to process\n- * (HWOL->MFEX->EMC->SMC). As each packet is processed, we clear (set to 0)\n- * the bit representing that packet using '_blsr_u64()'. The\n- * 'raw_ctz()' will give us the correct index into the 'packets',\n- * 'pkt_meta', 'keys' and 'rules' arrays.\n- *\n- * For one iteration of the while loop, here's some pseudocode as an\n- * example where 'iter' is represented in binary:\n- *\n- * while (iter) { // iter = 1100\n- * uint32_t i = raw_ctz(iter); // i = 2\n- * iter = _blsr_u64(iter); // iter = 1000\n- * // do all processing (HWOL->MFEX->EMC->SMC)\n- * }\n- */\n-\n- uint32_t lookup_pkts_bitmask = (UINT64_C(1) << batch_size) - 1;\n-\n- if (simple_match_enabled) {\n- struct dp_packet *packet;\n-\n- DP_PACKET_BATCH_FOR_EACH (i, packet, packets) {\n- struct dp_netdev_flow *f = NULL;\n- ovs_be16 vlan_tci = 0;\n- ovs_be16 dl_type = 0;\n- uint8_t nw_frag = 0;\n-\n- if (i + prefetch_ahead < batch_size) {\n- struct dp_packet **dp_packets = packets->packets;\n-\n- /* Prefetch next packet data and metadata. */\n- OVS_PREFETCH(dp_packet_data(dp_packets[i + prefetch_ahead]));\n- pkt_metadata_prefetch_init(\n- &dp_packets[i + prefetch_ahead]->md);\n- }\n-\n- pkt_metadata_init(&packet->md, in_port);\n-\n- pkt_meta[i].tcp_flags = parse_tcp_flags(packet, &dl_type, &nw_frag,\n- &vlan_tci);\n-\n- f = dp_netdev_simple_match_lookup(pmd, in_port, dl_type,\n- nw_frag, vlan_tci);\n- if (!f) {\n- /* Any miss in Simple Match means an upcall is needed. Fall\n- * back to the scalar DPIF to do this. */\n- return -1;\n- }\n-\n- pkt_meta[i].bytes = dp_packet_size(packet);\n- rules[i] = &f->cr;\n- n_simple_hit++;\n- hwol_emc_smc_hitmask |= (UINT32_C(1) << i);\n- }\n-\n- goto action_stage;\n- }\n-\n- uint32_t iter = lookup_pkts_bitmask;\n- while (iter) {\n- uint32_t i = raw_ctz(iter);\n- iter = _blsr_u64(iter);\n-\n- if (i + prefetch_ahead < batch_size) {\n- struct dp_packet **dp_packets = packets->packets;\n- /* Prefetch next packet data and metadata. */\n- OVS_PREFETCH(dp_packet_data(dp_packets[i + prefetch_ahead]));\n- pkt_metadata_prefetch_init(&dp_packets[i + prefetch_ahead]->md);\n- }\n-\n- /* Get packet pointer from bitmask and packet md. */\n- struct dp_packet *packet = packets->packets[i];\n- pkt_metadata_init(&packet->md, in_port);\n-\n- struct dp_netdev_flow *f = NULL;\n- struct netdev_flow_key *key = &keys[i];\n-\n- /* Check for a partial hardware offload match. */\n- if (hwol_enabled) {\n- if (OVS_UNLIKELY(dp_netdev_hw_flow(pmd, packet, &f))) {\n- /* Packet restoration failed and it was dropped, do not\n- * continue processing. */\n- continue;\n- }\n- if (f) {\n- rules[i] = &f->cr;\n- pkt_meta[i].tcp_flags = parse_tcp_flags(packet,\n- NULL, NULL, NULL);\n- pkt_meta[i].bytes = dp_packet_size(packet);\n- phwol_hits++;\n- hwol_emc_smc_hitmask |= (UINT32_C(1) << i);\n- continue;\n- }\n- }\n-\n- /* Do a scalar miniflow extract into keys. */\n- miniflow_extract(packet, &key->mf);\n-\n- /* Cache TCP and byte values for all packets. */\n- pkt_meta[i].bytes = dp_packet_size(packet);\n- pkt_meta[i].tcp_flags = miniflow_get_tcp_flags(&key->mf);\n-\n- key->len = netdev_flow_key_size(miniflow_n_values(&key->mf));\n- key->hash = dpif_netdev_packet_get_rss_hash_orig_pkt(packet, &key->mf);\n-\n- if (emc_enabled) {\n- f = emc_lookup(&cache->emc_cache, key);\n-\n- if (f) {\n- rules[i] = &f->cr;\n- emc_hits++;\n- hwol_emc_smc_hitmask |= (UINT32_C(1) << i);\n- continue;\n- }\n- }\n-\n- if (smc_enabled) {\n- f = smc_lookup_single(pmd, packet, key);\n- if (f) {\n- rules[i] = &f->cr;\n- smc_hits++;\n- smc_hitmask |= (UINT32_C(1) << i);\n- continue;\n- }\n- }\n-\n- /* The flow pointer was not found in HWOL/EMC/SMC, so add it to the\n- * dpcls input keys array for batch lookup later.\n- */\n- key_ptrs[dpcls_key_idx] = &keys[i];\n- dpcls_key_idx++;\n- }\n-\n- hwol_emc_smc_hitmask |= smc_hitmask;\n- uint32_t hwol_emc_smc_missmask = ~hwol_emc_smc_hitmask;\n-\n- /* DPCLS handles any packets missed by HWOL/EMC/SMC. It operates on the\n- * key_ptrs[] for input miniflows to match, storing results in the\n- * dpcls_rules[] array.\n- */\n- if (dpcls_key_idx > 0) {\n- struct dpcls *cls = dp_netdev_pmd_lookup_dpcls(pmd, in_port);\n- if (OVS_UNLIKELY(!cls)) {\n- return -1;\n- }\n- bool any_miss =\n- !dpcls_lookup(cls, (const struct netdev_flow_key **) key_ptrs,\n- dpcls_rules, dpcls_key_idx, NULL);\n- if (OVS_UNLIKELY(any_miss)) {\n- return -1;\n- }\n-\n- /* Merge DPCLS rules and HWOL/EMC/SMC rules. */\n- uint32_t dpcls_idx = 0;\n- for (int i = 0; i < NETDEV_MAX_BURST; i += NUM_U64_IN_ZMM_REG) {\n- /* Indexing here is somewhat complicated due to DPCLS output rule\n- * load index depending on the hitmask of HWOL/EMC/SMC. More\n- * packets from HWOL/EMC/SMC bitmask means less DPCLS rules are\n- * used.\n- */\n- __m512i v_cache_rules = _mm512_loadu_si512(&rules[i]);\n- __m512i v_merged_rules =\n- _mm512_mask_expandloadu_epi64(v_cache_rules,\n- ~hwol_emc_smc_hitmask,\n- &dpcls_rules[dpcls_idx]);\n- _mm512_storeu_si512(&rules[i], v_merged_rules);\n-\n- /* Update DPCLS load index and bitmask for HWOL/EMC/SMC hits.\n- * There are NUM_U64_IN_ZMM_REG output pointers per register,\n- * subtract the HWOL/EMC/SMC lanes equals the number of DPCLS rules\n- * consumed.\n- */\n- uint32_t hitmask_FF = (hwol_emc_smc_hitmask & 0xFF);\n- dpcls_idx += NUM_U64_IN_ZMM_REG - __builtin_popcountll(hitmask_FF);\n- hwol_emc_smc_hitmask =\n- (hwol_emc_smc_hitmask >> NUM_U64_IN_ZMM_REG);\n- }\n- }\n-\n- /* At this point we have a 1:1 pkt to rules mapping, so update EMC/SMC\n- * if required.\n- */\n- /* Insert SMC and DPCLS hits into EMC. */\n- if (emc_enabled) {\n- uint32_t emc_insert_mask = smc_hitmask | hwol_emc_smc_missmask;\n- emc_insert_mask &= lookup_pkts_bitmask;\n- emc_probabilistic_insert_batch(pmd, keys, &rules[0], emc_insert_mask);\n- }\n- /* Insert DPCLS hits into SMC. */\n- if (smc_enabled) {\n- uint32_t smc_insert_mask = hwol_emc_smc_missmask;\n- smc_insert_mask &= lookup_pkts_bitmask;\n- smc_insert_batch(pmd, keys, &rules[0], smc_insert_mask);\n- }\n-\n- /* At this point we don't return error anymore, so commit stats here. */\n- pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_PHWOL_HIT, phwol_hits);\n- pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_EXACT_HIT, emc_hits);\n- pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_SMC_HIT, smc_hits);\n- pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_MASKED_HIT,\n- dpcls_key_idx);\n- pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_MASKED_LOOKUP,\n- dpcls_key_idx);\n-action_stage:\n- pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_RECV, batch_size);\n- pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_SIMPLE_HIT,\n- n_simple_hit);\n-\n- /* Initialize the \"Action Batch\" for each flow handled below. */\n- struct dp_packet_batch action_batch;\n- action_batch.trunc = 0;\n-\n- while (lookup_pkts_bitmask) {\n- uint32_t rule_pkt_idx = raw_ctz(lookup_pkts_bitmask);\n- uint64_t needle = (uintptr_t) rules[rule_pkt_idx];\n-\n- /* Parallel compare NUM_U64_IN_ZMM_REG flow* 's to the needle, create a\n- * bitmask.\n- */\n- uint32_t batch_bitmask = 0;\n- for (uint32_t j = 0; j < NETDEV_MAX_BURST; j += NUM_U64_IN_ZMM_REG) {\n- /* Pre-calculate store addr. */\n- uint32_t num_pkts_in_batch = __builtin_popcountll(batch_bitmask);\n- void *store_addr = &action_batch.packets[num_pkts_in_batch];\n-\n- /* Search for identical flow* in burst, update bitmask. */\n- __m512i v_needle = _mm512_set1_epi64(needle);\n- __m512i v_hay = _mm512_loadu_si512(&rules[j]);\n- __mmask8 k_cmp_bits = _mm512_cmpeq_epi64_mask(v_needle, v_hay);\n- uint32_t cmp_bits = k_cmp_bits;\n- batch_bitmask |= cmp_bits << j;\n-\n- /* Compress and store the batched packets. */\n- struct dp_packet **packets_ptrs = &packets->packets[j];\n- __m512i v_pkt_ptrs = _mm512_loadu_si512(packets_ptrs);\n- _mm512_mask_compressstoreu_epi64(store_addr, cmp_bits, v_pkt_ptrs);\n- }\n-\n- /* Strip all packets in this batch from the lookup_pkts_bitmask. */\n- lookup_pkts_bitmask &= (~batch_bitmask);\n- action_batch.count = __builtin_popcountll(batch_bitmask);\n-\n- /* Loop over all packets in this batch, to gather the byte and tcp_flag\n- * values, and pass them to the execute function. It would be nice to\n- * optimize this away, however it is not easy to refactor in dpif.\n- */\n- uint32_t bytes = 0;\n- uint16_t tcp_flags = 0;\n- uint32_t bitmask_iter = batch_bitmask;\n- for (int i = 0; i < action_batch.count; i++) {\n- uint32_t idx = raw_ctz(bitmask_iter);\n- bitmask_iter = _blsr_u64(bitmask_iter);\n-\n- bytes += pkt_meta[idx].bytes;\n- tcp_flags |= pkt_meta[idx].tcp_flags;\n- }\n-\n- dp_netdev_batch_execute(pmd, &action_batch, rules[rule_pkt_idx],\n- bytes, tcp_flags);\n- }\n-\n- return 0;\n-}\n-\n-#endif\n-#endif\ndiff --git a/lib/dpif-netdev-private-dpif.c b/lib/dpif-netdev-private-dpif.c\ndeleted file mode 100644\nindex ef4cee2ba..000000000\n--- a/lib/dpif-netdev-private-dpif.c\n+++ /dev/null\n@@ -1,171 +0,0 @@\n-/*\n- * Copyright (c) 2021 Intel Corporation.\n- *\n- * Licensed under the Apache License, Version 2.0 (the \"License\");\n- * you may not use this file except in compliance with the License.\n- * You may obtain a copy of the License at:\n- *\n- * http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-#include <config.h>\n-\n-#include \"dpif-netdev-private-dpif.h\"\n-#include \"dpif-netdev-private-thread.h\"\n-\n-#include <errno.h>\n-#include <string.h>\n-\n-#include \"cpu.h\"\n-#include \"openvswitch/dynamic-string.h\"\n-#include \"openvswitch/vlog.h\"\n-#include \"util.h\"\n-\n-VLOG_DEFINE_THIS_MODULE(dpif_netdev_impl);\n-#define DPIF_NETDEV_IMPL_AVX512_CHECK (__x86_64__ && HAVE_AVX512F \\\n- && HAVE_LD_AVX512_GOOD && __SSE4_2__)\n-\n-enum dpif_netdev_impl_info_idx {\n- DPIF_NETDEV_IMPL_SCALAR,\n- DPIF_NETDEV_IMPL_AVX512\n-};\n-\n-#if DPIF_NETDEV_IMPL_AVX512_CHECK\n-static int32_t\n-dp_netdev_input_outer_avx512_probe(void)\n-{\n- if (!cpu_has_isa(OVS_CPU_ISA_X86_AVX512F)\n- || !cpu_has_isa(OVS_CPU_ISA_X86_BMI2)) {\n- return -ENOTSUP;\n- }\n-\n- return 0;\n-}\n-#endif\n-\n-/* Actual list of implementations goes here. */\n-static struct dpif_netdev_impl_info_t dpif_impls[] = {\n- /* The default scalar C code implementation. */\n- [DPIF_NETDEV_IMPL_SCALAR] = { .input_func = dp_netdev_input,\n- .probe = NULL,\n- .name = \"dpif_scalar\", },\n-\n-#if DPIF_NETDEV_IMPL_AVX512_CHECK\n- /* Only available on x86_64 bit builds with SSE 4.2 used for OVS core. */\n- [DPIF_NETDEV_IMPL_AVX512] = { .input_func = dp_netdev_input_outer_avx512,\n- .probe = dp_netdev_input_outer_avx512_probe,\n- .name = \"dpif_avx512\", },\n-#endif\n-};\n-\n-static dp_netdev_input_func default_dpif_func;\n-\n-dp_netdev_input_func\n-dp_netdev_impl_get_default(void)\n-{\n- /* For the first call, this will be NULL. Compute the compile time default.\n- */\n- if (!default_dpif_func) {\n- int dpif_idx = DPIF_NETDEV_IMPL_SCALAR;\n-\n-/* Configure-time overriding to run test suite on all implementations. */\n-#if DPIF_NETDEV_IMPL_AVX512_CHECK\n-#ifdef DPIF_AVX512_DEFAULT\n- dp_netdev_input_func_probe probe;\n-\n- /* Check if the compiled default is compatible. */\n- probe = dpif_impls[DPIF_NETDEV_IMPL_AVX512].probe;\n- if (!probe || !probe()) {\n- dpif_idx = DPIF_NETDEV_IMPL_AVX512;\n- }\n-#endif\n-#endif\n-\n- VLOG_INFO(\"Default DPIF implementation is %s.\\n\",\n- dpif_impls[dpif_idx].name);\n- default_dpif_func = dpif_impls[dpif_idx].input_func;\n- }\n-\n- return default_dpif_func;\n-}\n-\n-void\n-dp_netdev_impl_get(struct ds *reply, struct dp_netdev_pmd_thread **pmd_list,\n- size_t n)\n-{\n- /* Add all dpif functions to reply string. */\n- ds_put_cstr(reply, \"Available DPIF implementations:\\n\");\n-\n- for (uint32_t i = 0; i < ARRAY_SIZE(dpif_impls); i++) {\n- ds_put_format(reply, \" %s (pmds: \", dpif_impls[i].name);\n-\n- for (size_t j = 0; j < n; j++) {\n- struct dp_netdev_pmd_thread *pmd = pmd_list[j];\n- if (pmd->core_id == NON_PMD_CORE_ID) {\n- continue;\n- }\n-\n- if (pmd->netdev_input_func == dpif_impls[i].input_func) {\n- ds_put_format(reply, \"%u,\", pmd->core_id);\n- }\n- }\n-\n- ds_chomp(reply, ',');\n-\n- if (ds_last(reply) == ' ') {\n- ds_put_cstr(reply, \"none\");\n- }\n-\n- ds_put_cstr(reply, \")\\n\");\n- }\n-}\n-\n-/* This function checks all available DPIF implementations, and selects the\n- * returns the function pointer to the one requested by \"name\".\n- */\n-static int32_t\n-dp_netdev_impl_get_by_name(const char *name, dp_netdev_input_func *out_func)\n-{\n- ovs_assert(name);\n- ovs_assert(out_func);\n-\n- uint32_t i;\n-\n- for (i = 0; i < ARRAY_SIZE(dpif_impls); i++) {\n- if (strcmp(dpif_impls[i].name, name) == 0) {\n- /* Probe function is optional - so check it is set before exec. */\n- if (dpif_impls[i].probe) {\n- int probe_err = dpif_impls[i].probe();\n- if (probe_err) {\n- *out_func = NULL;\n- return probe_err;\n- }\n- }\n- *out_func = dpif_impls[i].input_func;\n- return 0;\n- }\n- }\n-\n- return -EINVAL;\n-}\n-\n-int32_t\n-dp_netdev_impl_set_default_by_name(const char *name)\n-{\n- dp_netdev_input_func new_default;\n-\n- int32_t err = dp_netdev_impl_get_by_name(name, &new_default);\n-\n- if (!err) {\n- default_dpif_func = new_default;\n- }\n-\n- return err;\n-\n-}\ndiff --git a/lib/dpif-netdev-private-dpif.h b/lib/dpif-netdev-private-dpif.h\ndeleted file mode 100644\nindex cf331cec7..000000000\n--- a/lib/dpif-netdev-private-dpif.h\n+++ /dev/null\n@@ -1,88 +0,0 @@\n-/*\n- * Copyright (c) 2021 Intel Corporation.\n- *\n- * Licensed under the Apache License, Version 2.0 (the \"License\");\n- * you may not use this file except in compliance with the License.\n- * You may obtain a copy of the License at:\n- *\n- * http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-#ifndef DPIF_NETDEV_PRIVATE_DPIF_H\n-#define DPIF_NETDEV_PRIVATE_DPIF_H 1\n-\n-#include \"openvswitch/types.h\"\n-\n-/* Forward declarations to avoid including files. */\n-struct dp_netdev_pmd_thread;\n-struct dp_packet_batch;\n-struct ds;\n-\n-/* Typedef for DPIF functions.\n- * Returns whether all packets were processed successfully.\n- */\n-typedef int32_t (*dp_netdev_input_func)(struct dp_netdev_pmd_thread *pmd,\n- struct dp_packet_batch *packets,\n- odp_port_t port_no);\n-\n-/* Probe a DPIF implementation. This allows the implementation to validate CPU\n- * ISA availability. Returns -ENOTSUP if not available, returns 0 if valid to\n- * use.\n- */\n-typedef int32_t (*dp_netdev_input_func_probe)(void);\n-\n-/* Structure describing each available DPIF implementation. */\n-struct dpif_netdev_impl_info_t {\n- /* Function pointer to execute to have this DPIF implementation run. */\n- dp_netdev_input_func input_func;\n- /* Function pointer to execute to check the CPU ISA is available to run. If\n- * not necessary, it must be set to NULL which implies that it is always\n- * valid to use. */\n- dp_netdev_input_func_probe probe;\n- /* Name used to select this DPIF implementation. */\n- const char *name;\n-};\n-\n-/* This function returns all available implementations to the caller. */\n-void\n-dp_netdev_impl_get(struct ds *reply, struct dp_netdev_pmd_thread **pmd_list,\n- size_t n);\n-\n-/* Returns the default DPIF which is first ./configure selected, but can be\n- * overridden at runtime. */\n-dp_netdev_input_func dp_netdev_impl_get_default(void);\n-\n-/* Overrides the default DPIF with the user set DPIF. */\n-int32_t dp_netdev_impl_set_default_by_name(const char *name);\n-\n-bool\n-dp_netdev_simple_match_enabled(const struct dp_netdev_pmd_thread *pmd,\n- odp_port_t in_port);\n-\n-uint64_t\n-dp_netdev_simple_match_mark(odp_port_t in_port, ovs_be16 dl_type,\n- uint8_t nw_frag, ovs_be16 vlan_tci);\n-struct dp_netdev_flow *\n-dp_netdev_simple_match_lookup(const struct dp_netdev_pmd_thread *pmd,\n- odp_port_t in_port, ovs_be16 dl_type,\n- uint8_t nw_frag, ovs_be16 vlan_tci);\n-\n-/* Available DPIF implementations below. */\n-int32_t\n-dp_netdev_input(struct dp_netdev_pmd_thread *pmd,\n- struct dp_packet_batch *packets,\n- odp_port_t in_port);\n-\n-/* AVX512 enabled DPIF implementation function. */\n-int32_t\n-dp_netdev_input_outer_avx512(struct dp_netdev_pmd_thread *pmd,\n- struct dp_packet_batch *packets,\n- odp_port_t in_port);\n-\n-#endif /* netdev-private.h */\ndiff --git a/lib/dpif-netdev-private-thread.h b/lib/dpif-netdev-private-thread.h\nindex 1ab3e586a..bc76c86d2 100644\n--- a/lib/dpif-netdev-private-thread.h\n+++ b/lib/dpif-netdev-private-thread.h\n@@ -21,7 +21,6 @@\n #include \"dpif.h\"\n #include \"dpif-netdev-perf.h\"\n #include \"dpif-netdev-private-dfc.h\"\n-#include \"dpif-netdev-private-dpif.h\"\n \n #include <stdbool.h>\n #include <stdint.h>\n@@ -30,7 +29,6 @@\n #include \"cmap.h\"\n \n #include \"dpif-netdev-private-dfc.h\"\n-#include \"dpif-netdev-private-dpif.h\"\n #include \"dpif-netdev-perf.h\"\n #include \"openvswitch/thread.h\"\n \n@@ -120,12 +118,6 @@ struct dp_netdev_pmd_thread {\n /* Current context of the PMD thread. */\n struct dp_netdev_pmd_thread_ctx ctx;\n \n- /* Function pointer to call for dp_netdev_input() functionality. */\n- ATOMIC(dp_netdev_input_func) netdev_input_func;\n-\n- /* Pointer for per-DPIF implementation scratch space. */\n- void *netdev_input_func_userdata;\n-\n struct seq *reload_seq;\n uint64_t last_reload_seq;\n \ndiff --git a/lib/dpif-netdev-unixctl.man b/lib/dpif-netdev-unixctl.man\nindex 69b3b1a4a..2b2450884 100644\n--- a/lib/dpif-netdev-unixctl.man\n+++ b/lib/dpif-netdev-unixctl.man\n@@ -241,9 +241,3 @@ priority, \\fIprio\\fR, which should be a positive integer value. The highest\n priority lookup function is used for classification.\n \n The number of affected dpcls ports and subtables is returned.\n-.\n-.IP \"\\fBdpif-netdev/dpif-impl-get\\fR\n-Lists the DPIF implementations that are available.\n-.\n-.IP \"\\fBdpif-netdev/dpif-impl-set\\fR \\fIdpif_impl\\fR\"\n-Sets the DPIF to be used to \\fIdpif_impl\\fR. By default \"dpif_scalar\" is used.\ndiff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c\nindex 5c96f3fc8..9ae5e960e 100644\n--- a/lib/dpif-netdev.c\n+++ b/lib/dpif-netdev.c\n@@ -486,6 +486,8 @@ static void dp_netdev_execute_actions(struct dp_netdev_pmd_thread *pmd,\n const struct flow *flow,\n const struct nlattr *actions,\n size_t actions_len);\n+static void dp_netdev_input(struct dp_netdev_pmd_thread *,\n+ struct dp_packet_batch *, odp_port_t port_no);\n static void dp_netdev_recirculate(struct dp_netdev_pmd_thread *,\n struct dp_packet_batch *);\n \n@@ -1021,91 +1023,6 @@ dpif_netdev_subtable_lookup_set(struct unixctl_conn *conn, int argc OVS_UNUSED,\n ds_destroy(&reply);\n }\n \n-static void\n-dpif_netdev_impl_get(struct unixctl_conn *conn, int argc OVS_UNUSED,\n- const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED)\n-{\n- struct ds reply = DS_EMPTY_INITIALIZER;\n- struct shash_node *node;\n-\n- ovs_mutex_lock(&dp_netdev_mutex);\n- SHASH_FOR_EACH (node, &dp_netdevs) {\n- struct dp_netdev_pmd_thread **pmd_list;\n- struct dp_netdev *dp = node->data;\n- size_t n;\n-\n- /* Get PMD threads list, required to get the DPIF impl used by each PMD\n- * thread. */\n- sorted_poll_thread_list(dp, &pmd_list, &n);\n- dp_netdev_impl_get(&reply, pmd_list, n);\n- free(pmd_list);\n- }\n- ovs_mutex_unlock(&dp_netdev_mutex);\n- unixctl_command_reply(conn, ds_cstr(&reply));\n- ds_destroy(&reply);\n-}\n-\n-static void\n-dpif_netdev_impl_set(struct unixctl_conn *conn, int argc OVS_UNUSED,\n- const char *argv[], void *aux OVS_UNUSED)\n-{\n- /* This function requires just one parameter, the DPIF name. */\n- const char *dpif_name = argv[1];\n- struct shash_node *node;\n-\n- static const char *error_description[2] = {\n- \"Unknown DPIF implementation\",\n- \"CPU doesn't support the required instruction for\",\n- };\n-\n- ovs_mutex_lock(&dp_netdev_mutex);\n- int32_t err = dp_netdev_impl_set_default_by_name(dpif_name);\n-\n- if (err) {\n- struct ds reply = DS_EMPTY_INITIALIZER;\n- ds_put_format(&reply, \"DPIF implementation not available: %s %s.\\n\",\n- error_description[ (err == -ENOTSUP) ], dpif_name);\n- const char *reply_str = ds_cstr(&reply);\n- unixctl_command_reply_error(conn, reply_str);\n- VLOG_ERR(\"%s\", reply_str);\n- ds_destroy(&reply);\n- ovs_mutex_unlock(&dp_netdev_mutex);\n- return;\n- }\n-\n- SHASH_FOR_EACH (node, &dp_netdevs) {\n- struct dp_netdev *dp = node->data;\n-\n- /* Get PMD threads list, required to get DPCLS instances. */\n- size_t n;\n- struct dp_netdev_pmd_thread **pmd_list;\n- sorted_poll_thread_list(dp, &pmd_list, &n);\n-\n- for (size_t i = 0; i < n; i++) {\n- struct dp_netdev_pmd_thread *pmd = pmd_list[i];\n- if (pmd->core_id == NON_PMD_CORE_ID) {\n- continue;\n- }\n-\n- /* Initialize DPIF function pointer to the newly configured\n- * default. */\n- atomic_store_relaxed(&pmd->netdev_input_func,\n- dp_netdev_impl_get_default());\n- };\n-\n- free(pmd_list);\n- }\n- ovs_mutex_unlock(&dp_netdev_mutex);\n-\n- /* Reply with success to command. */\n- struct ds reply = DS_EMPTY_INITIALIZER;\n- ds_put_format(&reply, \"DPIF implementation set to %s.\\n\", dpif_name);\n- const char *reply_str = ds_cstr(&reply);\n- unixctl_command_reply(conn, reply_str);\n- VLOG_INFO(\"%s\", reply_str);\n- ds_destroy(&reply);\n-}\n-\n static void\n dpif_netdev_pmd_rebalance(struct unixctl_conn *conn, int argc,\n const char *argv[], void *aux OVS_UNUSED)\n@@ -1382,13 +1299,6 @@ dpif_netdev_init(void)\n unixctl_command_register(\"dpif-netdev/subtable-lookup-prio-get\", NULL,\n 0, 0, dpif_netdev_subtable_lookup_get,\n NULL);\n- unixctl_command_register(\"dpif-netdev/dpif-impl-set\",\n- \"dpif_implementation_name\",\n- 1, 1, dpif_netdev_impl_set,\n- NULL);\n- unixctl_command_register(\"dpif-netdev/dpif-impl-get\", \"\",\n- 0, 0, dpif_netdev_impl_get,\n- NULL);\n return 0;\n }\n \n@@ -3071,7 +2981,7 @@ dp_netdev_get_mega_ufid(const struct match *match, ovs_u128 *mega_ufid)\n odp_flow_key_hash(&masked_flow, sizeof masked_flow, mega_ufid);\n }\n \n-uint64_t\n+static uint64_t\n dp_netdev_simple_match_mark(odp_port_t in_port, ovs_be16 dl_type,\n uint8_t nw_frag, ovs_be16 vlan_tci)\n {\n@@ -3111,7 +3021,7 @@ dp_netdev_simple_match_mark(odp_port_t in_port, ovs_be16 dl_type,\n | (OVS_FORCE uint16_t) (vlan_tci & htons(VLAN_VID_MASK | VLAN_CFI));\n }\n \n-struct dp_netdev_flow *\n+static struct dp_netdev_flow *\n dp_netdev_simple_match_lookup(const struct dp_netdev_pmd_thread *pmd,\n odp_port_t in_port, ovs_be16 dl_type,\n uint8_t nw_frag, ovs_be16 vlan_tci)\n@@ -3132,7 +3042,7 @@ dp_netdev_simple_match_lookup(const struct dp_netdev_pmd_thread *pmd,\n return found ? flow : NULL;\n }\n \n-bool\n+static bool\n dp_netdev_simple_match_enabled(const struct dp_netdev_pmd_thread *pmd,\n odp_port_t in_port)\n {\n@@ -4746,10 +4656,7 @@ dp_netdev_process_rxq_port(struct dp_netdev_pmd_thread *pmd,\n }\n \n /* Process packet batch. */\n- int ret = pmd->netdev_input_func(pmd, &batch, port_no);\n- if (ret) {\n- dp_netdev_input(pmd, &batch, port_no);\n- }\n+ dp_netdev_input(pmd, &batch, port_no);\n \n /* Assign processing cycles to rx queue. */\n cycles = cycle_timer_stop(&pmd->perf_stats, &timer);\n@@ -6957,9 +6864,6 @@ dp_netdev_configure_pmd(struct dp_netdev_pmd_thread *pmd, struct dp_netdev *dp,\n \n pmd_init_max_sleep(dp, pmd);\n \n- /* Initialize DPIF function pointer to the default configured version. */\n- atomic_init(&pmd->netdev_input_func, dp_netdev_impl_get_default());\n-\n /* init the 'flow_cache' since there is no\n * actual thread created for NON_PMD_CORE_ID. */\n if (core_id == NON_PMD_CORE_ID) {\n@@ -6998,7 +6902,6 @@ dp_netdev_destroy_pmd(struct dp_netdev_pmd_thread *pmd)\n seq_destroy(pmd->reload_seq);\n ovs_mutex_destroy(&pmd->port_mutex);\n ovs_mutex_destroy(&pmd->bond_mutex);\n- free(pmd->netdev_input_func_userdata);\n free(pmd);\n }\n \n@@ -7987,13 +7890,12 @@ dp_netdev_input__(struct dp_netdev_pmd_thread *pmd,\n }\n }\n \n-int32_t\n+static void\n dp_netdev_input(struct dp_netdev_pmd_thread *pmd,\n struct dp_packet_batch *packets,\n odp_port_t port_no)\n {\n dp_netdev_input__(pmd, packets, false, port_no);\n- return 0;\n }\n \n static void\ndiff --git a/tests/pmd.at b/tests/pmd.at\nindex 19698f3e9..677d0feb1 100644\n--- a/tests/pmd.at\n+++ b/tests/pmd.at\n@@ -1182,22 +1182,6 @@ AT_CHECK([ovs-appctl dpctl/del-dp dummy@dp0], [0], [dnl\n OVS_VSWITCHD_STOP\n AT_CLEANUP\n \n-AT_SETUP([PMD - dpif configuration])\n-OVS_VSWITCHD_START([], [], [], [--dummy-numa 0,0])\n-AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy-pmd])\n-\n-AT_CHECK([ovs-appctl dpif-netdev/dpif-impl-set dpif_scalar], [0], [dnl\n-DPIF implementation set to dpif_scalar.\n-])\n-\n-AT_CHECK([ovs-vsctl show], [], [stdout])\n-AT_CHECK([ovs-appctl dpif-netdev/dpif-impl-get | grep \"dpif_scalar\"], [], [dnl\n- dpif_scalar (pmds: 0)\n-])\n-\n-OVS_VSWITCHD_STOP\n-AT_CLEANUP\n-\n AT_SETUP([PMD - dpcls configuration])\n OVS_VSWITCHD_START([], [], [], [--dummy-numa 0,0])\n AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy-pmd])\n", "prefixes": [ "ovs-dev", "3/6" ] }