get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 818465,
    "url": "http://patchwork.ozlabs.org/api/patches/818465/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/openvswitch/patch/1506404199-23579-10-git-send-email-yliu@fridaylinux.org/",
    "project": {
        "id": 47,
        "url": "http://patchwork.ozlabs.org/api/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",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<1506404199-23579-10-git-send-email-yliu@fridaylinux.org>",
    "list_archive_url": null,
    "date": "2017-09-26T05:36:39",
    "name": "[ovs-dev,v3,9/9] dpif-netdev: do hw flow offload in another thread",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": false,
    "hash": "181c71dab63668d1a0ec04dc1148f148b17e5297",
    "submitter": {
        "id": 72215,
        "url": "http://patchwork.ozlabs.org/api/people/72215/?format=api",
        "name": "Yuanhan Liu",
        "email": "yliu@fridaylinux.org"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/openvswitch/patch/1506404199-23579-10-git-send-email-yliu@fridaylinux.org/mbox/",
    "series": [
        {
            "id": 5061,
            "url": "http://patchwork.ozlabs.org/api/series/5061/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/openvswitch/list/?series=5061",
            "date": "2017-09-26T05:36:30",
            "name": "OVS-DPDK flow offload with rte_flow",
            "version": 3,
            "mbox": "http://patchwork.ozlabs.org/series/5061/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/818465/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/818465/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<ovs-dev-bounces@openvswitch.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "dev@openvswitch.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@bilbo.ozlabs.org",
            "ovs-dev@mail.linuxfoundation.org"
        ],
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=openvswitch.org\n\t(client-ip=140.211.169.12; helo=mail.linuxfoundation.org;\n\tenvelope-from=ovs-dev-bounces@openvswitch.org;\n\treceiver=<UNKNOWN>)",
            "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=fridaylinux-org.20150623.gappssmtp.com\n\theader.i=@fridaylinux-org.20150623.gappssmtp.com\n\theader.b=\"yRKUStA7\"; dkim-atps=neutral"
        ],
        "Received": [
            "from mail.linuxfoundation.org (mail.linuxfoundation.org\n\t[140.211.169.12])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3y1VJv74N9z9t1t\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 26 Sep 2017 15:44:47 +1000 (AEST)",
            "from mail.linux-foundation.org (localhost [127.0.0.1])\n\tby mail.linuxfoundation.org (Postfix) with ESMTP id A23B7C09;\n\tTue, 26 Sep 2017 05:40:55 +0000 (UTC)",
            "from smtp1.linuxfoundation.org (smtp1.linux-foundation.org\n\t[172.17.192.35])\n\tby mail.linuxfoundation.org (Postfix) with ESMTPS id 519C9BEA\n\tfor <dev@openvswitch.org>; Tue, 26 Sep 2017 05:40:54 +0000 (UTC)",
            "from mail-pg0-f43.google.com (mail-pg0-f43.google.com\n\t[74.125.83.43])\n\tby smtp1.linuxfoundation.org (Postfix) with ESMTPS id 85C95367\n\tfor <dev@openvswitch.org>; Tue, 26 Sep 2017 05:40:53 +0000 (UTC)",
            "by mail-pg0-f43.google.com with SMTP id 7so5351569pgd.13\n\tfor <dev@openvswitch.org>; Mon, 25 Sep 2017 22:40:53 -0700 (PDT)",
            "from localhost.localdomain ([101.228.205.132])\n\tby smtp.gmail.com with ESMTPSA id\n\to79sm13180077pfi.108.2017.09.25.22.40.42\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tMon, 25 Sep 2017 22:40:51 -0700 (PDT)"
        ],
        "X-Greylist": "whitelisted by SQLgrey-1.7.6",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=fridaylinux-org.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=St7axmU79AXmtWRugAfa/hkjJQFBa8Jlx0AsVRSFMWw=;\n\tb=yRKUStA7UYwYjAL6NlaeQkHBsr8ruquHPM3LVpo6X1SuCWRHcpeHc4JgtniJg1yA3L\n\tNycDYTSm/h9PkCW/XAXWILjTv4CC930tcCxVKcMyRkzOH5kxB8aUNgFFWyMkWDwamrwF\n\tgbSLHaJFeFGe23v58kGNkxJp/zLnYJKWiszGqf8MguPaDBhadg180ZQbFINJf6Km9xLg\n\tmS6ZmcS5yQW52XJk3D/M0BlXgftC2rMpaeYYa4j9XyHWEdmZGUKL9TUppjVOw0HTmUhh\n\tLeJflNWyW6XSXaF5CnZpZs4i5J3XBDrB3RLLYsYiDvnDWoI8d2RBB1hGC00U3tOd6N1H\n\tEFIA==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=St7axmU79AXmtWRugAfa/hkjJQFBa8Jlx0AsVRSFMWw=;\n\tb=Bz8q7DB5QkNhLlhO4hjM2W/vekDh/FImbmoI6aDT7eb27dDWwitH+NPXDnVIKWOROx\n\tuiEZp81CO+kqO4XPouCiWaUqSBxX4mHWCqAYEMwvTfKxIvi+C2Sqrv6W8N2Tegql/4XQ\n\teU/wuoYX3/ML64guBokPKnpt3d7irT1uCqsdWiGZuoa/rdC+vwpnLviRV8qWRVVrmPWh\n\tXqrnt7NGS5vf1NLFSlQ1qcr2ayMUBZXTH4eEHN8foUl0z/ACgRGImB9RvZVse4cNEkgn\n\tM9/lEWaPIOrPIcLMDFtXJENIorGhXU7Ltu2VXO10zvmMiyg80AbNlovZ1A/8fxWWzlLM\n\t3r7A==",
        "X-Gm-Message-State": "AHPjjUgGvdgQbpdcSePWZXzm+/oRBUijQJefpgE3tOvFceug7JFYeI93\n\tQF9LQ8nkSmGEAOll4vPQNYK+FpOkL7DQOw==",
        "X-Google-Smtp-Source": "AOwi7QCoMsqTpaBM+3BE1WfFRd+qDoQfIryAPLJS5NTlBgtFhf8RZYDGSph0l6HUVrONL2cPIA5iCw==",
        "X-Received": "by 10.99.114.19 with SMTP id n19mr9516237pgc.300.1506404452750; \n\tMon, 25 Sep 2017 22:40:52 -0700 (PDT)",
        "From": "Yuanhan Liu <yliu@fridaylinux.org>",
        "To": "dev@openvswitch.org",
        "Date": "Tue, 26 Sep 2017 13:36:39 +0800",
        "Message-Id": "<1506404199-23579-10-git-send-email-yliu@fridaylinux.org>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1506404199-23579-1-git-send-email-yliu@fridaylinux.org>",
        "References": "<1506404199-23579-1-git-send-email-yliu@fridaylinux.org>",
        "X-Spam-Status": "No, score=0.0 required=5.0 tests=DKIM_SIGNED,DKIM_VALID,\n\tRCVD_IN_DNSWL_NONE autolearn=disabled version=3.3.1",
        "X-Spam-Checker-Version": "SpamAssassin 3.3.1 (2010-03-16) on\n\tsmtp1.linux-foundation.org",
        "Cc": "Simon Horman <simon.horman@netronome.com>",
        "Subject": "[ovs-dev] [PATCH v3 9/9] dpif-netdev: do hw flow offload in another\n\tthread",
        "X-BeenThere": "ovs-dev@openvswitch.org",
        "X-Mailman-Version": "2.1.12",
        "Precedence": "list",
        "List-Id": "<ovs-dev.openvswitch.org>",
        "List-Unsubscribe": "<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n\t<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\t<mailto:ovs-dev-request@openvswitch.org?subject=subscribe>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Sender": "ovs-dev-bounces@openvswitch.org",
        "Errors-To": "ovs-dev-bounces@openvswitch.org"
    },
    "content": "Currently, the major trigger for hw flow offload is at upcall handling,\nwhich is actually in the datapath. Moreover, the hw offload installation\nand modification is not that lightweight. Meaning, if there are so many\nflows being added or modified frequently, it could stall the datapath,\nwhich could result to packet loss.\n\nTo diminish that, all those flow operations will be recorded and appended\nto a list. A thread is then introduced to process this list (to do the\nreal flow offloading put/del operations). This could leave the datapath\nas lightweight as possible.\n\nSigned-off-by: Yuanhan Liu <yliu@fridaylinux.org>\n---\n lib/dpif-netdev.c | 301 ++++++++++++++++++++++++++++++++++++++++++++----------\n 1 file changed, 249 insertions(+), 52 deletions(-)",
    "diff": "diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c\nindex 13fd012..ef5c2e9 100644\n--- a/lib/dpif-netdev.c\n+++ b/lib/dpif-netdev.c\n@@ -1949,6 +1949,223 @@ dp_netdev_pmd_find_flow_by_mark(const uint32_t mark)\n     return NULL;\n }\n \n+struct dp_flow_offload_item {\n+    struct dp_netdev_pmd_thread *pmd;\n+    odp_port_t in_port;\n+    struct dp_netdev_flow *flow;\n+    ovs_u128 ufid;\n+    int op;\n+    struct match match;\n+    struct nlattr *actions;\n+    size_t actions_len;\n+    int rxq;\n+    uint32_t flow_mark;\n+\n+    struct ovs_list node;\n+};\n+\n+struct dp_flow_offload {\n+    struct ovs_mutex mutex;\n+    struct ovs_list list;\n+    pthread_cond_t cond;\n+};\n+\n+static struct dp_flow_offload dp_flow_offload = {\n+    .mutex = OVS_MUTEX_INITIALIZER,\n+    .list  = OVS_LIST_INITIALIZER(&dp_flow_offload.list),\n+};\n+\n+static struct ovsthread_once offload_thread_once\n+    = OVSTHREAD_ONCE_INITIALIZER;\n+\n+enum {\n+    DP_NETDEV_FLOW_OFFLOAD_OP_ADD,\n+    DP_NETDEV_FLOW_OFFLOAD_OP_MOD,\n+    DP_NETDEV_FLOW_OFFLOAD_OP_DEL,\n+};\n+\n+static struct dp_flow_offload_item *\n+dp_netdev_alloc_flow_offload(struct dp_netdev_pmd_thread *pmd,\n+                                  struct dp_netdev_flow *flow,\n+                                  odp_port_t in_port, const ovs_u128 *ufid,\n+                                  int op)\n+{\n+    struct dp_flow_offload_item *offload;\n+\n+    offload = xzalloc(sizeof(*offload));\n+    offload->pmd = pmd;\n+    offload->flow = flow;\n+    offload->in_port = in_port;\n+    offload->ufid = *ufid;\n+    offload->op = op;\n+\n+    ovs_refcount_ref(&pmd->ref_cnt);\n+    ovs_refcount_ref(&flow->ref_cnt);\n+\n+    return offload;\n+}\n+\n+static void\n+dp_netdev_free_flow_offload(struct dp_flow_offload_item *offload)\n+{\n+    ovs_refcount_unref(&offload->pmd->ref_cnt);\n+    ovs_refcount_unref(&offload->flow->ref_cnt);\n+\n+    free(offload->actions);\n+    free(offload);\n+}\n+\n+static void\n+dp_netdev_append_flow_offload(struct dp_flow_offload_item *offload)\n+{\n+    ovs_mutex_lock(&dp_flow_offload.mutex);\n+    ovs_list_push_back(&dp_flow_offload.list, &offload->node);\n+    ovs_mutex_unlock(&dp_flow_offload.mutex);\n+\n+    pthread_cond_signal(&dp_flow_offload.cond);\n+}\n+\n+static int\n+dp_netdev_flow_offload_del(struct dp_flow_offload_item *offload)\n+{\n+    struct dp_netdev_flow *flow = offload->flow;\n+    struct dp_netdev_port *port;\n+    int ret = -1;\n+\n+    ovs_mutex_lock(&offload->pmd->flow_mutex);\n+    port = dp_netdev_lookup_port(offload->pmd->dp, offload->in_port);\n+    if (flow->has_mark && port) {\n+        ret = netdev_flow_del(port->netdev, &offload->ufid, NULL);\n+    }\n+\n+    dp_netdev_remove_flow_mark_map(flow->mark);\n+    ovsrcu_quiesce_start();\n+    flow->has_mark = false;\n+    ovs_mutex_unlock(&offload->pmd->flow_mutex);\n+\n+    return ret;\n+}\n+\n+static int\n+dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload)\n+{\n+    struct dp_netdev_port *port;\n+    struct dp_netdev_flow *flow = offload->flow;\n+    bool create = offload->op == DP_NETDEV_FLOW_OFFLOAD_OP_ADD;\n+    struct offload_info info;\n+    int ret;\n+\n+    port = dp_netdev_lookup_port(offload->pmd->dp, offload->in_port);\n+    if (!port) {\n+        return -1;\n+    }\n+\n+    if (create) {\n+        if (!dp_netdev_alloc_flow_mark(&info.flow_mark)) {\n+            VLOG_ERR(\"failed to allocate flow mark!\\n\");\n+            return -1;\n+        }\n+        offload->flow_mark = info.flow_mark;\n+    } else {\n+        info.flow_mark = offload->flow_mark;\n+    }\n+    info.rxq = offload->rxq;\n+\n+    ret = netdev_flow_put(port->netdev, &offload->match,\n+                          offload->actions, offload->actions_len,\n+                          &offload->ufid, &info, NULL);\n+    if (ret) {\n+        if (create) {\n+            dp_netdev_remove_flow_mark_map(info.flow_mark);\n+        }\n+        return ret;\n+    }\n+\n+    ovs_mutex_lock(&offload->pmd->flow_mutex);\n+    if (create) {\n+        flow->has_mark = true;\n+        flow->mark = info.flow_mark;\n+        if (!flow->dead) {\n+            /*\n+             * A flow could have been dead after we regain the lock,\n+             * while the flow has offloaded to the netdev. When that\n+             * happens, there should be an offload item in the offload\n+             * list for the flow removal. To make sure the flow will\n+             * be deleted successfully later, above 2 fields (has_mark\n+             * and mark) have to be set properly.\n+             */\n+            dp_netdev_install_flow_mark_map(flow->mark, flow);\n+            ovsrcu_quiesce_start();\n+        }\n+    }\n+    ovs_mutex_unlock(&offload->pmd->flow_mutex);\n+\n+    return 0;\n+}\n+\n+static void *\n+dp_netdev_flow_offload_main(void *data OVS_UNUSED)\n+{\n+    struct dp_flow_offload_item *offload;\n+    struct ovs_list *list;\n+    const char *op;\n+    int ret;\n+\n+    for (;;) {\n+        ovs_mutex_lock(&dp_flow_offload.mutex);\n+        if (ovs_list_is_empty(&dp_flow_offload.list)) {\n+            pthread_cond_wait(&dp_flow_offload.cond,\n+                              &dp_flow_offload.mutex.lock);\n+        }\n+        list = ovs_list_pop_front(&dp_flow_offload.list);\n+        offload = CONTAINER_OF(list, struct dp_flow_offload_item, node);\n+        ovs_mutex_unlock(&dp_flow_offload.mutex);\n+\n+        switch (offload->op) {\n+        case DP_NETDEV_FLOW_OFFLOAD_OP_ADD:\n+            op = \"install\";\n+            ret = dp_netdev_flow_offload_put(offload);\n+            break;\n+        case DP_NETDEV_FLOW_OFFLOAD_OP_MOD:\n+            op = \"modify\";\n+            ret = dp_netdev_flow_offload_put(offload);\n+            break;\n+        case DP_NETDEV_FLOW_OFFLOAD_OP_DEL:\n+            op = \"delete\";\n+            ret = dp_netdev_flow_offload_del(offload);\n+            break;\n+        default:\n+            OVS_NOT_REACHED();\n+        }\n+\n+        VLOG_INFO(\"%s to %s netdev flow with mark %u\\n\",\n+                  ret == 0 ? \"succeed\" : \"failed\",\n+                  op, offload->flow_mark);\n+        dp_netdev_free_flow_offload(offload);\n+    }\n+\n+    return NULL;\n+}\n+\n+static void\n+queue_netdev_flow_del(struct dp_netdev_pmd_thread *pmd,\n+                      struct dp_netdev_flow *flow,\n+                      odp_port_t in_port, const ovs_u128 *ufid,\n+                      int op)\n+{\n+    struct dp_flow_offload_item *offload;\n+\n+    if (ovsthread_once_start(&offload_thread_once)) {\n+        pthread_cond_init(&dp_flow_offload.cond, NULL);\n+        ovs_thread_create(\"dp_netdev_flow_offload\",\n+                          dp_netdev_flow_offload_main, NULL);\n+        ovsthread_once_done(&offload_thread_once);\n+    }\n+\n+    offload = dp_netdev_alloc_flow_offload(pmd, flow, in_port, ufid, op);\n+    offload->flow_mark = flow->mark;\n+    dp_netdev_append_flow_offload(offload);\n+}\n \n static void\n dp_netdev_pmd_remove_flow(struct dp_netdev_pmd_thread *pmd,\n@@ -1963,16 +2180,8 @@ dp_netdev_pmd_remove_flow(struct dp_netdev_pmd_thread *pmd,\n     ovs_assert(cls != NULL);\n     dpcls_remove(cls, &flow->cr);\n     cmap_remove(&pmd->flow_table, node, dp_netdev_flow_hash(&flow->ufid));\n-    if (flow->has_mark) {\n-        struct dp_netdev_port *port;\n-\n-        port = dp_netdev_lookup_port(pmd->dp, in_port);\n-        if (port) {\n-            netdev_flow_del(port->netdev, &flow->ufid, NULL);\n-        }\n-        dp_netdev_remove_flow_mark_map(flow->mark);\n-        flow->has_mark = false;\n-    }\n+    queue_netdev_flow_del(pmd, flow, in_port, &flow->ufid,\n+                          DP_NETDEV_FLOW_OFFLOAD_OP_DEL);\n     flow->dead = true;\n \n     dp_netdev_flow_unref(flow);\n@@ -2553,53 +2762,41 @@ out:\n }\n \n static void\n-try_netdev_flow_put(struct dp_netdev_pmd_thread *pmd, odp_port_t in_port,\n-                    struct dp_netdev_flow *flow, struct match *match,\n-                    const ovs_u128 *ufid, const struct nlattr *actions,\n-                    size_t actions_len, int rxq)\n+queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd, odp_port_t in_port,\n+                      struct dp_netdev_flow *flow, struct match *match,\n+                      const ovs_u128 *ufid, const struct nlattr *actions,\n+                      size_t actions_len, int rxq)\n {\n-    struct offload_info info;\n-    struct dp_netdev_port *port;\n-    bool modification = flow->has_mark;\n-    const char *op = modification ? \"modify\" : \"install\";\n-    int ret;\n+    struct dp_flow_offload_item *offload;\n+    int op;\n \n-    port = dp_netdev_lookup_port(pmd->dp, in_port);\n-    if (!port) {\n+    if (!netdev_is_flow_api_enabled()) {\n         return;\n     }\n-    info.rxq = rxq;\n-\n-    if (modification) {\n-        info.flow_mark = flow->mark;\n-    } else {\n-        if (!netdev_is_flow_api_enabled()) {\n-            return;\n-        }\n-\n-        if (!dp_netdev_alloc_flow_mark(&info.flow_mark)) {\n-            VLOG_ERR(\"failed to allocate flow mark!\\n\");\n-            return;\n-        }\n-    }\n \n-    ret = netdev_flow_put(port->netdev, match,\n-                          CONST_CAST(struct nlattr *, actions),\n-                          actions_len, ufid, &info, NULL);\n-    if (ret) {\n-        VLOG_ERR(\"failed to %s netdev flow with mark %u\\n\",\n-                 op, info.flow_mark);\n-        return;\n+    if (ovsthread_once_start(&offload_thread_once)) {\n+        pthread_cond_init(&dp_flow_offload.cond, NULL);\n+        ovs_thread_create(\"dp_netdev_flow_offload\",\n+                          dp_netdev_flow_offload_main, NULL);\n+        ovsthread_once_done(&offload_thread_once);\n     }\n \n-    if (!modification) {\n-        flow->has_mark = true;\n-        flow->mark = info.flow_mark;\n-        dp_netdev_install_flow_mark_map(info.flow_mark, flow);\n+    if (flow->has_mark) {\n+        op = DP_NETDEV_FLOW_OFFLOAD_OP_MOD;\n+    } else {\n+        op = DP_NETDEV_FLOW_OFFLOAD_OP_ADD;\n+    }\n+    offload = dp_netdev_alloc_flow_offload(pmd, flow, in_port, ufid, op);\n+    offload->match = *match;\n+    offload->rxq = rxq;\n+    offload->actions = xmalloc(actions_len);\n+    memcpy(offload->actions, actions, actions_len);\n+    offload->actions_len = actions_len;\n+    if (flow->has_mark) {\n+        offload->flow_mark = flow->mark;\n     }\n \n-    VLOG_INFO(\"succeed to %s netdev flow with mark %u\\n\",\n-              op, flow->mark);\n+    dp_netdev_append_flow_offload(offload);\n }\n \n static struct dp_netdev_flow *\n@@ -2654,8 +2851,8 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,\n     cmap_insert(&pmd->flow_table, CONST_CAST(struct cmap_node *, &flow->node),\n                 dp_netdev_flow_hash(&flow->ufid));\n \n-    try_netdev_flow_put(pmd, in_port, flow, match, ufid,\n-                        actions, actions_len, rxq);\n+    queue_netdev_flow_put(pmd, in_port, flow, match, ufid,\n+                          actions, actions_len, rxq);\n \n     if (OVS_UNLIKELY(!VLOG_DROP_DBG((&upcall_rl)))) {\n         struct ds ds = DS_EMPTY_INITIALIZER;\n@@ -2745,8 +2942,8 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd,\n             old_actions = dp_netdev_flow_get_actions(netdev_flow);\n             ovsrcu_set(&netdev_flow->actions, new_actions);\n \n-            try_netdev_flow_put(pmd, in_port, netdev_flow, match, ufid,\n-                                put->actions, put->actions_len, -1);\n+            queue_netdev_flow_put(pmd, in_port, netdev_flow, match, ufid,\n+                                  put->actions, put->actions_len, -1);\n \n             if (stats) {\n                 get_dpif_flow_stats(netdev_flow, stats);\n",
    "prefixes": [
        "ovs-dev",
        "v3",
        "9/9"
    ]
}