get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 56834,
    "url": "https://patches.dpdk.org/api/patches/56834/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1563786795-14027-14-git-send-email-matan@mellanox.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<1563786795-14027-14-git-send-email-matan@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1563786795-14027-14-git-send-email-matan@mellanox.com",
    "date": "2019-07-22T09:13:00",
    "name": "[13/28] net/mlx5: allocate door-bells using new API",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "b35edc4b1806cdc611bf671f699d56fbaa478ffd",
    "submitter": {
        "id": 796,
        "url": "https://patches.dpdk.org/api/people/796/?format=api",
        "name": "Matan Azrad",
        "email": "matan@mellanox.com"
    },
    "delegate": {
        "id": 3268,
        "url": "https://patches.dpdk.org/api/users/3268/?format=api",
        "username": "rasland",
        "first_name": "Raslan",
        "last_name": "Darawsheh",
        "email": "rasland@nvidia.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1563786795-14027-14-git-send-email-matan@mellanox.com/mbox/",
    "series": [
        {
            "id": 5639,
            "url": "https://patches.dpdk.org/api/series/5639/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=5639",
            "date": "2019-07-22T09:12:48",
            "name": "net/mlx5: support LRO",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/5639/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/56834/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/56834/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id E72021BE25;\n\tMon, 22 Jul 2019 11:13:48 +0200 (CEST)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n\tby dpdk.org (Postfix) with ESMTP id 999F51BDF4\n\tfor <dev@dpdk.org>; Mon, 22 Jul 2019 11:13:29 +0200 (CEST)",
            "from Internal Mail-Server by MTLPINE2 (envelope-from\n\tmatan@mellanox.com)\n\twith ESMTPS (AES256-SHA encrypted); 22 Jul 2019 12:13:23 +0300",
            "from pegasus07.mtr.labs.mlnx (pegasus07.mtr.labs.mlnx\n\t[10.210.16.112])\n\tby labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x6M9DMjc010084;\n\tMon, 22 Jul 2019 12:13:23 +0300"
        ],
        "From": "Matan Azrad <matan@mellanox.com>",
        "To": "Shahaf Shuler <shahafs@mellanox.com>, Yongseok Koh <yskoh@mellanox.com>, \n\tViacheslav Ovsiienko <viacheslavo@mellanox.com>",
        "Cc": "dev@dpdk.org, Dekel Peled <dekelp@mellanox.com>",
        "Date": "Mon, 22 Jul 2019 09:13:00 +0000",
        "Message-Id": "<1563786795-14027-14-git-send-email-matan@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1563786795-14027-1-git-send-email-matan@mellanox.com>",
        "References": "<1563786795-14027-1-git-send-email-matan@mellanox.com>",
        "Subject": "[dpdk-dev] [PATCH 13/28] net/mlx5: allocate door-bells using new API",
        "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\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Dekel Peled <dekelp@mellanox.com>\n\nWhen using DevX API, memory for door-bell records should be allocated\nby PMD and registered using DevX API.\n\nThis patch implements the utility functions to support it:\n- Add struct mlx5_devx_dbr_page, containing door-bells page data.\n- Add list of struct mlx5_devx_dbr_page door-bell pages to device\n  private data.\n- Implement function mlx5_alloc_dbr_page() to allocate page for\n  door-bell records, and register it using DevX API.\n- Implement function mlx5_get_dbr(). to acquire a door-bell record\n  from the door-bells page, allocating a new page if needed.\n- Implement function mlx5_release_dbr() to release a door-bell\n  record that is no longer needed, freeing the containing page if\n  it becomes empty.\n\nSigned-off-by: Dekel Peled <dekelp@mellanox.com>\nAcked-by: Matan Azrad <matan@mellanox.com>\n---\n drivers/net/mlx5/mlx5.c      | 119 +++++++++++++++++++++++++++++++++++++++++++\n drivers/net/mlx5/mlx5.h      |  21 ++++++++\n drivers/net/mlx5/mlx5_rxtx.h |   1 +\n 3 files changed, 141 insertions(+)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c\nindex 8d0ebeb..6b878da 100644\n--- a/drivers/net/mlx5/mlx5.c\n+++ b/drivers/net/mlx5/mlx5.c\n@@ -1312,6 +1312,125 @@ struct mlx5_dev_spawn_data {\n }\n \n /**\n+ * Allocate page of door-bells and register it using DevX API.\n+ *\n+ * @param [in] dev\n+ *   Pointer to Ethernet device.\n+ *\n+ * @return\n+ *   Pointer to new page on success, NULL otherwise.\n+ */\n+static struct mlx5_devx_dbr_page *\n+mlx5_alloc_dbr_page(struct rte_eth_dev *dev)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_devx_dbr_page *page;\n+\n+\t/* Allocate space for door-bell page and management data. */\n+\tpage = rte_calloc_socket(__func__, 1, sizeof(struct mlx5_devx_dbr_page),\n+\t\t\t\t RTE_CACHE_LINE_SIZE, dev->device->numa_node);\n+\tif (!page) {\n+\t\tDRV_LOG(ERR, \"port %u cannot allocate dbr page\",\n+\t\t\tdev->data->port_id);\n+\t\treturn NULL;\n+\t}\n+\t/* Register allocated memory. */\n+\tpage->umem = mlx5_glue->devx_umem_reg(priv->sh->ctx, page->dbrs,\n+\t\t\t\t\t      MLX5_DBR_PAGE_SIZE, 0);\n+\tif (!page->umem) {\n+\t\tDRV_LOG(ERR, \"port %u cannot umem reg dbr page\",\n+\t\t\tdev->data->port_id);\n+\t\trte_free(page);\n+\t\treturn NULL;\n+\t}\n+\treturn page;\n+}\n+\n+/**\n+ * Find the next available door-bell, allocate new page if needed.\n+ *\n+ * @param [in] dev\n+ *   Pointer to Ethernet device.\n+ * @param [out] dbr_page\n+ *   Door-bell page containing the page data.\n+ *\n+ * @return\n+ *   Door-bell address offset on success, a negative error value otherwise.\n+ */\n+int64_t\n+mlx5_get_dbr(struct rte_eth_dev *dev, struct mlx5_devx_dbr_page **dbr_page)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_devx_dbr_page *page = NULL;\n+\tuint32_t i, j;\n+\n+\tLIST_FOREACH(page, &priv->dbrpgs, next)\n+\t\tif (page->dbr_count < MLX5_DBR_PER_PAGE)\n+\t\t\tbreak;\n+\tif (!page) { /* No page with free door-bell exists. */\n+\t\tpage = mlx5_alloc_dbr_page(dev);\n+\t\tif (!page) /* Failed to allocate new page. */\n+\t\t\treturn (-1);\n+\t\tLIST_INSERT_HEAD(&priv->dbrpgs, page, next);\n+\t}\n+\t/* Loop to find bitmap part with clear bit. */\n+\tfor (i = 0;\n+\t     i < MLX5_DBR_BITMAP_SIZE && page->dbr_bitmap[i] == UINT64_MAX;\n+\t     i++)\n+\t\t; /* Empty. */\n+\t/* Find the first clear bit. */\n+\tj = rte_bsf64(~page->dbr_bitmap[i]);\n+\tassert(i < (MLX5_DBR_PER_PAGE / 64));\n+\tpage->dbr_bitmap[i] |= (1 << j);\n+\tpage->dbr_count++;\n+\t*dbr_page = page;\n+\treturn (((i * 64) + j) * sizeof(uint64_t));\n+}\n+\n+/**\n+ * Release a door-bell record.\n+ *\n+ * @param [in] dev\n+ *   Pointer to Ethernet device.\n+ * @param [in] umem_id\n+ *   UMEM ID of page containing the door-bell record to release.\n+ * @param [in] offset\n+ *   Offset of door-bell record in page.\n+ *\n+ * @return\n+ *   0 on success, a negative error value otherwise.\n+ */\n+int32_t\n+mlx5_release_dbr(struct rte_eth_dev *dev, uint32_t umem_id, uint64_t offset)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_devx_dbr_page *page = NULL;\n+\tint ret = 0;\n+\n+\tLIST_FOREACH(page, &priv->dbrpgs, next)\n+\t\t/* Find the page this address belongs to. */\n+\t\tif (page->umem->umem_id == umem_id)\n+\t\t\tbreak;\n+\tif (!page)\n+\t\treturn -EINVAL;\n+\tpage->dbr_count--;\n+\tif (!page->dbr_count) {\n+\t\t/* Page not used, free it and remove from list. */\n+\t\tLIST_REMOVE(page, next);\n+\t\tif (page->umem)\n+\t\t\tret = -mlx5_glue->devx_umem_dereg(page->umem);\n+\t\trte_free(page);\n+\t} else {\n+\t\t/* Mark in bitmap that this door-bell is not in use. */\n+\t\tint i = offset / 64;\n+\t\tint j = offset % 64;\n+\n+\t\tpage->dbr_bitmap[i] &= ~(1 << j);\n+\t}\n+\treturn ret;\n+}\n+\n+/**\n  * Spawn an Ethernet device from Verbs information.\n  *\n  * @param dpdk_dev\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 8d72b2d..1543aaf 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -36,6 +36,7 @@\n #include \"mlx5_mr.h\"\n #include \"mlx5_autoconf.h\"\n #include \"mlx5_defs.h\"\n+#include \"mlx5_glue.h\"\n \n enum {\n \tPCI_VENDOR_ID_MELLANOX = 0x15b3,\n@@ -498,6 +499,21 @@ struct mlx5_flow_tbl_resource {\n #define MLX5_MAX_TABLES_FDB 32\n #define MLX5_GROUP_FACTOR 1\n \n+#define MLX5_DBR_PAGE_SIZE 4096 /* Must be >= 512. */\n+#define MLX5_DBR_SIZE 8\n+#define MLX5_DBR_PER_PAGE (MLX5_DBR_PAGE_SIZE / MLX5_DBR_SIZE)\n+#define MLX5_DBR_BITMAP_SIZE (MLX5_DBR_PER_PAGE / 64)\n+\n+struct mlx5_devx_dbr_page {\n+\t/* Door-bell records, must be first member in structure. */\n+\tuint8_t dbrs[MLX5_DBR_PAGE_SIZE];\n+\tLIST_ENTRY(mlx5_devx_dbr_page) next; /* Pointer to the next element. */\n+\tstruct mlx5dv_devx_umem *umem;\n+\tuint32_t dbr_count; /* Number of door-bell records in use. */\n+\t/* 1 bit marks matching door-bell is in use. */\n+\tuint64_t dbr_bitmap[MLX5_DBR_BITMAP_SIZE];\n+};\n+\n /*\n  * Shared Infiniband device context for Master/Representors\n  * which belong to same IB device with multiple IB ports.\n@@ -617,6 +633,7 @@ struct mlx5_priv {\n \tint nl_socket_rdma; /* Netlink socket (NETLINK_RDMA). */\n \tint nl_socket_route; /* Netlink socket (NETLINK_ROUTE). */\n \tuint32_t nl_sn; /* Netlink message sequence number. */\n+\tLIST_HEAD(dbrpage, mlx5_devx_dbr_page) dbrpgs; /* Door-bell pages. */\n #ifndef RTE_ARCH_64\n \trte_spinlock_t uar_lock_cq; /* CQs share a common distinct UAR */\n \trte_spinlock_t uar_lock[MLX5_UAR_PAGE_NUM_MAX];\n@@ -631,6 +648,10 @@ struct mlx5_priv {\n \n int mlx5_getenv_int(const char *);\n int mlx5_proc_priv_init(struct rte_eth_dev *dev);\n+int64_t mlx5_get_dbr(struct rte_eth_dev *dev,\n+\t\t     struct mlx5_devx_dbr_page **dbr_page);\n+int32_t mlx5_release_dbr(struct rte_eth_dev *dev, uint32_t umem_id,\n+\t\t\t uint64_t offset);\n \n /* mlx5_ethdev.c */\n \ndiff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h\nindex 2f688ac..436b453 100644\n--- a/drivers/net/mlx5/mlx5_rxtx.h\n+++ b/drivers/net/mlx5/mlx5_rxtx.h\n@@ -29,6 +29,7 @@\n #include <rte_spinlock.h>\n #include <rte_io.h>\n #include <rte_bus_pci.h>\n+#include <rte_malloc.h>\n \n #include \"mlx5_utils.h\"\n #include \"mlx5.h\"\n",
    "prefixes": [
        "13/28"
    ]
}