get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 788805,
    "url": "http://patchwork.ozlabs.org/api/patches/788805/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20170714132709.52657-7-alice.michael@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": "<20170714132709.52657-7-alice.michael@intel.com>",
    "list_archive_url": null,
    "date": "2017-07-14T13:27:06",
    "name": "[next,S77-V3,07/10] i40e: shutdown all IRQs and disable MSI-X when suspended",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "b92660ef7aba9b081c0d549269987b7ed5226427",
    "submitter": {
        "id": 71123,
        "url": "http://patchwork.ozlabs.org/api/people/71123/?format=api",
        "name": "Michael, Alice",
        "email": "alice.michael@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/20170714132709.52657-7-alice.michael@intel.com/mbox/",
    "series": [],
    "comments": "http://patchwork.ozlabs.org/api/patches/788805/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/788805/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"
        ],
        "Received": [
            "from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3x8QqP69pPz9s7F\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat, 15 Jul 2017 07:31:29 +1000 (AEST)",
            "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 70CD08A42E;\n\tFri, 14 Jul 2017 21:31:28 +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 ISj0Nvsn96Lb; Fri, 14 Jul 2017 21:31:26 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 2844F8A440;\n\tFri, 14 Jul 2017 21:31:26 +0000 (UTC)",
            "from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n\tby ash.osuosl.org (Postfix) with ESMTP id 570581C0683\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 14 Jul 2017 21:31:22 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id F17288A431\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 14 Jul 2017 21:31:21 +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 OFUTPmCyHuae for <intel-wired-lan@lists.osuosl.org>;\n\tFri, 14 Jul 2017 21:31:18 +0000 (UTC)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n\tby hemlock.osuosl.org (Postfix) with ESMTPS id 77D628A426\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 14 Jul 2017 21:31:17 +0000 (UTC)",
            "from orsmga005.jf.intel.com ([10.7.209.41])\n\tby orsmga105.jf.intel.com with ESMTP; 14 Jul 2017 14:31:16 -0700",
            "from unknown (HELO localhost.jf.intel.com) ([10.166.16.121])\n\tby orsmga005.jf.intel.com with ESMTP; 14 Jul 2017 14:31:16 -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-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.40,360,1496127600\"; d=\"scan'208\";a=\"125288635\"",
        "From": "Alice Michael <alice.michael@intel.com>",
        "To": "alice.michael@intel.com,\n\tintel-wired-lan@lists.osuosl.org",
        "Date": "Fri, 14 Jul 2017 09:27:06 -0400",
        "Message-Id": "<20170714132709.52657-7-alice.michael@intel.com>",
        "X-Mailer": "git-send-email 2.9.3",
        "In-Reply-To": "<20170714132709.52657-1-alice.michael@intel.com>",
        "References": "<20170714132709.52657-1-alice.michael@intel.com>",
        "Subject": "[Intel-wired-lan] [next PATCH S77-V3 07/10] i40e: shutdown all IRQs\n\tand disable MSI-X when suspended",
        "X-BeenThere": "intel-wired-lan@osuosl.org",
        "X-Mailman-Version": "2.1.18-1",
        "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: Jacob Keller <jacob.e.keller@intel.com>\n\nOn some platforms with a large number of CPUs, we will allocate many IRQ\nvectors. When hibernating, the system will attempt to migrate all of the\nvectors back to CPU0 when shutting down all the other CPUs. It is\npossible that we have so many vectors that it cannot re-assign them to\nCPU0. This is even more likely if we have many devices installed in one\nplatform.\n\nThe end result is failure to hibernate, as it is not possible to\nshutdown the CPUs. We can avoid this by disabling MSI-X and clearing our\ninterrupt scheme when the device is suspended. A more ideal solution\nwould be some method for the stack to properly handle this for all\ndrivers, rather than on a case-by-case basis for each driver to fix\nitself.\n\nHowever, until this more ideal solution exists, we can do our part and\nshutdown our IRQs during suspend, which should allow systems with\na large number of CPUs to safely suspend or hibernate.\n\nIt may be worth investigating if we should shut down even further when\nwe suspend as it may make the path cleaner, but this was the minimum fix\nfor the hibernation issue mentioned here.\n\nTesting-hints:\n  This affects systems with a large number of CPUs, and with multiple\n  devices enabled. Without this change, those platforms are unable to\n  hibernate at all.\n\nSigned-off-by: Jacob Keller <jacob.e.keller@intel.com>\n---\n drivers/net/ethernet/intel/i40e/i40e_main.c     | 68 ++++++++++++++++++++++++-\n drivers/net/ethernet/intel/i40evf/i40evf_main.c |  2 +-\n 2 files changed, 68 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c\nindex 0d2e652..1ad014d 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_main.c\n+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c\n@@ -8340,6 +8340,57 @@ static int i40e_init_interrupt_scheme(struct i40e_pf *pf)\n \treturn 0;\n }\n \n+#ifdef CONFIG_PM\n+/**\n+ * i40e_restore_interrupt_scheme - Restore the interrupt scheme\n+ * @pf: private board data structure\n+ *\n+ * Restore the interrupt scheme that was cleared when we suspended the\n+ * device. This should be called during resume to re-allocate the q_vectors\n+ * and reacquire IRQs.\n+ */\n+static int i40e_restore_interrupt_scheme(struct i40e_pf *pf)\n+{\n+\tint err, i;\n+\n+\t/* We cleared the MSI and MSI-X flags when disabling the old interrupt\n+\t * scheme. We need to re-enabled them here in order to attempt to\n+\t * re-acquire the MSI or MSI-X vectors\n+\t */\n+\tpf->flags |= (I40E_FLAG_MSIX_ENABLED | I40E_FLAG_MSI_ENABLED);\n+\n+\terr = i40e_init_interrupt_scheme(pf);\n+\tif (err)\n+\t\treturn err;\n+\n+\t/* Now that we've re-acquired IRQs, we need to remap the vectors and\n+\t * rings together again.\n+\t */\n+\tfor (i = 0; i < pf->num_alloc_vsi; i++) {\n+\t\tif (pf->vsi[i]) {\n+\t\t\terr = i40e_vsi_alloc_q_vectors(pf->vsi[i]);\n+\t\t\tif (err)\n+\t\t\t\tgoto err_unwind;\n+\t\t\ti40e_vsi_map_rings_to_vectors(pf->vsi[i]);\n+\t\t}\n+\t}\n+\n+\terr = i40e_setup_misc_vector(pf);\n+\tif (err)\n+\t\tgoto err_unwind;\n+\n+\treturn 0;\n+\n+err_unwind:\n+\twhile (i--) {\n+\t\tif (pf->vsi[i])\n+\t\t\ti40e_vsi_free_q_vectors(pf->vsi[i]);\n+\t}\n+\n+\treturn err;\n+}\n+#endif /* CONFIG_PM */\n+\n /**\n  * i40e_setup_misc_vector - Setup the misc vector to handle non queue events\n  * @pf: board private structure\n@@ -12063,7 +12114,12 @@ static int i40e_suspend(struct device *dev)\n \twr32(hw, I40E_PFPM_APM, (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0));\n \twr32(hw, I40E_PFPM_WUFC, (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0));\n \n-\ti40e_free_misc_vector(pf);\n+\t/* Clear the interrupt scheme and release our IRQs so that the system\n+\t * can safely hibernate even when there are a large number of CPUs.\n+\t * Otherwise hibernation might fail when mapping all the vectors back\n+\t * to CPU0.\n+\t */\n+\ti40e_clear_interrupt_scheme(pf);\n \n \treturn 0;\n }\n@@ -12076,11 +12132,21 @@ static int i40e_resume(struct device *dev)\n {\n \tstruct pci_dev *pdev = to_pci_dev(dev);\n \tstruct i40e_pf *pf = pci_get_drvdata(pdev);\n+\tint err;\n \n \t/* If we're not suspended, then there is nothing to do */\n \tif (!test_bit(__I40E_SUSPENDED, pf->state))\n \t\treturn 0;\n \n+\t/* We cleared the interrupt scheme when we suspended, so we need to\n+\t * restore it now to resume device functionality.\n+\t */\n+\terr = i40e_restore_interrupt_scheme(pf);\n+\tif (err) {\n+\t\tdev_err(&pdev->dev, \"Cannot restore interrupt scheme: %d\\n\",\n+\t\t\terr);\n+\t}\n+\n \tclear_bit(__I40E_DOWN, pf->state);\n \ti40e_reset_and_rebuild(pf, false, false);\n \ndiff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c\nindex 29953c9..d8e17c2 100644\n--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c\n+++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c\n@@ -46,7 +46,7 @@ static const char i40evf_driver_string[] =\n \n #define DRV_VERSION_MAJOR 3\n #define DRV_VERSION_MINOR 0\n-#define DRV_VERSION_BUILD 0\n+#define DRV_VERSION_BUILD 1\n #define DRV_VERSION __stringify(DRV_VERSION_MAJOR) \".\" \\\n \t     __stringify(DRV_VERSION_MINOR) \".\" \\\n \t     __stringify(DRV_VERSION_BUILD) \\\n",
    "prefixes": [
        "next",
        "S77-V3",
        "07/10"
    ]
}