get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 65964,
    "url": "http://patches.dpdk.org/api/patches/65964/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1582206824-103222-2-git-send-email-suanmingm@mellanox.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1582206824-103222-2-git-send-email-suanmingm@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1582206824-103222-2-git-send-email-suanmingm@mellanox.com",
    "date": "2020-02-20T13:53:43",
    "name": "[v3,1/2] net/mlx5: fix layer flags missing in metadata",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "fe1440d86eb26a831bc00b8e2286c4ea6d7a317a",
    "submitter": {
        "id": 1358,
        "url": "http://patches.dpdk.org/api/people/1358/?format=api",
        "name": "Suanming Mou",
        "email": "suanmingm@mellanox.com"
    },
    "delegate": {
        "id": 3268,
        "url": "http://patches.dpdk.org/api/users/3268/?format=api",
        "username": "rasland",
        "first_name": "Raslan",
        "last_name": "Darawsheh",
        "email": "rasland@nvidia.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1582206824-103222-2-git-send-email-suanmingm@mellanox.com/mbox/",
    "series": [
        {
            "id": 8634,
            "url": "http://patches.dpdk.org/api/series/8634/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=8634",
            "date": "2020-02-20T13:53:42",
            "name": "net/mlx5: copy the item flags from prefix flow",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/8634/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/65964/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/65964/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 843A1A0556;\n\tThu, 20 Feb 2020 14:53:56 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id D8D851BFAD;\n\tThu, 20 Feb 2020 14:53:50 +0100 (CET)",
            "from git-send-mailer.rdmz.labs.mlnx (unknown [37.142.13.130])\n by dpdk.org (Postfix) with ESMTP id 01C231BF98;\n Thu, 20 Feb 2020 14:53:48 +0100 (CET)"
        ],
        "From": "Suanming Mou <suanmingm@mellanox.com>",
        "To": "matan@mellanox.com,\n\tviacheslavo@mellanox.com",
        "Cc": "dev@dpdk.org,\n\trasland@mellanox.com,\n\tstable@dpdk.org",
        "Date": "Thu, 20 Feb 2020 15:53:43 +0200",
        "Message-Id": "<1582206824-103222-2-git-send-email-suanmingm@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1582206824-103222-1-git-send-email-suanmingm@mellanox.com>",
        "References": "<1582122664-54731-1-git-send-email-suanmingm@mellanox.com>\n <1582206824-103222-1-git-send-email-suanmingm@mellanox.com>",
        "Subject": "[dpdk-dev] [PATCH v3 1/2] net/mlx5: fix layer flags missing in\n\tmetadata",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Metadata suffix subflow inherits the RSS needed hash_fields from the\nprefix subflow as the suffix subflow only has the tag match item unable\nto generate the full original hash_fields for RSS action.\n\nUnfortunately, hash_fields will only be generated if flow has RSS action.\nSo it means the prefix flow won't generate the hash_fields as the RSS\naction has been split to the suffix flow.\n\nCopy the layer flags from prefix subflow to suffix subflow to help the\nsuffix subflow to generate the correct hash_fields itself.\n\nFixes: 71e254bc0294 (\"net/mlx5: split Rx flows to provide metadata copy\")\nCc: viacheslavo@mellanox.com\nCc: stable@dpdk.org\n\nSigned-off-by: Suanming Mou <suanmingm@mellanox.com>\nAcked-by: Matan Azrad <matan@mellanox.com>\n---\n drivers/net/mlx5/mlx5_flow.c    | 67 +++++++++++++++++++++++++++++++++++------\n drivers/net/mlx5/mlx5_flow_dv.c |  6 +++-\n 2 files changed, 62 insertions(+), 11 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c\nindex ce5aded..9267858 100644\n--- a/drivers/net/mlx5/mlx5_flow.c\n+++ b/drivers/net/mlx5/mlx5_flow.c\n@@ -2727,6 +2727,43 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n }\n \n /**\n+ *  Get layer flags from the prefix flow.\n+ *\n+ *  Some flows may be split to several subflows, the prefix subflow gets the\n+ *  match items and the suffix sub flow gets the actions.\n+ *  Some actions need the user defined match item flags to get the detail for\n+ *  the action.\n+ *  This function helps the suffix flow to get the item layer flags from prefix\n+ *  subflow.\n+ *\n+ * @param[in] dev_flow\n+ *   Pointer the created preifx subflow.\n+ *\n+ * @return\n+ *   The layers get from prefix subflow.\n+ */\n+static inline uint64_t\n+flow_get_prefix_layer_flags(struct mlx5_flow *dev_flow)\n+{\n+\tuint64_t layers = 0;\n+\n+\t/* If no decap actions, use the layers directly. */\n+\tif (!(dev_flow->actions & MLX5_FLOW_ACTION_DECAP))\n+\t\treturn dev_flow->layers;\n+\t/* Convert L3 layers with decap action. */\n+\tif (dev_flow->layers & MLX5_FLOW_LAYER_INNER_L3_IPV4)\n+\t\tlayers |= MLX5_FLOW_LAYER_OUTER_L3_IPV4;\n+\telse if (dev_flow->layers & MLX5_FLOW_LAYER_INNER_L3_IPV6)\n+\t\tlayers |= MLX5_FLOW_LAYER_OUTER_L3_IPV6;\n+\t/* Convert L4 layers with decap action.  */\n+\tif (dev_flow->layers & MLX5_FLOW_LAYER_INNER_L4_TCP)\n+\t\tlayers |= MLX5_FLOW_LAYER_OUTER_L4_TCP;\n+\telse if (dev_flow->layers & MLX5_FLOW_LAYER_INNER_L4_UDP)\n+\t\tlayers |= MLX5_FLOW_LAYER_OUTER_L4_UDP;\n+\treturn layers;\n+}\n+\n+/**\n  * Get QUEUE/RSS action from the action list.\n  *\n  * @param[in] actions\n@@ -3406,6 +3443,8 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n  *   Parent flow structure pointer.\n  * @param[in, out] sub_flow\n  *   Pointer to return the created subflow, may be NULL.\n+ * @param[in] prefix_layers\n+ *   Prefix subflow layers, may be 0.\n  * @param[in] attr\n  *   Flow rule attributes.\n  * @param[in] items\n@@ -3423,6 +3462,7 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n flow_create_split_inner(struct rte_eth_dev *dev,\n \t\t\tstruct rte_flow *flow,\n \t\t\tstruct mlx5_flow **sub_flow,\n+\t\t\tuint64_t prefix_layers,\n \t\t\tconst struct rte_flow_attr *attr,\n \t\t\tconst struct rte_flow_item items[],\n \t\t\tconst struct rte_flow_action actions[],\n@@ -3437,6 +3477,12 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \tdev_flow->external = external;\n \t/* Subflow object was created, we must include one in the list. */\n \tLIST_INSERT_HEAD(&flow->dev_flows, dev_flow, next);\n+\t/*\n+\t * If dev_flow is as one of the suffix flow, some actions in suffix\n+\t * flow may need some user defined item layer flags.\n+\t */\n+\tif (prefix_layers)\n+\t\tdev_flow->layers = prefix_layers;\n \tif (sub_flow)\n \t\t*sub_flow = dev_flow;\n \treturn flow_drv_translate(dev, dev_flow, attr, items, actions, error);\n@@ -3768,8 +3814,9 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \tif (!config->dv_flow_en ||\n \t    config->dv_xmeta_en == MLX5_XMETA_MODE_LEGACY ||\n \t    !mlx5_flow_ext_mreg_supported(dev))\n-\t\treturn flow_create_split_inner(dev, flow, NULL, attr, items,\n-\t\t\t\t\t       actions, external, error);\n+\t\treturn flow_create_split_inner(dev, flow, NULL, 0,\n+\t\t\t\t\t       attr, items, actions, external,\n+\t\t\t\t\t       error);\n \tactions_n = flow_parse_qrss_action(actions, &qrss);\n \tif (qrss) {\n \t\t/* Exclude hairpin flows from splitting. */\n@@ -3850,9 +3897,9 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \t\t\tgoto exit;\n \t}\n \t/* Add the unmodified original or prefix subflow. */\n-\tret = flow_create_split_inner(dev, flow, &dev_flow, attr, items,\n-\t\t\t\t      ext_actions ? ext_actions : actions,\n-\t\t\t\t      external, error);\n+\tret = flow_create_split_inner(dev, flow, &dev_flow, 0, attr,\n+\t\t\t\t      items, ext_actions ? ext_actions :\n+\t\t\t\t      actions, external, error);\n \tif (ret < 0)\n \t\tgoto exit;\n \tMLX5_ASSERT(dev_flow);\n@@ -3886,7 +3933,7 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \t\t\t\t.type = RTE_FLOW_ACTION_TYPE_END,\n \t\t\t},\n \t\t};\n-\t\tuint64_t hash_fields = dev_flow->hash_fields;\n+\t\tuint64_t layers = flow_get_prefix_layer_flags(dev_flow);\n \n \t\t/*\n \t\t * Configure the tag item only if there is no meter subflow.\n@@ -3913,14 +3960,13 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \t\t}\n \t\tdev_flow = NULL;\n \t\t/* Add suffix subflow to execute Q/RSS. */\n-\t\tret = flow_create_split_inner(dev, flow, &dev_flow,\n+\t\tret = flow_create_split_inner(dev, flow, &dev_flow, layers,\n \t\t\t\t\t      &q_attr, mtr_sfx ? items :\n \t\t\t\t\t      q_items, q_actions,\n \t\t\t\t\t      external, error);\n \t\tif (ret < 0)\n \t\t\tgoto exit;\n \t\tMLX5_ASSERT(dev_flow);\n-\t\tdev_flow->hash_fields = hash_fields;\n \t}\n \n exit:\n@@ -4009,8 +4055,9 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \t\t\tgoto exit;\n \t\t}\n \t\t/* Add the prefix subflow. */\n-\t\tret = flow_create_split_inner(dev, flow, &dev_flow, attr, items,\n-\t\t\t\t\t\t  pre_actions, external, error);\n+\t\tret = flow_create_split_inner(dev, flow, &dev_flow, 0, attr,\n+\t\t\t\t\t      items, pre_actions, external,\n+\t\t\t\t\t      error);\n \t\tif (ret) {\n \t\t\tret = -rte_errno;\n \t\t\tgoto exit;\ndiff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c\nindex b6e50b1..19f5b61 100644\n--- a/drivers/net/mlx5/mlx5_flow_dv.c\n+++ b/drivers/net/mlx5/mlx5_flow_dv.c\n@@ -7813,7 +7813,11 @@ struct field_modify_info modify_tcp[] = {\n \tMLX5_ASSERT(!flow_dv_check_valid_spec(matcher.mask.buf,\n \t\t\t\t\t      dev_flow->dv.value.buf));\n #endif\n-\tdev_flow->layers = item_flags;\n+\t/*\n+\t * Layers may be already initialized from prefix flow if this dev_flow\n+\t * is the suffix flow.\n+\t */\n+\tdev_flow->layers |= item_flags;\n \tif (action_flags & MLX5_FLOW_ACTION_RSS)\n \t\tflow_dv_hashfields_set(dev_flow);\n \t/* Register matcher. */\n",
    "prefixes": [
        "v3",
        "1/2"
    ]
}