get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 101020,
    "url": "http://patches.dpdk.org/api/patches/101020/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20211011123034.3871907-1-andrew.rybchenko@oktetlabs.ru/",
    "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": "<20211011123034.3871907-1-andrew.rybchenko@oktetlabs.ru>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211011123034.3871907-1-andrew.rybchenko@oktetlabs.ru",
    "date": "2021-10-11T12:30:33",
    "name": "[v7] ethdev: fix representor port ID search by name",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "ae098a705f4672bc1f9909703c717d6b5ba729b3",
    "submitter": {
        "id": 2013,
        "url": "http://patches.dpdk.org/api/people/2013/?format=api",
        "name": "Andrew Rybchenko",
        "email": "Andrew.Rybchenko@oktetlabs.ru"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20211011123034.3871907-1-andrew.rybchenko@oktetlabs.ru/mbox/",
    "series": [
        {
            "id": 19517,
            "url": "http://patches.dpdk.org/api/series/19517/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=19517",
            "date": "2021-10-11T12:30:33",
            "name": "[v7] ethdev: fix representor port ID search by name",
            "version": 7,
            "mbox": "http://patches.dpdk.org/series/19517/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/101020/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/101020/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 mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 2C5C9A034F;\n\tMon, 11 Oct 2021 14:30:51 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id B26AF40150;\n\tMon, 11 Oct 2021 14:30:50 +0200 (CEST)",
            "from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113])\n by mails.dpdk.org (Postfix) with ESMTP id EF7C740142\n for <dev@dpdk.org>; Mon, 11 Oct 2021 14:30:48 +0200 (CEST)",
            "by shelob.oktetlabs.ru (Postfix, from userid 122)\n id 8A67F7F6F3; Mon, 11 Oct 2021 15:30:48 +0300 (MSK)",
            "from aros.oktetlabs.ru (aros.oktetlabs.ru [192.168.38.17])\n by shelob.oktetlabs.ru (Postfix) with ESMTP id 5B22E7F514;\n Mon, 11 Oct 2021 15:30:39 +0300 (MSK)"
        ],
        "X-Spam-Checker-Version": "SpamAssassin 3.4.2 (2018-09-13) on shelob.oktetlabs.ru",
        "X-Spam-Level": "",
        "X-Spam-Status": "No, score=0.8 required=5.0 tests=ALL_TRUSTED,\n DKIM_ADSP_DISCARD,\n URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2",
        "DKIM-Filter": "OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 5B22E7F514",
        "Authentication-Results": "shelob.oktetlabs.ru/5B22E7F514; dkim=none;\n dkim-atps=neutral",
        "From": "Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>",
        "To": "Ajit Khaparde <ajit.khaparde@broadcom.com>,\n Somnath Kotur <somnath.kotur@broadcom.com>,\n John Daley <johndale@cisco.com>, Hyong Youb Kim <hyonkim@cisco.com>,\n Beilei Xing <beilei.xing@intel.com>, Qiming Yang <qiming.yang@intel.com>,\n Qi Zhang <qi.z.zhang@intel.com>, Haiyue Wang <haiyue.wang@intel.com>,\n Matan Azrad <matan@nvidia.com>,\n Viacheslav Ovsiienko <viacheslavo@nvidia.com>,\n Thomas Monjalon <thomas@monjalon.net>,\n Ferruh Yigit <ferruh.yigit@intel.com>",
        "Cc": "dev@dpdk.org,\n Viacheslav Galaktionov <viacheslav.galaktionov@oktetlabs.ru>,\n Xueming Li <xuemingl@nvidia.com>",
        "Date": "Mon, 11 Oct 2021 15:30:33 +0300",
        "Message-Id": "<20211011123034.3871907-1-andrew.rybchenko@oktetlabs.ru>",
        "X-Mailer": "git-send-email 2.30.2",
        "In-Reply-To": "<20210712161747.958019-1-andrew.rybchenko@oktetlabs.ru>",
        "References": "<20210712161747.958019-1-andrew.rybchenko@oktetlabs.ru>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v7] ethdev: fix representor port ID search by name",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "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": "From: Viacheslav Galaktionov <viacheslav.galaktionov@oktetlabs.ru>\n\nGetting a list of representors from a representor does not make sense.\nInstead, a parent device should be used.\n\nTo this end, extend the rte_eth_dev_data structure to include the port ID\nof the backing device for representors.\n\nSigned-off-by: Viacheslav Galaktionov <viacheslav.galaktionov@oktetlabs.ru>\nSigned-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>\nAcked-by: Haiyue Wang <haiyue.wang@intel.com>\nAcked-by: Beilei Xing <beilei.xing@intel.com>\nReviewed-by: Xueming Li <xuemingl@nvidia.com>\nAcked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>\n---\nThe new field is added into the hole in rte_eth_dev_data structure.\nThe patch does not change ABI, but extra care is required since ABI\ncheck is disabled for the structure because of the libabigail bug [1].\nIt should not be a problem anyway since 21.11 is a ABI breaking release.\n\nPotentially it is bad for out-of-tree drivers which implement\nrepresentors but do not fill in a new backer_port_id field in\nrte_eth_dev_data structure. Get ID by name will not work.\n\nmlx5 changes should be reviwed by maintainers very carefully, since\nwe are not sure if we patch it correctly.\n\n[1] https://sourceware.org/bugzilla/show_bug.cgi?id=28060\n\nv7:\n    - use dpdk_dev in net/mlx5 as suggested by Viacheslav O.\n\nv6:\n    - provide more information in the changeset description\n\nv5:\n    - try to improve name: backer_port_id instead of parent_port_id\n    - init new field to RTE_MAX_ETHPORTS on allocation to avoid\n      zero port usage by default\n\nv4:\n    - apply mlx5 review notes: remove fallback from generic ethdev\n      code and add fallback to mlx5 code to handle legacy usecase\n\nv3:\n    - fix mlx5 build breakage\n\nv2:\n    - fix mlx5 review notes\n    - try device port ID first before parent in order to address\n      backward compatibility issue\n drivers/net/bnxt/bnxt_reps.c             |  1 +\n drivers/net/enic/enic_vf_representor.c   |  1 +\n drivers/net/i40e/i40e_vf_representor.c   |  1 +\n drivers/net/ice/ice_dcf_vf_representor.c |  1 +\n drivers/net/ixgbe/ixgbe_vf_representor.c |  1 +\n drivers/net/mlx5/linux/mlx5_os.c         | 13 +++++++++++++\n drivers/net/mlx5/windows/mlx5_os.c       | 13 +++++++++++++\n lib/ethdev/ethdev_driver.h               |  6 +++---\n lib/ethdev/rte_class_eth.c               |  2 +-\n lib/ethdev/rte_ethdev.c                  |  9 +++++----\n lib/ethdev/rte_ethdev_core.h             |  6 ++++++\n 11 files changed, 46 insertions(+), 8 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c\nindex df05619c3f..b7e88e013a 100644\n--- a/drivers/net/bnxt/bnxt_reps.c\n+++ b/drivers/net/bnxt/bnxt_reps.c\n@@ -187,6 +187,7 @@ int bnxt_representor_init(struct rte_eth_dev *eth_dev, void *params)\n \teth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR |\n \t\t\t\t\tRTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;\n \teth_dev->data->representor_id = rep_params->vf_id;\n+\teth_dev->data->backer_port_id = rep_params->parent_dev->data->port_id;\n \n \trte_eth_random_addr(vf_rep_bp->dflt_mac_addr);\n \tmemcpy(vf_rep_bp->mac_addr, vf_rep_bp->dflt_mac_addr,\ndiff --git a/drivers/net/enic/enic_vf_representor.c b/drivers/net/enic/enic_vf_representor.c\nindex cfd02c03cc..1a4411844a 100644\n--- a/drivers/net/enic/enic_vf_representor.c\n+++ b/drivers/net/enic/enic_vf_representor.c\n@@ -666,6 +666,7 @@ int enic_vf_representor_init(struct rte_eth_dev *eth_dev, void *init_params)\n \teth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR |\n \t\t\t\t\tRTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;\n \teth_dev->data->representor_id = vf->vf_id;\n+\teth_dev->data->backer_port_id = pf->port_id;\n \teth_dev->data->mac_addrs = rte_zmalloc(\"enic_mac_addr_vf\",\n \t\tsizeof(struct rte_ether_addr) *\n \t\tENIC_UNICAST_PERFECT_FILTERS, 0);\ndiff --git a/drivers/net/i40e/i40e_vf_representor.c b/drivers/net/i40e/i40e_vf_representor.c\nindex 0481b55381..d65b821a01 100644\n--- a/drivers/net/i40e/i40e_vf_representor.c\n+++ b/drivers/net/i40e/i40e_vf_representor.c\n@@ -514,6 +514,7 @@ i40e_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params)\n \tethdev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR |\n \t\t\t\t\tRTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;\n \tethdev->data->representor_id = representor->vf_id;\n+\tethdev->data->backer_port_id = pf->dev_data->port_id;\n \n \t/* Setting the number queues allocated to the VF */\n \tethdev->data->nb_rx_queues = vf->vsi->nb_qps;\ndiff --git a/drivers/net/ice/ice_dcf_vf_representor.c b/drivers/net/ice/ice_dcf_vf_representor.c\nindex b547c42f91..c5335ac3cc 100644\n--- a/drivers/net/ice/ice_dcf_vf_representor.c\n+++ b/drivers/net/ice/ice_dcf_vf_representor.c\n@@ -426,6 +426,7 @@ ice_dcf_vf_repr_init(struct rte_eth_dev *vf_rep_eth_dev, void *init_param)\n \n \tvf_rep_eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;\n \tvf_rep_eth_dev->data->representor_id = repr->vf_id;\n+\tvf_rep_eth_dev->data->backer_port_id = repr->dcf_eth_dev->data->port_id;\n \n \tvf_rep_eth_dev->data->mac_addrs = &repr->mac_addr;\n \ndiff --git a/drivers/net/ixgbe/ixgbe_vf_representor.c b/drivers/net/ixgbe/ixgbe_vf_representor.c\nindex d5b636a194..9fa75984fb 100644\n--- a/drivers/net/ixgbe/ixgbe_vf_representor.c\n+++ b/drivers/net/ixgbe/ixgbe_vf_representor.c\n@@ -197,6 +197,7 @@ ixgbe_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params)\n \n \tethdev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;\n \tethdev->data->representor_id = representor->vf_id;\n+\tethdev->data->backer_port_id = representor->pf_ethdev->data->port_id;\n \n \t/* Set representor device ops */\n \tethdev->dev_ops = &ixgbe_vf_representor_dev_ops;\ndiff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c\nindex 3746057673..3858984f02 100644\n--- a/drivers/net/mlx5/linux/mlx5_os.c\n+++ b/drivers/net/mlx5/linux/mlx5_os.c\n@@ -1677,6 +1677,19 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,\n \tif (priv->representor) {\n \t\teth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;\n \t\teth_dev->data->representor_id = priv->representor_id;\n+\t\tMLX5_ETH_FOREACH_DEV(port_id, dpdk_dev) {\n+\t\t\tstruct mlx5_priv *opriv =\n+\t\t\t\trte_eth_devices[port_id].data->dev_private;\n+\t\t\tif (opriv &&\n+\t\t\t    opriv->master &&\n+\t\t\t    opriv->domain_id == priv->domain_id &&\n+\t\t\t    opriv->sh == priv->sh) {\n+\t\t\t\teth_dev->data->backer_port_id = port_id;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t\tif (port_id >= RTE_MAX_ETHPORTS)\n+\t\t\teth_dev->data->backer_port_id = eth_dev->data->port_id;\n \t}\n \tpriv->mp_id.port_id = eth_dev->data->port_id;\n \tstrlcpy(priv->mp_id.name, MLX5_MP_NAME, RTE_MP_MAX_NAME_LEN);\ndiff --git a/drivers/net/mlx5/windows/mlx5_os.c b/drivers/net/mlx5/windows/mlx5_os.c\nindex 26fa927039..9de8adecf4 100644\n--- a/drivers/net/mlx5/windows/mlx5_os.c\n+++ b/drivers/net/mlx5/windows/mlx5_os.c\n@@ -543,6 +543,19 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,\n \tif (priv->representor) {\n \t\teth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;\n \t\teth_dev->data->representor_id = priv->representor_id;\n+\t\tMLX5_ETH_FOREACH_DEV(port_id, dpdk_dev) {\n+\t\t\tstruct mlx5_priv *opriv =\n+\t\t\t\trte_eth_devices[port_id].data->dev_private;\n+\t\t\tif (opriv &&\n+\t\t\t    opriv->master &&\n+\t\t\t    opriv->domain_id == priv->domain_id &&\n+\t\t\t    opriv->sh == priv->sh) {\n+\t\t\t\teth_dev->data->backer_port_id = port_id;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t\tif (port_id >= RTE_MAX_ETHPORTS)\n+\t\t\teth_dev->data->backer_port_id = eth_dev->data->port_id;\n \t}\n \t/*\n \t * Store associated network device interface index. This index\ndiff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h\nindex 7ce0f7729a..c4ea735732 100644\n--- a/lib/ethdev/ethdev_driver.h\n+++ b/lib/ethdev/ethdev_driver.h\n@@ -1266,8 +1266,8 @@ struct rte_eth_devargs {\n  * For backward compatibility, if no representor info, direct\n  * map legacy VF (no controller and pf).\n  *\n- * @param ethdev\n- *  Handle of ethdev port.\n+ * @param port_id\n+ *  Port ID of the backing device.\n  * @param type\n  *  Representor type.\n  * @param controller\n@@ -1284,7 +1284,7 @@ struct rte_eth_devargs {\n  */\n __rte_internal\n int\n-rte_eth_representor_id_get(const struct rte_eth_dev *ethdev,\n+rte_eth_representor_id_get(uint16_t port_id,\n \t\t\t   enum rte_eth_representor_type type,\n \t\t\t   int controller, int pf, int representor_port,\n \t\t\t   uint16_t *repr_id);\ndiff --git a/lib/ethdev/rte_class_eth.c b/lib/ethdev/rte_class_eth.c\nindex 1fe5fa1f36..eda216ced5 100644\n--- a/lib/ethdev/rte_class_eth.c\n+++ b/lib/ethdev/rte_class_eth.c\n@@ -95,7 +95,7 @@ eth_representor_cmp(const char *key __rte_unused,\n \t\tc = i / (np * nf);\n \t\tp = (i / nf) % np;\n \t\tf = i % nf;\n-\t\tif (rte_eth_representor_id_get(edev,\n+\t\tif (rte_eth_representor_id_get(edev->data->backer_port_id,\n \t\t\teth_da.type,\n \t\t\teth_da.nb_mh_controllers == 0 ? -1 :\n \t\t\t\t\teth_da.mh_controllers[c],\ndiff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c\nindex 028907bc4b..ed7b43a99f 100644\n--- a/lib/ethdev/rte_ethdev.c\n+++ b/lib/ethdev/rte_ethdev.c\n@@ -524,6 +524,7 @@ rte_eth_dev_allocate(const char *name)\n \teth_dev = eth_dev_get(port_id);\n \tstrlcpy(eth_dev->data->name, name, sizeof(eth_dev->data->name));\n \teth_dev->data->port_id = port_id;\n+\teth_dev->data->backer_port_id = RTE_MAX_ETHPORTS;\n \teth_dev->data->mtu = RTE_ETHER_MTU;\n \tpthread_mutex_init(&eth_dev->data->flow_ops_mutex, NULL);\n \n@@ -5915,7 +5916,7 @@ rte_eth_devargs_parse(const char *dargs, struct rte_eth_devargs *eth_da)\n }\n \n int\n-rte_eth_representor_id_get(const struct rte_eth_dev *ethdev,\n+rte_eth_representor_id_get(uint16_t port_id,\n \t\t\t   enum rte_eth_representor_type type,\n \t\t\t   int controller, int pf, int representor_port,\n \t\t\t   uint16_t *repr_id)\n@@ -5931,7 +5932,7 @@ rte_eth_representor_id_get(const struct rte_eth_dev *ethdev,\n \t\treturn -EINVAL;\n \n \t/* Get PMD representor range info. */\n-\tret = rte_eth_representor_info_get(ethdev->data->port_id, NULL);\n+\tret = rte_eth_representor_info_get(port_id, NULL);\n \tif (ret == -ENOTSUP && type == RTE_ETH_REPRESENTOR_VF &&\n \t    controller == -1 && pf == -1) {\n \t\t/* Direct mapping for legacy VF representor. */\n@@ -5946,7 +5947,7 @@ rte_eth_representor_id_get(const struct rte_eth_dev *ethdev,\n \tif (info == NULL)\n \t\treturn -ENOMEM;\n \tinfo->nb_ranges_alloc = n;\n-\tret = rte_eth_representor_info_get(ethdev->data->port_id, info);\n+\tret = rte_eth_representor_info_get(port_id, info);\n \tif (ret < 0)\n \t\tgoto out;\n \n@@ -5965,7 +5966,7 @@ rte_eth_representor_id_get(const struct rte_eth_dev *ethdev,\n \t\t\tcontinue;\n \t\tif (info->ranges[i].id_end < info->ranges[i].id_base) {\n \t\t\tRTE_LOG(WARNING, EAL, \"Port %hu invalid representor ID Range %u - %u, entry %d\\n\",\n-\t\t\t\tethdev->data->port_id, info->ranges[i].id_base,\n+\t\t\t\tport_id, info->ranges[i].id_base,\n \t\t\t\tinfo->ranges[i].id_end, i);\n \t\t\tcontinue;\n \ndiff --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h\nindex d2c9ec42c7..66ad8b13c8 100644\n--- a/lib/ethdev/rte_ethdev_core.h\n+++ b/lib/ethdev/rte_ethdev_core.h\n@@ -185,6 +185,12 @@ struct rte_eth_dev_data {\n \t\t\t/**< Switch-specific identifier.\n \t\t\t *   Valid if RTE_ETH_DEV_REPRESENTOR in dev_flags.\n \t\t\t */\n+\tuint16_t backer_port_id;\n+\t\t\t/**< Port ID of the backing device.\n+\t\t\t *   This device will be used to query representor\n+\t\t\t *   info and calculate representor IDs.\n+\t\t\t *   Valid if RTE_ETH_DEV_REPRESENTOR in dev_flags.\n+\t\t\t */\n \n \tpthread_mutex_t flow_ops_mutex; /**< rte_flow ops mutex. */\n \tuint64_t reserved_64s[4]; /**< Reserved for future fields */\n",
    "prefixes": [
        "v7"
    ]
}