get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 44299,
    "url": "https://patches.dpdk.org/api/patches/44299/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1536138818-12342-1-git-send-email-arybchenko@solarflare.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": "<1536138818-12342-1-git-send-email-arybchenko@solarflare.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1536138818-12342-1-git-send-email-arybchenko@solarflare.com",
    "date": "2018-09-05T09:13:37",
    "name": "[1/2] net/bonding: provide default Rx/Tx configuration",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "831875f878eca8ac574fc4b14efcb8e2e4699f18",
    "submitter": {
        "id": 607,
        "url": "https://patches.dpdk.org/api/people/607/?format=api",
        "name": "Andrew Rybchenko",
        "email": "arybchenko@solarflare.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1536138818-12342-1-git-send-email-arybchenko@solarflare.com/mbox/",
    "series": [
        {
            "id": 1186,
            "url": "https://patches.dpdk.org/api/series/1186/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=1186",
            "date": "2018-09-05T09:13:38",
            "name": "[1/2] net/bonding: provide default Rx/Tx configuration",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/1186/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/44299/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/44299/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 72F7C326D;\n\tWed,  5 Sep 2018 11:14:10 +0200 (CEST)",
            "from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com\n\t[67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 5C7F02C4F\n\tfor <dev@dpdk.org>; Wed,  5 Sep 2018 11:14:08 +0200 (CEST)",
            "from webmail.solarflare.com (webmail.solarflare.com\n\t[12.187.104.26])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby mx1-us1.ppe-hosted.com (Proofpoint Essentials ESMTP Server) with\n\tESMTPS id 4A23A14005D; Wed,  5 Sep 2018 09:14:07 +0000 (UTC)",
            "from ocex03.SolarFlarecom.com (10.20.40.36) by\n\tocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server\n\t(TLS) id 15.0.1395.4; Wed, 5 Sep 2018 02:14:04 -0700",
            "from opal.uk.solarflarecom.com (10.17.10.1) by\n\tocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server\n\t(TLS) id\n\t15.0.1395.4 via Frontend Transport; Wed, 5 Sep 2018 02:14:04 -0700",
            "from ukv-loginhost.uk.solarflarecom.com\n\t(ukv-loginhost.uk.solarflarecom.com [10.17.10.39])\n\tby opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id\n\tw859E2Yt020156; Wed, 5 Sep 2018 10:14:02 +0100",
            "from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1])\n\tby ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id\n\tABB981626D1; Wed,  5 Sep 2018 10:14:02 +0100 (BST)"
        ],
        "X-Virus-Scanned": "Proofpoint Essentials engine",
        "From": "Andrew Rybchenko <arybchenko@solarflare.com>",
        "To": "Declan Doherty <declan.doherty@intel.com>, Chas Williams <chas3@att.com>",
        "CC": "<dev@dpdk.org>, Ivan Malov <ivan.malov@oktetlabs.ru>",
        "Date": "Wed, 5 Sep 2018 10:13:37 +0100",
        "Message-ID": "<1536138818-12342-1-git-send-email-arybchenko@solarflare.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-TM-AS-Product-Ver": "SMEX-12.5.0.1300-8.5.1010-24074.004",
        "X-TM-AS-Result": "No-10.850300-4.000000-10",
        "X-TMASE-MatchedRID": "NBo8rD77vi3yTBeqcpWTVkf49ONH0RaS1KoSW5Ji1Xtb8pv4L0h+IvLP\n\t5d9AyIkeAxAMNKkH4HEQshaw/wpmRptrN4GYJt6esyNb+yeIRAq4vBuE2X0Hlclgi/vLS272kKb\n\tVKhmQLFM1C2f8ND2KYOKOmN63egZIkKjL2IOi2LA49w4rSKMAfYfsPVs/8Vw64+jrr9da6v/7ef\n\tlM5Fbki5hCiXW+u8UrpqAckONivx6J+w2BcN2shn84FZpy/6JVCI3p+Ju8mqoUl9bvAS7WQCH1W\n\tqUsPIUnmZM6T9wsGgflgKBq27tSmx2MHJ6MfMgPfxzygoxuBhgxmbT6wQT2a7uqk4cq52pzeD2Z\n\t5cF1MACYcTpdT5CyY7nsDuawR3R+HxPMjOKY7A8LbigRnpKlKSPzRlrdFGDwqQBTYEauJpyZrW8\n\tdYGc8fp1dVAV7EoK07X9hqQ1o8gJHeYYpK3H9Kw==",
        "X-TM-AS-User-Approved-Sender": "No",
        "X-TM-AS-User-Blocked-Sender": "No",
        "X-TMASE-Result": "10--10.850300-4.000000",
        "X-TMASE-Version": "SMEX-12.5.0.1300-8.5.1010-24074.004",
        "X-MDID": "1536138848-6rkUH59k4QRw",
        "Subject": "[dpdk-dev] [PATCH 1/2] net/bonding: provide default Rx/Tx\n\tconfiguration",
        "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: Ivan Malov <ivan.malov@oktetlabs.ru>\n\nDefault Rx/Tx configuration has become a helpful\nresource for applications relying on the optimal\nvalues to make rte_eth_rxconf and rte_eth_txconf\nstructures. These structures can then be tweaked.\n\nDefault configuration is also used internally by\nrte_eth_rx_queue_setup or rte_eth_tx_queue_setup\nAPI calls when NULL pointer is passed by callers\nwith the argument for custom queue configuration.\n\nThe use cases of bonding driver may also benefit\nfrom exercising default settings in the same way.\n\nRestructure the code to collect various settings\nfrom slave ports and make it possible to combine\ndefault Rx/Tx configuration of these devices and\nreport it to the callers of rte_eth_dev_info_get.\n\nSigned-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>\nSigned-off-by: Andrew Rybchenko <arybchenko@solarflare.com>\n---\n drivers/net/bonding/rte_eth_bond_api.c     | 161 +++++++++++++++++----\n drivers/net/bonding/rte_eth_bond_pmd.c     |  10 ++\n drivers/net/bonding/rte_eth_bond_private.h |   3 +\n 3 files changed, 147 insertions(+), 27 deletions(-)",
    "diff": "diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c\nindex 8bc04cfd1..206a5c797 100644\n--- a/drivers/net/bonding/rte_eth_bond_api.c\n+++ b/drivers/net/bonding/rte_eth_bond_api.c\n@@ -269,6 +269,136 @@ slave_rte_flow_prepare(uint16_t slave_id, struct bond_dev_private *internals)\n \treturn 0;\n }\n \n+static void\n+eth_bond_slave_inherit_dev_info_rx_first(struct bond_dev_private *internals,\n+\t\t\t\t\t const struct rte_eth_dev_info *di)\n+{\n+\tstruct rte_eth_rxconf *rxconf_i = &internals->default_rxconf;\n+\n+\tinternals->reta_size = di->reta_size;\n+\n+\t/* Inherit Rx offload capabilities from the first slave device */\n+\tinternals->rx_offload_capa = di->rx_offload_capa;\n+\tinternals->rx_queue_offload_capa = di->rx_queue_offload_capa;\n+\tinternals->flow_type_rss_offloads = di->flow_type_rss_offloads;\n+\n+\t/* Inherit maximum Rx packet size from the first slave device */\n+\tinternals->candidate_max_rx_pktlen = di->max_rx_pktlen;\n+\n+\t/* Inherit default Rx queue settings from the first slave device */\n+\tmemcpy(rxconf_i, &di->default_rxconf, sizeof(*rxconf_i));\n+\n+\t/*\n+\t * Turn off descriptor prefetch and writeback by default for all\n+\t * slave devices. Applications may tweak this setting if need be.\n+\t */\n+\trxconf_i->rx_thresh.pthresh = 0;\n+\trxconf_i->rx_thresh.hthresh = 0;\n+\trxconf_i->rx_thresh.wthresh = 0;\n+\n+\t/* Setting this to zero should effectively enable default values */\n+\trxconf_i->rx_free_thresh = 0;\n+\n+\t/* Disable deferred start by default for all slave devices */\n+\trxconf_i->rx_deferred_start = 0;\n+}\n+\n+static void\n+eth_bond_slave_inherit_dev_info_tx_first(struct bond_dev_private *internals,\n+\t\t\t\t\t const struct rte_eth_dev_info *di)\n+{\n+\tstruct rte_eth_txconf *txconf_i = &internals->default_txconf;\n+\n+\t/* Inherit Tx offload capabilities from the first slave device */\n+\tinternals->tx_offload_capa = di->tx_offload_capa;\n+\tinternals->tx_queue_offload_capa = di->tx_queue_offload_capa;\n+\n+\t/* Inherit default Tx queue settings from the first slave device */\n+\tmemcpy(txconf_i, &di->default_txconf, sizeof(*txconf_i));\n+\n+\t/*\n+\t * Turn off descriptor prefetch and writeback by default for all\n+\t * slave devices. Applications may tweak this setting if need be.\n+\t */\n+\ttxconf_i->tx_thresh.pthresh = 0;\n+\ttxconf_i->tx_thresh.hthresh = 0;\n+\ttxconf_i->tx_thresh.wthresh = 0;\n+\n+\t/*\n+\t * Setting these parameters to zero assumes that default\n+\t * values will be configured implicitly by slave devices.\n+\t */\n+\ttxconf_i->tx_free_thresh = 0;\n+\ttxconf_i->tx_rs_thresh = 0;\n+\n+\t/* Disable deferred start by default for all slave devices */\n+\ttxconf_i->tx_deferred_start = 0;\n+}\n+\n+static void\n+eth_bond_slave_inherit_dev_info_rx_next(struct bond_dev_private *internals,\n+\t\t\t\t\tconst struct rte_eth_dev_info *di)\n+{\n+\tstruct rte_eth_rxconf *rxconf_i = &internals->default_rxconf;\n+\tconst struct rte_eth_rxconf *rxconf = &di->default_rxconf;\n+\n+\tinternals->rx_offload_capa &= di->rx_offload_capa;\n+\tinternals->rx_queue_offload_capa &= di->rx_queue_offload_capa;\n+\tinternals->flow_type_rss_offloads &= di->flow_type_rss_offloads;\n+\n+\t/*\n+\t * If at least one slave device suggests enabling this\n+\t * setting by default, enable it for all slave devices\n+\t * since disabling it may not be necessarily supported.\n+\t */\n+\tif (rxconf->rx_drop_en == 1)\n+\t\trxconf_i->rx_drop_en = 1;\n+\n+\t/*\n+\t * Adding a new slave device may cause some of previously inherited\n+\t * offloads to be withdrawn from the internal rx_queue_offload_capa\n+\t * value. Thus, the new internal value of default Rx queue offloads\n+\t * has to be masked by rx_queue_offload_capa to make sure that only\n+\t * commonly supported offloads are preserved from both the previous\n+\t * value and the value being inhereted from the new slave device.\n+\t */\n+\trxconf_i->offloads = (rxconf_i->offloads | rxconf->offloads) &\n+\t\t\t     internals->rx_queue_offload_capa;\n+\n+\t/*\n+\t * RETA size is GCD of all slaves RETA sizes, so, if all sizes will be\n+\t * the power of 2, the lower one is GCD\n+\t */\n+\tif (internals->reta_size > di->reta_size)\n+\t\tinternals->reta_size = di->reta_size;\n+\n+\tif (!internals->max_rx_pktlen &&\n+\t    di->max_rx_pktlen < internals->candidate_max_rx_pktlen)\n+\t\tinternals->candidate_max_rx_pktlen = di->max_rx_pktlen;\n+}\n+\n+static void\n+eth_bond_slave_inherit_dev_info_tx_next(struct bond_dev_private *internals,\n+\t\t\t\t\tconst struct rte_eth_dev_info *di)\n+{\n+\tstruct rte_eth_txconf *txconf_i = &internals->default_txconf;\n+\tconst struct rte_eth_txconf *txconf = &di->default_txconf;\n+\n+\tinternals->tx_offload_capa &= di->tx_offload_capa;\n+\tinternals->tx_queue_offload_capa &= di->tx_queue_offload_capa;\n+\n+\t/*\n+\t * Adding a new slave device may cause some of previously inherited\n+\t * offloads to be withdrawn from the internal tx_queue_offload_capa\n+\t * value. Thus, the new internal value of default Tx queue offloads\n+\t * has to be masked by tx_queue_offload_capa to make sure that only\n+\t * commonly supported offloads are preserved from both the previous\n+\t * value and the value being inhereted from the new slave device.\n+\t */\n+\ttxconf_i->offloads = (txconf_i->offloads | txconf->offloads) &\n+\t\t\t     internals->tx_queue_offload_capa;\n+}\n+\n static int\n __eth_bond_slave_add_lock_free(uint16_t bonded_port_id, uint16_t slave_port_id)\n {\n@@ -326,34 +456,11 @@ __eth_bond_slave_add_lock_free(uint16_t bonded_port_id, uint16_t slave_port_id)\n \t\tinternals->nb_rx_queues = slave_eth_dev->data->nb_rx_queues;\n \t\tinternals->nb_tx_queues = slave_eth_dev->data->nb_tx_queues;\n \n-\t\tinternals->reta_size = dev_info.reta_size;\n-\n-\t\t/* Take the first dev's offload capabilities */\n-\t\tinternals->rx_offload_capa = dev_info.rx_offload_capa;\n-\t\tinternals->tx_offload_capa = dev_info.tx_offload_capa;\n-\t\tinternals->rx_queue_offload_capa = dev_info.rx_queue_offload_capa;\n-\t\tinternals->tx_queue_offload_capa = dev_info.tx_queue_offload_capa;\n-\t\tinternals->flow_type_rss_offloads = dev_info.flow_type_rss_offloads;\n-\n-\t\t/* Inherit first slave's max rx packet size */\n-\t\tinternals->candidate_max_rx_pktlen = dev_info.max_rx_pktlen;\n-\n+\t\teth_bond_slave_inherit_dev_info_rx_first(internals, &dev_info);\n+\t\teth_bond_slave_inherit_dev_info_tx_first(internals, &dev_info);\n \t} else {\n-\t\tinternals->rx_offload_capa &= dev_info.rx_offload_capa;\n-\t\tinternals->tx_offload_capa &= dev_info.tx_offload_capa;\n-\t\tinternals->rx_queue_offload_capa &= dev_info.rx_queue_offload_capa;\n-\t\tinternals->tx_queue_offload_capa &= dev_info.tx_queue_offload_capa;\n-\t\tinternals->flow_type_rss_offloads &= dev_info.flow_type_rss_offloads;\n-\n-\t\t/* RETA size is GCD of all slaves RETA sizes, so, if all sizes will be\n-\t\t * the power of 2, the lower one is GCD\n-\t\t */\n-\t\tif (internals->reta_size > dev_info.reta_size)\n-\t\t\tinternals->reta_size = dev_info.reta_size;\n-\n-\t\tif (!internals->max_rx_pktlen &&\n-\t\t    dev_info.max_rx_pktlen < internals->candidate_max_rx_pktlen)\n-\t\t\tinternals->candidate_max_rx_pktlen = dev_info.max_rx_pktlen;\n+\t\teth_bond_slave_inherit_dev_info_rx_next(internals, &dev_info);\n+\t\teth_bond_slave_inherit_dev_info_tx_next(internals, &dev_info);\n \t}\n \n \tbonded_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf &=\ndiff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c\nindex b84f32263..ee24e9658 100644\n--- a/drivers/net/bonding/rte_eth_bond_pmd.c\n+++ b/drivers/net/bonding/rte_eth_bond_pmd.c\n@@ -2234,6 +2234,11 @@ bond_ethdev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n \tdev_info->max_rx_queues = max_nb_rx_queues;\n \tdev_info->max_tx_queues = max_nb_tx_queues;\n \n+\tmemcpy(&dev_info->default_rxconf, &internals->default_rxconf,\n+\t       sizeof(dev_info->default_rxconf));\n+\tmemcpy(&dev_info->default_txconf, &internals->default_txconf,\n+\t       sizeof(dev_info->default_txconf));\n+\n \t/**\n \t * If dedicated hw queues enabled for link bonding device in LACP mode\n \t * then we need to reduce the maximum number of data path queues by 1.\n@@ -3054,6 +3059,11 @@ bond_alloc(struct rte_vdev_device *dev, uint8_t mode)\n \t/* Initially allow to choose any offload type */\n \tinternals->flow_type_rss_offloads = ETH_RSS_PROTO_MASK;\n \n+\tmemset(&internals->default_rxconf, 0,\n+\t       sizeof(internals->default_rxconf));\n+\tmemset(&internals->default_txconf, 0,\n+\t       sizeof(internals->default_txconf));\n+\n \tmemset(internals->active_slaves, 0, sizeof(internals->active_slaves));\n \tmemset(internals->slaves, 0, sizeof(internals->slaves));\n \ndiff --git a/drivers/net/bonding/rte_eth_bond_private.h b/drivers/net/bonding/rte_eth_bond_private.h\nindex 43e0e448d..d12a0ebbe 100644\n--- a/drivers/net/bonding/rte_eth_bond_private.h\n+++ b/drivers/net/bonding/rte_eth_bond_private.h\n@@ -160,6 +160,9 @@ struct bond_dev_private {\n \t/** Bit mask of RSS offloads, the bit offset also means flow type */\n \tuint64_t flow_type_rss_offloads;\n \n+\tstruct rte_eth_rxconf default_rxconf;\t/**< Default RxQ conf. */\n+\tstruct rte_eth_txconf default_txconf;\t/**< Default TxQ conf. */\n+\n \tuint16_t reta_size;\n \tstruct rte_eth_rss_reta_entry64 reta_conf[ETH_RSS_RETA_SIZE_512 /\n \t\t\tRTE_RETA_GROUP_SIZE];\n",
    "prefixes": [
        "1/2"
    ]
}