Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/972034/?format=api
{ "id": 972034, "url": "http://patchwork.ozlabs.org/api/patches/972034/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20180920002319.10971-14-anirudh.venkataramanan@intel.com/", "project": { "id": 46, "url": "http://patchwork.ozlabs.org/api/projects/46/?format=api", "name": "Intel Wired Ethernet development", "link_name": "intel-wired-lan", "list_id": "intel-wired-lan.osuosl.org", "list_email": "intel-wired-lan@osuosl.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20180920002319.10971-14-anirudh.venkataramanan@intel.com>", "list_archive_url": null, "date": "2018-09-20T00:23:16", "name": "[13/16] ice: Split irq_tracker into sw_irq_tracker and hw_irq_tracker", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "c4083ec66d4709e539cfa53fef56a9584b336572", "submitter": { "id": 73601, "url": "http://patchwork.ozlabs.org/api/people/73601/?format=api", "name": "Anirudh Venkataramanan", "email": "anirudh.venkataramanan@intel.com" }, "delegate": { "id": 68, "url": "http://patchwork.ozlabs.org/api/users/68/?format=api", "username": "jtkirshe", "first_name": "Jeff", "last_name": "Kirsher", "email": "jeffrey.t.kirsher@intel.com" }, "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20180920002319.10971-14-anirudh.venkataramanan@intel.com/mbox/", "series": [ { "id": 66525, "url": "http://patchwork.ozlabs.org/api/series/66525/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=66525", "date": "2018-09-20T00:23:03", "name": "Implementation updates for ice", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/66525/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/972034/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/972034/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<intel-wired-lan-bounces@osuosl.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "intel-wired-lan@lists.osuosl.org" ], "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "intel-wired-lan@lists.osuosl.org" ], "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=osuosl.org\n\t(client-ip=140.211.166.133; helo=hemlock.osuosl.org;\n\tenvelope-from=intel-wired-lan-bounces@osuosl.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org;\n\tdmarc=fail (p=none dis=none) header.from=intel.com" ], "Received": [ "from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 42FyBf6bqnz9s9J\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 20 Sep 2018 10:23:38 +1000 (AEST)", "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 5EAB8889BB;\n\tThu, 20 Sep 2018 00:23:37 +0000 (UTC)", "from hemlock.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id IjSgXViTs5Ph; Thu, 20 Sep 2018 00:23:35 +0000 (UTC)", "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id CD70388ACF;\n\tThu, 20 Sep 2018 00:23:35 +0000 (UTC)", "from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n\tby ash.osuosl.org (Postfix) with ESMTP id 177031C08AF\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tThu, 20 Sep 2018 00:23:32 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n\tby silver.osuosl.org (Postfix) with ESMTP id 12CF6201F5\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tThu, 20 Sep 2018 00:23:32 +0000 (UTC)", "from silver.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id 3xpKzmAvYeDw for <intel-wired-lan@lists.osuosl.org>;\n\tThu, 20 Sep 2018 00:23:28 +0000 (UTC)", "from mga05.intel.com (mga05.intel.com [192.55.52.43])\n\tby silver.osuosl.org (Postfix) with ESMTPS id 05AFF30949\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tThu, 20 Sep 2018 00:23:25 +0000 (UTC)", "from fmsmga006.fm.intel.com ([10.253.24.20])\n\tby fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t19 Sep 2018 17:23:23 -0700", "from shasta.jf.intel.com ([10.166.241.11])\n\tby fmsmga006.fm.intel.com with ESMTP; 19 Sep 2018 17:23:20 -0700" ], "X-Virus-Scanned": [ "amavisd-new at osuosl.org", "amavisd-new at osuosl.org" ], "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6", "X-Amp-Result": "SKIPPED(no attachment in message)", "X-Amp-File-Uploaded": "False", "X-ExtLoop1": "1", "X-IronPort-AV": "E=Sophos;i=\"5.53,396,1531810800\"; d=\"scan'208\";a=\"265057705\"", "From": "Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>", "To": "intel-wired-lan@lists.osuosl.org", "Date": "Wed, 19 Sep 2018 17:23:16 -0700", "Message-Id": "<20180920002319.10971-14-anirudh.venkataramanan@intel.com>", "X-Mailer": "git-send-email 2.14.3", "In-Reply-To": "<20180920002319.10971-1-anirudh.venkataramanan@intel.com>", "References": "<20180920002319.10971-1-anirudh.venkataramanan@intel.com>", "Subject": "[Intel-wired-lan] [PATCH 13/16] ice: Split irq_tracker into\n\tsw_irq_tracker and hw_irq_tracker", "X-BeenThere": "intel-wired-lan@osuosl.org", "X-Mailman-Version": "2.1.24", "Precedence": "list", "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n\t<intel-wired-lan.osuosl.org>", "List-Unsubscribe": "<https://lists.osuosl.org/mailman/options/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@osuosl.org?subject=unsubscribe>", "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>", "List-Post": "<mailto:intel-wired-lan@osuosl.org>", "List-Help": "<mailto:intel-wired-lan-request@osuosl.org?subject=help>", "List-Subscribe": "<https://lists.osuosl.org/mailman/listinfo/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@osuosl.org?subject=subscribe>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Errors-To": "intel-wired-lan-bounces@osuosl.org", "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@osuosl.org>" }, "content": "From: Preethi Banala <preethi.banala@intel.com>\n\nFor the PF driver, when mapping interrupts to queues, we need to request\nIRQs from the kernel and and we also have to allocate interrupts from\nthe device.\n\nSimilarly, when the VF driver (iavf.ko) initializes, it requests the kernel\nIRQs that it needs but it can't directly allocate interrupts in the device.\nInstead, it sends a mailbox message to the ice driver, which then allocates\ninterrupts in the device on the VF driver's behalf.\n\nCurrently both these cases end up having to reserve entries in\npf->irq_tracker but irq_tracker itself is sized based on how many vectors\nthe PF driver needs. Under the right circumstances, the VF driver can fail\nto get entries in irq_tracker, which will result in the VF driver failing\nprobe.\n\nTo fix this, sw_irq_tracker and hw_irq_tracker are introduced. The\nsw_irq_tracker tracks only the PF's IRQ request and doesn't play any\nrole in VF init. hw_irq_tracker represents the device's interrupt space.\nWhen interrupts have to be allocated in the device for either PF or VF,\nhw_irq_tracker will be looked up to see if the device has run out of\ninterrupts.\n\nSigned-off-by: Preethi Banala <preethi.banala@intel.com>\nSigned-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>\n---\n[Anirudh Venkataramanan <anirudh.venkataramanan@intel.com> rewrote commit message]\n---\n drivers/net/ethernet/intel/ice/ice.h | 21 ++++--\n drivers/net/ethernet/intel/ice/ice_lib.c | 75 +++++++++++++------\n drivers/net/ethernet/intel/ice/ice_main.c | 116 +++++++++++++++++++++---------\n 3 files changed, 148 insertions(+), 64 deletions(-)", "diff": "diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h\nindex 9cce4cb91401..88d13157ab5b 100644\n--- a/drivers/net/ethernet/intel/ice/ice.h\n+++ b/drivers/net/ethernet/intel/ice/ice.h\n@@ -172,7 +172,8 @@ struct ice_vsi {\n \tu32 rx_buf_failed;\n \tu32 rx_page_failed;\n \tint num_q_vectors;\n-\tint base_vector;\n+\tint sw_base_vector;\t\t/* Irq base for OS reserved vectors */\n+\tint hw_base_vector;\t\t/* HW (absolute) index of a vector */\n \tenum ice_vsi_type type;\n \tu16 vsi_num;\t\t\t /* HW (absolute) index of this VSI */\n \tu16 idx;\t\t\t /* software index in pf->vsi[] */\n@@ -240,8 +241,14 @@ enum ice_pf_flags {\n \n struct ice_pf {\n \tstruct pci_dev *pdev;\n+\n+\t/* OS reserved irq details */\n \tstruct msix_entry *msix_entries;\n-\tstruct ice_res_tracker *irq_tracker;\n+\tstruct ice_res_tracker *sw_irq_tracker;\n+\n+\t/* HW reserved Interrupts for this PF */\n+\tstruct ice_res_tracker *hw_irq_tracker;\n+\n \tstruct ice_vsi **vsi;\t\t/* VSIs created by the driver */\n \tstruct ice_sw *first_sw;\t/* first switch created by firmware */\n \tDECLARE_BITMAP(state, __ICE_STATE_NBITS);\n@@ -256,9 +263,11 @@ struct ice_pf {\n \tstruct mutex sw_mutex;\t\t/* lock for protecting VSI alloc flow */\n \tu32 msg_enable;\n \tu32 hw_csum_rx_error;\n-\tu32 oicr_idx;\t\t/* Other interrupt cause vector index */\n+\tu32 sw_oicr_idx;\t/* Other interrupt cause SW vector index */\n+\tu32 num_avail_sw_msix;\t/* remaining MSIX SW vectors left unclaimed */\n+\tu32 hw_oicr_idx;\t/* Other interrupt cause vector HW index */\n+\tu32 num_avail_hw_msix;\t/* remaining HW MSIX vectors left unclaimed */\n \tu32 num_lan_msix;\t/* Total MSIX vectors for base driver */\n-\tu32 num_avail_msix;\t/* remaining MSIX vectors left unclaimed */\n \tu16 num_lan_tx;\t\t/* num lan tx queues setup */\n \tu16 num_lan_rx;\t\t/* num lan rx queues setup */\n \tu16 q_left_tx;\t\t/* remaining num tx queues left unclaimed */\n@@ -293,8 +302,8 @@ struct ice_netdev_priv {\n static inline void ice_irq_dynamic_ena(struct ice_hw *hw, struct ice_vsi *vsi,\n \t\t\t\t struct ice_q_vector *q_vector)\n {\n-\tu32 vector = (vsi && q_vector) ? vsi->base_vector + q_vector->v_idx :\n-\t\t\t\t\t((struct ice_pf *)hw->back)->oicr_idx;\n+\tu32 vector = (vsi && q_vector) ? vsi->hw_base_vector + q_vector->v_idx :\n+\t\t\t\t((struct ice_pf *)hw->back)->hw_oicr_idx;\n \tint itr = ICE_ITR_NONE;\n \tu32 val;\n \ndiff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c\nindex 673123823d54..92bbbe99120c 100644\n--- a/drivers/net/ethernet/intel/ice/ice_lib.c\n+++ b/drivers/net/ethernet/intel/ice/ice_lib.c\n@@ -1039,9 +1039,9 @@ static int ice_vsi_setup_vector_base(struct ice_vsi *vsi)\n \tstruct ice_pf *pf = vsi->back;\n \tint num_q_vectors = 0;\n \n-\tif (vsi->base_vector) {\n-\t\tdev_dbg(&pf->pdev->dev, \"VSI %d has non-zero base vector %d\\n\",\n-\t\t\tvsi->vsi_num, vsi->base_vector);\n+\tif (vsi->sw_base_vector || vsi->hw_base_vector) {\n+\t\tdev_dbg(&pf->pdev->dev, \"VSI %d has non-zero HW base vector %d or SW base vector %d\\n\",\n+\t\t\tvsi->vsi_num, vsi->hw_base_vector, vsi->sw_base_vector);\n \t\treturn -EEXIST;\n \t}\n \n@@ -1051,6 +1051,21 @@ static int ice_vsi_setup_vector_base(struct ice_vsi *vsi)\n \tswitch (vsi->type) {\n \tcase ICE_VSI_PF:\n \t\tnum_q_vectors = vsi->num_q_vectors;\n+\t\t/* reserve slots from OS requested irqs */\n+\t\tvsi->sw_base_vector = ice_get_res(pf, pf->sw_irq_tracker,\n+\t\t\t\t\t\t num_q_vectors, vsi->idx);\n+\t\tif (vsi->sw_base_vector < 0) {\n+\t\t\tdev_err(&pf->pdev->dev,\n+\t\t\t\t\"Failed to get tracking for %d SW vectors for VSI %d, err=%d\\n\",\n+\t\t\t\tnum_q_vectors, vsi->vsi_num,\n+\t\t\t\tvsi->sw_base_vector);\n+\t\t\treturn -ENOENT;\n+\t\t}\n+\t\tpf->num_avail_sw_msix -= num_q_vectors;\n+\n+\t\t/* reserve slots from HW interrupts */\n+\t\tvsi->hw_base_vector = ice_get_res(pf, pf->hw_irq_tracker,\n+\t\t\t\t\t\t num_q_vectors, vsi->idx);\n \t\tbreak;\n \tdefault:\n \t\tdev_warn(&vsi->back->pdev->dev, \"Unknown VSI type %d\\n\",\n@@ -1058,17 +1073,18 @@ static int ice_vsi_setup_vector_base(struct ice_vsi *vsi)\n \t\tbreak;\n \t}\n \n-\tif (num_q_vectors)\n-\t\tvsi->base_vector = ice_get_res(pf, pf->irq_tracker,\n-\t\t\t\t\t num_q_vectors, vsi->idx);\n-\n-\tif (vsi->base_vector < 0) {\n+\tif (vsi->hw_base_vector < 0) {\n \t\tdev_err(&pf->pdev->dev,\n-\t\t\t\"Failed to get tracking for %d vectors for VSI %d, err=%d\\n\",\n-\t\t\tnum_q_vectors, vsi->vsi_num, vsi->base_vector);\n+\t\t\t\"Failed to get tracking for %d HW vectors for VSI %d, err=%d\\n\",\n+\t\t\tnum_q_vectors, vsi->vsi_num, vsi->hw_base_vector);\n+\t\tice_free_res(vsi->back->sw_irq_tracker, vsi->sw_base_vector,\n+\t\t\t vsi->idx);\n+\t\tpf->num_avail_sw_msix += num_q_vectors;\n \t\treturn -ENOENT;\n \t}\n \n+\tpf->num_avail_hw_msix -= num_q_vectors;\n+\n \treturn 0;\n }\n \n@@ -1554,7 +1570,7 @@ int ice_vsi_cfg_txqs(struct ice_vsi *vsi)\n void ice_vsi_cfg_msix(struct ice_vsi *vsi)\n {\n \tstruct ice_pf *pf = vsi->back;\n-\tu16 vector = vsi->base_vector;\n+\tu16 vector = vsi->hw_base_vector;\n \tstruct ice_hw *hw = &pf->hw;\n \tu32 txq = 0, rxq = 0;\n \tint i, q, itr;\n@@ -1762,7 +1778,7 @@ int ice_vsi_stop_tx_rings(struct ice_vsi *vsi)\n \t\t * the queue to schedule napi handler\n \t\t */\n \t\tv_idx = vsi->tx_rings[i]->q_vector->v_idx;\n-\t\twr32(hw, GLINT_DYN_CTL(vsi->base_vector + v_idx),\n+\t\twr32(hw, GLINT_DYN_CTL(vsi->hw_base_vector + v_idx),\n \t\t GLINT_DYN_CTL_SWINT_TRIG_M | GLINT_DYN_CTL_INTENA_MSK_M);\n \t}\n \tstatus = ice_dis_vsi_txq(vsi->port_info, vsi->num_txq, q_ids, q_teids,\n@@ -1939,7 +1955,12 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi,\n \treturn vsi;\n \n unroll_vector_base:\n-\tice_free_res(vsi->back->irq_tracker, vsi->base_vector, vsi->idx);\n+\t/* reclaim SW interrupts back to the common pool */\n+\tice_free_res(vsi->back->sw_irq_tracker, vsi->sw_base_vector, vsi->idx);\n+\tpf->num_avail_sw_msix += vsi->num_q_vectors;\n+\t/* reclaim HW interrupt back to the common pool */\n+\tice_free_res(vsi->back->hw_irq_tracker, vsi->hw_base_vector, vsi->idx);\n+\tpf->num_avail_hw_msix += vsi->num_q_vectors;\n unroll_alloc_q_vector:\n \tice_vsi_free_q_vectors(vsi);\n unroll_vsi_init:\n@@ -1960,7 +1981,7 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi,\n static void ice_vsi_release_msix(struct ice_vsi *vsi)\n {\n \tstruct ice_pf *pf = vsi->back;\n-\tu16 vector = vsi->base_vector;\n+\tu16 vector = vsi->hw_base_vector;\n \tstruct ice_hw *hw = &pf->hw;\n \tu32 txq = 0;\n \tu32 rxq = 0;\n@@ -1992,7 +2013,7 @@ static void ice_vsi_release_msix(struct ice_vsi *vsi)\n void ice_vsi_free_irq(struct ice_vsi *vsi)\n {\n \tstruct ice_pf *pf = vsi->back;\n-\tint base = vsi->base_vector;\n+\tint base = vsi->sw_base_vector;\n \n \tif (test_bit(ICE_FLAG_MSIX_ENA, pf->flags)) {\n \t\tint i;\n@@ -2000,6 +2021,8 @@ void ice_vsi_free_irq(struct ice_vsi *vsi)\n \t\tif (!vsi->q_vectors || !vsi->irqs_ready)\n \t\t\treturn;\n \n+\t\tice_vsi_release_msix(vsi);\n+\n \t\tvsi->irqs_ready = false;\n \t\tfor (i = 0; i < vsi->num_q_vectors; i++) {\n \t\t\tu16 vector = i + base;\n@@ -2022,7 +2045,6 @@ void ice_vsi_free_irq(struct ice_vsi *vsi)\n \t\t\tdevm_free_irq(&pf->pdev->dev, irq_num,\n \t\t\t\t vsi->q_vectors[i]);\n \t\t}\n-\t\tice_vsi_release_msix(vsi);\n \t}\n }\n \n@@ -2110,6 +2132,9 @@ static int ice_search_res(struct ice_res_tracker *res, u16 needed, u16 id)\n \tint start = res->search_hint;\n \tint end = start;\n \n+\tif ((start + needed) > res->num_entries)\n+\t\treturn -ENOMEM;\n+\n \tid |= ICE_RES_VALID_BIT;\n \n \tdo {\n@@ -2183,9 +2208,9 @@ ice_get_res(struct ice_pf *pf, struct ice_res_tracker *res, u16 needed, u16 id)\n */\n void ice_vsi_dis_irq(struct ice_vsi *vsi)\n {\n+\tint base = vsi->sw_base_vector;\n \tstruct ice_pf *pf = vsi->back;\n \tstruct ice_hw *hw = &pf->hw;\n-\tint base = vsi->base_vector;\n \tu32 val;\n \tint i;\n \n@@ -2218,8 +2243,8 @@ void ice_vsi_dis_irq(struct ice_vsi *vsi)\n \n \t/* disable each interrupt */\n \tif (test_bit(ICE_FLAG_MSIX_ENA, pf->flags)) {\n-\t\tfor (i = vsi->base_vector;\n-\t\t i < (vsi->num_q_vectors + vsi->base_vector); i++)\n+\t\tfor (i = vsi->hw_base_vector;\n+\t\t i < (vsi->num_q_vectors + vsi->hw_base_vector); i++)\n \t\t\twr32(hw, GLINT_DYN_CTL(i), 0);\n \n \t\tice_flush(hw);\n@@ -2262,8 +2287,10 @@ int ice_vsi_release(struct ice_vsi *vsi)\n \tice_vsi_close(vsi);\n \n \t/* reclaim interrupt vectors back to PF */\n-\tice_free_res(vsi->back->irq_tracker, vsi->base_vector, vsi->idx);\n-\tpf->num_avail_msix += vsi->num_q_vectors;\n+\tice_free_res(vsi->back->sw_irq_tracker, vsi->sw_base_vector, vsi->idx);\n+\tpf->num_avail_sw_msix += vsi->num_q_vectors;\n+\tice_free_res(vsi->back->hw_irq_tracker, vsi->hw_base_vector, vsi->idx);\n+\tpf->num_avail_hw_msix += vsi->num_q_vectors;\n \n \tice_remove_vsi_fltr(&pf->hw, vsi->idx);\n \tice_vsi_delete(vsi);\n@@ -2299,8 +2326,10 @@ int ice_vsi_rebuild(struct ice_vsi *vsi)\n \t\treturn -EINVAL;\n \n \tice_vsi_free_q_vectors(vsi);\n-\tice_free_res(vsi->back->irq_tracker, vsi->base_vector, vsi->idx);\n-\tvsi->base_vector = 0;\n+\tice_free_res(vsi->back->sw_irq_tracker, vsi->sw_base_vector, vsi->idx);\n+\tice_free_res(vsi->back->hw_irq_tracker, vsi->hw_base_vector, vsi->idx);\n+\tvsi->sw_base_vector = 0;\n+\tvsi->hw_base_vector = 0;\n \tice_vsi_clear_rings(vsi);\n \tice_vsi_free_arrays(vsi, false);\n \tice_vsi_set_num_qs(vsi);\ndiff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c\nindex cc10eb28c8b3..9d9c963982ca 100644\n--- a/drivers/net/ethernet/intel/ice/ice_main.c\n+++ b/drivers/net/ethernet/intel/ice/ice_main.c\n@@ -95,7 +95,7 @@ static void ice_check_for_hang_subtask(struct ice_pf *pf)\n \t\t\t\t/* Trigger sw interrupt to revive the queue */\n \t\t\t\tv_idx = tx_ring->q_vector->v_idx;\n \t\t\t\twr32(&vsi->back->hw,\n-\t\t\t\t GLINT_DYN_CTL(vsi->base_vector + v_idx),\n+\t\t\t\t GLINT_DYN_CTL(vsi->hw_base_vector + v_idx),\n \t\t\t\t (itr << GLINT_DYN_CTL_ITR_INDX_S) |\n \t\t\t\t GLINT_DYN_CTL_SWINT_TRIG_M |\n \t\t\t\t GLINT_DYN_CTL_INTENA_MSK_M);\n@@ -1122,7 +1122,7 @@ static int ice_vsi_req_irq_msix(struct ice_vsi *vsi, char *basename)\n {\n \tint q_vectors = vsi->num_q_vectors;\n \tstruct ice_pf *pf = vsi->back;\n-\tint base = vsi->base_vector;\n+\tint base = vsi->sw_base_vector;\n \tint rx_int_idx = 0;\n \tint tx_int_idx = 0;\n \tint vector, err;\n@@ -1203,7 +1203,7 @@ static void ice_ena_misc_vector(struct ice_pf *pf)\n \twr32(hw, PFINT_OICR_ENA, val);\n \n \t/* SW_ITR_IDX = 0, but don't change INTENA */\n-\twr32(hw, GLINT_DYN_CTL(pf->oicr_idx),\n+\twr32(hw, GLINT_DYN_CTL(pf->hw_oicr_idx),\n \t GLINT_DYN_CTL_SW_ITR_INDX_M | GLINT_DYN_CTL_INTENA_MSK_M);\n }\n \n@@ -1321,12 +1321,15 @@ static void ice_free_irq_msix_misc(struct ice_pf *pf)\n \tice_flush(&pf->hw);\n \n \tif (test_bit(ICE_FLAG_MSIX_ENA, pf->flags) && pf->msix_entries) {\n-\t\tsynchronize_irq(pf->msix_entries[pf->oicr_idx].vector);\n+\t\tsynchronize_irq(pf->msix_entries[pf->sw_oicr_idx].vector);\n \t\tdevm_free_irq(&pf->pdev->dev,\n-\t\t\t pf->msix_entries[pf->oicr_idx].vector, pf);\n+\t\t\t pf->msix_entries[pf->sw_oicr_idx].vector, pf);\n \t}\n \n-\tice_free_res(pf->irq_tracker, pf->oicr_idx, ICE_RES_MISC_VEC_ID);\n+\tpf->num_avail_sw_msix += 1;\n+\tice_free_res(pf->sw_irq_tracker, pf->sw_oicr_idx, ICE_RES_MISC_VEC_ID);\n+\tpf->num_avail_hw_msix += 1;\n+\tice_free_res(pf->hw_irq_tracker, pf->hw_oicr_idx, ICE_RES_MISC_VEC_ID);\n }\n \n /**\n@@ -1356,39 +1359,53 @@ static int ice_req_irq_msix_misc(struct ice_pf *pf)\n \tif (ice_is_reset_in_progress(pf->state))\n \t\tgoto skip_req_irq;\n \n-\t/* reserve one vector in irq_tracker for misc interrupts */\n-\toicr_idx = ice_get_res(pf, pf->irq_tracker, 1, ICE_RES_MISC_VEC_ID);\n+\t/* reserve one vector in sw_irq_tracker for misc interrupts */\n+\toicr_idx = ice_get_res(pf, pf->sw_irq_tracker, 1, ICE_RES_MISC_VEC_ID);\n \tif (oicr_idx < 0)\n \t\treturn oicr_idx;\n \n-\tpf->oicr_idx = oicr_idx;\n+\tpf->num_avail_sw_msix -= 1;\n+\tpf->sw_oicr_idx = oicr_idx;\n+\n+\t/* reserve one vector in hw_irq_tracker for misc interrupts */\n+\toicr_idx = ice_get_res(pf, pf->hw_irq_tracker, 1, ICE_RES_MISC_VEC_ID);\n+\tif (oicr_idx < 0) {\n+\t\tice_free_res(pf->sw_irq_tracker, 1, ICE_RES_MISC_VEC_ID);\n+\t\tpf->num_avail_sw_msix += 1;\n+\t\treturn oicr_idx;\n+\t}\n+\tpf->num_avail_hw_msix -= 1;\n+\tpf->hw_oicr_idx = oicr_idx;\n \n \terr = devm_request_irq(&pf->pdev->dev,\n-\t\t\t pf->msix_entries[pf->oicr_idx].vector,\n+\t\t\t pf->msix_entries[pf->sw_oicr_idx].vector,\n \t\t\t ice_misc_intr, 0, pf->int_name, pf);\n \tif (err) {\n \t\tdev_err(&pf->pdev->dev,\n \t\t\t\"devm_request_irq for %s failed: %d\\n\",\n \t\t\tpf->int_name, err);\n-\t\tice_free_res(pf->irq_tracker, 1, ICE_RES_MISC_VEC_ID);\n+\t\tice_free_res(pf->sw_irq_tracker, 1, ICE_RES_MISC_VEC_ID);\n+\t\tpf->num_avail_sw_msix += 1;\n+\t\tice_free_res(pf->hw_irq_tracker, 1, ICE_RES_MISC_VEC_ID);\n+\t\tpf->num_avail_hw_msix += 1;\n \t\treturn err;\n \t}\n \n skip_req_irq:\n \tice_ena_misc_vector(pf);\n \n-\tval = ((pf->oicr_idx & PFINT_OICR_CTL_MSIX_INDX_M) |\n+\tval = ((pf->hw_oicr_idx & PFINT_OICR_CTL_MSIX_INDX_M) |\n \t PFINT_OICR_CTL_CAUSE_ENA_M);\n \twr32(hw, PFINT_OICR_CTL, val);\n \n \t/* This enables Admin queue Interrupt causes */\n-\tval = ((pf->oicr_idx & PFINT_FW_CTL_MSIX_INDX_M) |\n+\tval = ((pf->hw_oicr_idx & PFINT_FW_CTL_MSIX_INDX_M) |\n \t PFINT_FW_CTL_CAUSE_ENA_M);\n \twr32(hw, PFINT_FW_CTL, val);\n \n \titr_gran = hw->itr_gran_200;\n \n-\twr32(hw, GLINT_ITR(ICE_RX_ITR, pf->oicr_idx),\n+\twr32(hw, GLINT_ITR(ICE_RX_ITR, pf->hw_oicr_idx),\n \t ITR_TO_REG(ICE_ITR_8K, itr_gran));\n \n \tice_flush(hw);\n@@ -1797,6 +1814,7 @@ static int ice_ena_msix_range(struct ice_pf *pf)\n \t/* reserve vectors for LAN traffic */\n \tpf->num_lan_msix = min_t(int, num_online_cpus(), v_left);\n \tv_budget += pf->num_lan_msix;\n+\tv_left -= pf->num_lan_msix;\n \n \tpf->msix_entries = devm_kcalloc(&pf->pdev->dev, v_budget,\n \t\t\t\t\tsizeof(struct msix_entry), GFP_KERNEL);\n@@ -1824,10 +1842,11 @@ static int ice_ena_msix_range(struct ice_pf *pf)\n \t\t\t \"not enough vectors. requested = %d, obtained = %d\\n\",\n \t\t\t v_budget, v_actual);\n \t\tif (v_actual >= (pf->num_lan_msix + 1)) {\n-\t\t\tpf->num_avail_msix = v_actual - (pf->num_lan_msix + 1);\n+\t\t\tpf->num_avail_sw_msix = v_actual -\n+\t\t\t\t\t\t(pf->num_lan_msix + 1);\n \t\t} else if (v_actual >= 2) {\n \t\t\tpf->num_lan_msix = 1;\n-\t\t\tpf->num_avail_msix = v_actual - 2;\n+\t\t\tpf->num_avail_sw_msix = v_actual - 2;\n \t\t} else {\n \t\t\tpci_disable_msix(pf->pdev);\n \t\t\terr = -ERANGE;\n@@ -1859,13 +1878,33 @@ static void ice_dis_msix(struct ice_pf *pf)\n \tclear_bit(ICE_FLAG_MSIX_ENA, pf->flags);\n }\n \n+/**\n+ * ice_clear_interrupt_scheme - Undo things done by ice_init_interrupt_scheme\n+ * @pf: board private structure\n+ */\n+static void ice_clear_interrupt_scheme(struct ice_pf *pf)\n+{\n+\tif (test_bit(ICE_FLAG_MSIX_ENA, pf->flags))\n+\t\tice_dis_msix(pf);\n+\n+\tif (pf->sw_irq_tracker) {\n+\t\tdevm_kfree(&pf->pdev->dev, pf->sw_irq_tracker);\n+\t\tpf->sw_irq_tracker = NULL;\n+\t}\n+\n+\tif (pf->hw_irq_tracker) {\n+\t\tdevm_kfree(&pf->pdev->dev, pf->hw_irq_tracker);\n+\t\tpf->hw_irq_tracker = NULL;\n+\t}\n+}\n+\n /**\n * ice_init_interrupt_scheme - Determine proper interrupt scheme\n * @pf: board private structure to initialize\n */\n static int ice_init_interrupt_scheme(struct ice_pf *pf)\n {\n-\tint vectors = 0;\n+\tint vectors = 0, hw_vectors = 0;\n \tssize_t size;\n \n \tif (test_bit(ICE_FLAG_MSIX_ENA, pf->flags))\n@@ -1879,30 +1918,31 @@ static int ice_init_interrupt_scheme(struct ice_pf *pf)\n \t/* set up vector assignment tracking */\n \tsize = sizeof(struct ice_res_tracker) + (sizeof(u16) * vectors);\n \n-\tpf->irq_tracker = devm_kzalloc(&pf->pdev->dev, size, GFP_KERNEL);\n-\tif (!pf->irq_tracker) {\n+\tpf->sw_irq_tracker = devm_kzalloc(&pf->pdev->dev, size, GFP_KERNEL);\n+\tif (!pf->sw_irq_tracker) {\n \t\tice_dis_msix(pf);\n \t\treturn -ENOMEM;\n \t}\n \n-\tpf->irq_tracker->num_entries = vectors;\n+\t/* populate SW interrupts pool with number of OS granted irqs. */\n+\tpf->num_avail_sw_msix = vectors;\n+\tpf->sw_irq_tracker->num_entries = vectors;\n \n-\treturn 0;\n-}\n+\t/* set up HW vector assignment tracking */\n+\thw_vectors = pf->hw.func_caps.common_cap.num_msix_vectors;\n+\tsize = sizeof(struct ice_res_tracker) + (sizeof(u16) * hw_vectors);\n \n-/**\n- * ice_clear_interrupt_scheme - Undo things done by ice_init_interrupt_scheme\n- * @pf: board private structure\n- */\n-static void ice_clear_interrupt_scheme(struct ice_pf *pf)\n-{\n-\tif (test_bit(ICE_FLAG_MSIX_ENA, pf->flags))\n-\t\tice_dis_msix(pf);\n-\n-\tif (pf->irq_tracker) {\n-\t\tdevm_kfree(&pf->pdev->dev, pf->irq_tracker);\n-\t\tpf->irq_tracker = NULL;\n+\tpf->hw_irq_tracker = devm_kzalloc(&pf->pdev->dev, size, GFP_KERNEL);\n+\tif (!pf->hw_irq_tracker) {\n+\t\tice_clear_interrupt_scheme(pf);\n+\t\treturn -ENOMEM;\n \t}\n+\n+\t/* populate HW interrupts pool with number of HW supported irqs. */\n+\tpf->num_avail_hw_msix = hw_vectors;\n+\tpf->hw_irq_tracker->num_entries = hw_vectors;\n+\n+\treturn 0;\n }\n \n /**\n@@ -3237,6 +3277,12 @@ static void ice_rebuild(struct ice_pf *pf)\n \tif (err)\n \t\tgoto err_sched_init_port;\n \n+\t/* reset search_hint of irq_trackers to 0 since interrupts are\n+\t * reclaimed and could be allocated from beginning during VSI rebuild\n+\t */\n+\tpf->sw_irq_tracker->search_hint = 0;\n+\tpf->hw_irq_tracker->search_hint = 0;\n+\n \terr = ice_vsi_rebuild_all(pf);\n \tif (err) {\n \t\tdev_err(dev, \"ice_vsi_rebuild_all failed\\n\");\n@@ -3634,7 +3680,7 @@ static void ice_tx_timeout(struct net_device *netdev)\n \t\tif (test_bit(ICE_FLAG_MSIX_ENA, pf->flags))\n \t\t\tval = rd32(&pf->hw,\n \t\t\t\t GLINT_DYN_CTL(tx_ring->q_vector->v_idx +\n-\t\t\t\t\t\ttx_ring->vsi->base_vector - 1));\n+\t\t\t\t\ttx_ring->vsi->hw_base_vector));\n \n \t\tnetdev_info(netdev, \"tx_timeout: VSI_num: %d, Q %d, NTC: 0x%x, HWB: 0x%x, NTU: 0x%x, TAIL: 0x%x, INT: 0x%x\\n\",\n \t\t\t vsi->vsi_num, hung_queue, tx_ring->next_to_clean,\n", "prefixes": [ "13/16" ] }