Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/806685/?format=api
{ "id": 806685, "url": "http://patchwork.ozlabs.org/api/patches/806685/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/1503942035-24924-3-git-send-email-michael.chan@broadcom.com/", "project": { "id": 7, "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api", "name": "Linux network development", "link_name": "netdev", "list_id": "netdev.vger.kernel.org", "list_email": "netdev@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<1503942035-24924-3-git-send-email-michael.chan@broadcom.com>", "list_archive_url": null, "date": "2017-08-28T17:40:26", "name": "[net-next,02/11] bnxt_en: Improve tx ring reservation logic.", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "47aeedc1d92943469fc5d2f1dabd1f4ecde28479", "submitter": { "id": 68365, "url": "http://patchwork.ozlabs.org/api/people/68365/?format=api", "name": "Michael Chan", "email": "michael.chan@broadcom.com" }, "delegate": { "id": 34, "url": "http://patchwork.ozlabs.org/api/users/34/?format=api", "username": "davem", "first_name": "David", "last_name": "Miller", "email": "davem@davemloft.net" }, "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/1503942035-24924-3-git-send-email-michael.chan@broadcom.com/mbox/", "series": [ { "id": 225, "url": "http://patchwork.ozlabs.org/api/series/225/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=225", "date": "2017-08-28T17:40:24", "name": "bnxt_en: Updates.", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/225/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/806685/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/806685/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<netdev-owner@vger.kernel.org>", "X-Original-To": "patchwork-incoming@ozlabs.org", "Delivered-To": "patchwork-incoming@ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=broadcom.com header.i=@broadcom.com\n\theader.b=\"hdeBMx4D\"; dkim-atps=neutral" ], "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xgzbb5cJcz9sMN\n\tfor <patchwork-incoming@ozlabs.org>;\n\tTue, 29 Aug 2017 03:41:47 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751788AbdH1Rlp (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tMon, 28 Aug 2017 13:41:45 -0400", "from mail-qk0-f182.google.com ([209.85.220.182]:35561 \"EHLO\n\tmail-qk0-f182.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751357AbdH1Rkv (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Mon, 28 Aug 2017 13:40:51 -0400", "by mail-qk0-f182.google.com with SMTP id p67so5392197qkd.2\n\tfor <netdev@vger.kernel.org>; Mon, 28 Aug 2017 10:40:51 -0700 (PDT)", "from localhost.dhcp.broadcom.net ([192.19.255.250])\n\tby smtp.gmail.com with ESMTPSA id\n\t20sm592006qtu.52.2017.08.28.10.40.49\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tMon, 28 Aug 2017 10:40:50 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=broadcom.com; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=dNjTI9NcE2/aMmkVFZykQ1xKQRpsMdqXeQzJVMq/A8k=;\n\tb=hdeBMx4DRp8M9rhaGtrgJV9SjAgTn7nb1y5pL5ww+FdsYQvt3aLXksx5rDR8LcnlaX\n\t+/jSqktnFDnsZ4h0MgMyx1xvAmTY84UTCQu7luNltClCiYdPTAAkosixeMhhMk6itpo9\n\tddcpiIdTnCpopwXV7xhWW0WjH3ZvcOqniYZzE=", "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=dNjTI9NcE2/aMmkVFZykQ1xKQRpsMdqXeQzJVMq/A8k=;\n\tb=NTE7/8dS01NMU888S0DRL+/8Ixq2y1DjQNcIySLH5jIL6kF5/yGro1K3hnt4SXIaBs\n\tP+U5+WO3b18LQ25GttsypaAoPt951pdYw94cOSBEeNDxIqB5jaOeGo9rTX+LTvZF4+yc\n\tYkFjauHXZ8H1FDnLij366PyjOC73kuDIPQ6nwHFozNw7G3ntDCABTa2Pd4awXbJvkMzH\n\tJfRfW68faWkNngSkt1Jh+XlxaYhTzVLDXiXHc76OSlgILe5YrXpjFi5iUN9LUoVrDsKg\n\tLZ9rMpVi6z6b4TALNAk3pEFdIwin4XeGr68xXGeJv17iTwrzDH0zAZkNZN/uI1GFmuK7\n\tIe3Q==", "X-Gm-Message-State": "AHYfb5jxspnT0wzn/tvap7N40YQ7FdRxap4USx0vLzHbRgXrqzdba/+I\n\tNDKLCkWba5QBqNVw", "X-Received": "by 10.55.163.1 with SMTP id m1mr2009207qke.308.1503942050790;\n\tMon, 28 Aug 2017 10:40:50 -0700 (PDT)", "From": "Michael Chan <michael.chan@broadcom.com>", "To": "davem@davemloft.net", "Cc": "netdev@vger.kernel.org", "Subject": "[PATCH net-next 02/11] bnxt_en: Improve tx ring reservation logic.", "Date": "Mon, 28 Aug 2017 13:40:26 -0400", "Message-Id": "<1503942035-24924-3-git-send-email-michael.chan@broadcom.com>", "X-Mailer": "git-send-email 1.8.3.1", "In-Reply-To": "<1503942035-24924-1-git-send-email-michael.chan@broadcom.com>", "References": "<1503942035-24924-1-git-send-email-michael.chan@broadcom.com>", "Sender": "netdev-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<netdev.vger.kernel.org>", "X-Mailing-List": "netdev@vger.kernel.org" }, "content": "When the number of TX rings is changed (e.g. ethtool -L, enabling XDP TX\nrings, etc), the current code tries to reserve the new number of TX rings\nbefore closing and re-opening the NIC. If we are unable to reserve the\nnew TX rings, we abort the operation and keep the current TX rings.\n\nThe problem is that the firmware will disable the current TX rings even\nwhen it cannot reserve the new set of TX rings. We fix it as follows:\n\n1. Instead of reserving the new set of TX rings, just ask the firmware\nto check if the new set of TX rings is available. There is a flag in\nthe firmware message to do that. If not available, abort and the\ncurrent TX rings will not be disabled.\n\n2. Do the actual TX ring reservation in the path that opens the NIC.\nWe keep the number of TX rings currently successfully reserved. If the\nnumber of TX rings is different than the reserved TX rings, we call\nfirmware and reserve again.\n\nSigned-off-by: Michael Chan <michael.chan@broadcom.com>\n---\n drivers/net/ethernet/broadcom/bnxt/bnxt.c | 46 +++++++++++++++++++----\n drivers/net/ethernet/broadcom/bnxt/bnxt.h | 5 ++-\n drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 3 +-\n drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 4 +-\n 4 files changed, 44 insertions(+), 14 deletions(-)", "diff": "diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c\nindex 6e14fc4..4b0a807 100644\n--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c\n+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c\n@@ -4461,9 +4461,33 @@ static int bnxt_hwrm_reserve_tx_rings(struct bnxt *bp, int *tx_rings)\n \tmutex_lock(&bp->hwrm_cmd_lock);\n \trc = __bnxt_hwrm_get_tx_rings(bp, 0xffff, tx_rings);\n \tmutex_unlock(&bp->hwrm_cmd_lock);\n+\tif (!rc)\n+\t\tbp->tx_reserved_rings = *tx_rings;\n \treturn rc;\n }\n \n+static int bnxt_hwrm_check_tx_rings(struct bnxt *bp, int tx_rings)\n+{\n+\tstruct hwrm_func_cfg_input req = {0};\n+\tint rc;\n+\n+\tif (bp->hwrm_spec_code < 0x10801)\n+\t\treturn 0;\n+\n+\tif (BNXT_VF(bp))\n+\t\treturn 0;\n+\n+\tbnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_CFG, -1, -1);\n+\treq.fid = cpu_to_le16(0xffff);\n+\treq.flags = cpu_to_le32(FUNC_CFG_REQ_FLAGS_TX_ASSETS_TEST);\n+\treq.enables = cpu_to_le32(FUNC_CFG_REQ_ENABLES_NUM_TX_RINGS);\n+\treq.num_tx_rings = cpu_to_le16(tx_rings);\n+\trc = hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);\n+\tif (rc)\n+\t\treturn -ENOMEM;\n+\treturn 0;\n+}\n+\n static void bnxt_hwrm_set_coal_params(struct bnxt *bp, u32 max_bufs,\n \tu32 buf_tmrs, u16 flags,\n \tstruct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req)\n@@ -5115,6 +5139,15 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)\n \t\t\t\t rc);\n \t\t\tgoto err_out;\n \t\t}\n+\t\tif (bp->tx_reserved_rings != bp->tx_nr_rings) {\n+\t\t\tint tx = bp->tx_nr_rings;\n+\n+\t\t\tif (bnxt_hwrm_reserve_tx_rings(bp, &tx) ||\n+\t\t\t tx < bp->tx_nr_rings) {\n+\t\t\t\trc = -ENOMEM;\n+\t\t\t\tgoto err_out;\n+\t\t\t}\n+\t\t}\n \t}\n \n \trc = bnxt_hwrm_ring_alloc(bp);\n@@ -6998,8 +7031,8 @@ static void bnxt_sp_task(struct work_struct *work)\n }\n \n /* Under rtnl_lock */\n-int bnxt_reserve_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,\n-\t\t int tx_xdp)\n+int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,\n+\t\t int tx_xdp)\n {\n \tint max_rx, max_tx, tx_sets = 1;\n \tint tx_rings_needed;\n@@ -7019,10 +7052,7 @@ int bnxt_reserve_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,\n \tif (max_tx < tx_rings_needed)\n \t\treturn -ENOMEM;\n \n-\tif (bnxt_hwrm_reserve_tx_rings(bp, &tx_rings_needed) ||\n-\t tx_rings_needed < (tx * tx_sets + tx_xdp))\n-\t\treturn -ENOMEM;\n-\treturn 0;\n+\treturn bnxt_hwrm_check_tx_rings(bp, tx_rings_needed);\n }\n \n static void bnxt_unmap_bars(struct bnxt *bp, struct pci_dev *pdev)\n@@ -7211,8 +7241,8 @@ int bnxt_setup_mq_tc(struct net_device *dev, u8 tc)\n \tif (bp->flags & BNXT_FLAG_SHARED_RINGS)\n \t\tsh = true;\n \n-\trc = bnxt_reserve_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings,\n-\t\t\t\tsh, tc, bp->tx_nr_rings_xdp);\n+\trc = bnxt_check_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings,\n+\t\t\t sh, tc, bp->tx_nr_rings_xdp);\n \tif (rc)\n \t\treturn rc;\n \ndiff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h\nindex 2d84d57..568516f 100644\n--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h\n+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h\n@@ -1118,6 +1118,7 @@ struct bnxt {\n \tint\t\t\ttx_nr_rings;\n \tint\t\t\ttx_nr_rings_per_tc;\n \tint\t\t\ttx_nr_rings_xdp;\n+\tint\t\t\ttx_reserved_rings;\n \n \tint\t\t\ttx_wake_thresh;\n \tint\t\t\ttx_push_thresh;\n@@ -1346,8 +1347,8 @@ int bnxt_hwrm_func_rgtr_async_events(struct bnxt *bp, unsigned long *bmap,\n int bnxt_half_open_nic(struct bnxt *bp);\n void bnxt_half_close_nic(struct bnxt *bp);\n int bnxt_close_nic(struct bnxt *, bool, bool);\n-int bnxt_reserve_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,\n-\t\t int tx_xdp);\n+int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,\n+\t\t int tx_xdp);\n int bnxt_setup_mq_tc(struct net_device *dev, u8 tc);\n int bnxt_get_max_rings(struct bnxt *, int *, int *, bool);\n void bnxt_restore_pf_fw_resources(struct bnxt *bp);\ndiff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c\nindex 08b870d..8eff05a 100644\n--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c\n+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c\n@@ -435,8 +435,7 @@ static int bnxt_set_channels(struct net_device *dev,\n \t\t}\n \t\ttx_xdp = req_rx_rings;\n \t}\n-\trc = bnxt_reserve_rings(bp, req_tx_rings, req_rx_rings, sh, tcs,\n-\t\t\t\ttx_xdp);\n+\trc = bnxt_check_rings(bp, req_tx_rings, req_rx_rings, sh, tcs, tx_xdp);\n \tif (rc) {\n \t\tnetdev_warn(dev, \"Unable to allocate the requested rings\\n\");\n \t\treturn rc;\ndiff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c\nindex 3961a68..d8f0c83 100644\n--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c\n+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c\n@@ -169,8 +169,8 @@ static int bnxt_xdp_set(struct bnxt *bp, struct bpf_prog *prog)\n \ttc = netdev_get_num_tc(dev);\n \tif (!tc)\n \t\ttc = 1;\n-\trc = bnxt_reserve_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings,\n-\t\t\t\ttrue, tc, tx_xdp);\n+\trc = bnxt_check_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings,\n+\t\t\t true, tc, tx_xdp);\n \tif (rc) {\n \t\tnetdev_warn(dev, \"Unable to reserve enough TX rings to support XDP.\\n\");\n \t\treturn rc;\n", "prefixes": [ "net-next", "02/11" ] }