get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.1/patches/2229657/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "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"
    ]
}