{"id":811597,"url":"http://patchwork.ozlabs.org/api/patches/811597/?format=json","web_url":"http://patchwork.ozlabs.org/project/ubuntu-kernel/patch/7be381dfe3993c37fdaeff34902f72b8334f68a9.1504636892.git.joseph.salisbury@canonical.com/","project":{"id":15,"url":"http://patchwork.ozlabs.org/api/projects/15/?format=json","name":"Ubuntu Kernel","link_name":"ubuntu-kernel","list_id":"kernel-team.lists.ubuntu.com","list_email":"kernel-team@lists.ubuntu.com","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<7be381dfe3993c37fdaeff34902f72b8334f68a9.1504636892.git.joseph.salisbury@canonical.com>","list_archive_url":null,"date":"2017-09-08T13:38:41","name":"[SRU,Zesty,1/2] PCI: Lock each enable/disable num_vfs operation in sysfs","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"a5430263186029abfd1d6b131eec48e08e6a3597","submitter":{"id":7793,"url":"http://patchwork.ozlabs.org/api/people/7793/?format=json","name":"Joseph Salisbury","email":"joseph.salisbury@canonical.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/ubuntu-kernel/patch/7be381dfe3993c37fdaeff34902f72b8334f68a9.1504636892.git.joseph.salisbury@canonical.com/mbox/","series":[{"id":2215,"url":"http://patchwork.ozlabs.org/api/series/2215/?format=json","web_url":"http://patchwork.ozlabs.org/project/ubuntu-kernel/list/?series=2215","date":"2017-09-08T13:38:42","name":"Fixes for LP:1715073","version":1,"mbox":"http://patchwork.ozlabs.org/series/2215/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/811597/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/811597/checks/","tags":{},"related":[],"headers":{"Return-Path":"<kernel-team-bounces@lists.ubuntu.com>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":"ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=lists.ubuntu.com\n\t(client-ip=91.189.94.19; helo=huckleberry.canonical.com;\n\tenvelope-from=kernel-team-bounces@lists.ubuntu.com;\n\treceiver=<UNKNOWN>)","Received":["from huckleberry.canonical.com (huckleberry.canonical.com\n\t[91.189.94.19])\n\tby ozlabs.org (Postfix) with ESMTP id 3xpdhB101yz9sPk;\n\tFri,  8 Sep 2017 23:38:50 +1000 (AEST)","from localhost ([127.0.0.1] helo=huckleberry.canonical.com)\n\tby huckleberry.canonical.com with esmtp (Exim 4.86_2)\n\t(envelope-from <kernel-team-bounces@lists.ubuntu.com>)\n\tid 1dqJUc-0006Xy-U5; Fri, 08 Sep 2017 13:38:46 +0000","from youngberry.canonical.com ([91.189.89.112])\n\tby huckleberry.canonical.com with esmtps\n\t(TLS1.0:DHE_RSA_AES_128_CBC_SHA1:128)\n\t(Exim 4.86_2) (envelope-from <joseph.salisbury@canonical.com>)\n\tid 1dqJUZ-0006W9-Fo\n\tfor kernel-team@lists.ubuntu.com; Fri, 08 Sep 2017 13:38:43 +0000","from 1.general.jsalisbury.us.vpn ([10.172.67.212] helo=salisbury)\n\tby youngberry.canonical.com with esmtpsa\n\t(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.76) (envelope-from <joseph.salisbury@canonical.com>)\n\tid 1dqJUZ-00054a-3J\n\tfor kernel-team@lists.ubuntu.com; Fri, 08 Sep 2017 13:38:43 +0000","by salisbury (Postfix, from userid 1000)\n\tid 1F3DB7E00CF; Fri,  8 Sep 2017 09:38:42 -0400 (EDT)"],"From":"Joseph Salisbury <joseph.salisbury@canonical.com>","To":"kernel-team@lists.ubuntu.com","Subject":"[SRU][Zesty][PATCH 1/2] PCI: Lock each enable/disable num_vfs\n\toperation in sysfs","Date":"Fri,  8 Sep 2017 09:38:41 -0400","Message-Id":"<7be381dfe3993c37fdaeff34902f72b8334f68a9.1504636892.git.joseph.salisbury@canonical.com>","X-Mailer":"git-send-email 2.7.4","In-Reply-To":["<cover.1504636892.git.joseph.salisbury@canonical.com>","<cover.1504636892.git.joseph.salisbury@canonical.com>"],"References":["<cover.1504636892.git.joseph.salisbury@canonical.com>","<cover.1504636892.git.joseph.salisbury@canonical.com>"],"X-BeenThere":"kernel-team@lists.ubuntu.com","X-Mailman-Version":"2.1.20","Precedence":"list","List-Id":"Kernel team discussions <kernel-team.lists.ubuntu.com>","List-Unsubscribe":"<https://lists.ubuntu.com/mailman/options/kernel-team>,\n\t<mailto:kernel-team-request@lists.ubuntu.com?subject=unsubscribe>","List-Archive":"<https://lists.ubuntu.com/archives/kernel-team>","List-Post":"<mailto:kernel-team@lists.ubuntu.com>","List-Help":"<mailto:kernel-team-request@lists.ubuntu.com?subject=help>","List-Subscribe":"<https://lists.ubuntu.com/mailman/listinfo/kernel-team>,\n\t<mailto:kernel-team-request@lists.ubuntu.com?subject=subscribe>","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"kernel-team-bounces@lists.ubuntu.com","Sender":"\"kernel-team\" <kernel-team-bounces@lists.ubuntu.com>"},"content":"From: Emil Tantilov <emil.s.tantilov@intel.com>\n\nBugLink: http://bugs.launchpad.net/bugs/1715073\n\nEnabling/disabling SRIOV via sysfs by echo-ing multiple values\nsimultaneously:\n\n  # echo 63 > /sys/class/net/ethX/device/sriov_numvfs&\n  # echo 63 > /sys/class/net/ethX/device/sriov_numvfs\n\n  # sleep 5\n\n  # echo 0 > /sys/class/net/ethX/device/sriov_numvfs&\n  # echo 0 > /sys/class/net/ethX/device/sriov_numvfs\n\nresults in the following bug:\n\n  kernel BUG at drivers/pci/iov.c:495!\n  invalid opcode: 0000 [#1] SMP\n  CPU: 1 PID: 8050 Comm: bash Tainted: G   W   4.9.0-rc7-net-next #2092\n  RIP: 0010:[<ffffffff813b1647>]\n\t    [<ffffffff813b1647>] pci_iov_release+0x57/0x60\n\n  Call Trace:\n   [<ffffffff81391726>] pci_release_dev+0x26/0x70\n   [<ffffffff8155be6e>] device_release+0x3e/0xb0\n   [<ffffffff81365ee7>] kobject_cleanup+0x67/0x180\n   [<ffffffff81365d9d>] kobject_put+0x2d/0x60\n   [<ffffffff8155bc27>] put_device+0x17/0x20\n   [<ffffffff8139c08a>] pci_dev_put+0x1a/0x20\n   [<ffffffff8139cb6b>] pci_get_dev_by_id+0x5b/0x90\n   [<ffffffff8139cca5>] pci_get_subsys+0x35/0x40\n   [<ffffffff8139ccc8>] pci_get_device+0x18/0x20\n   [<ffffffff8139ccfb>] pci_get_domain_bus_and_slot+0x2b/0x60\n   [<ffffffff813b09e7>] pci_iov_remove_virtfn+0x57/0x180\n   [<ffffffff813b0b95>] pci_disable_sriov+0x65/0x140\n   [<ffffffffa00a1af7>] ixgbe_disable_sriov+0xc7/0x1d0 [ixgbe]\n   [<ffffffffa00a1e9d>] ixgbe_pci_sriov_configure+0x3d/0x170 [ixgbe]\n   [<ffffffff8139d28c>] sriov_numvfs_store+0xdc/0x130\n  ...\n  RIP  [<ffffffff813b1647>] pci_iov_release+0x57/0x60\n\nUse the existing mutex lock to protect each enable/disable operation.\n\nSigned-off-by: Emil Tantilov <emil.s.tantilov@intel.com>\nSigned-off-by: Bjorn Helgaas <bhelgaas@google.com>\nReviewed-by: Gavin Shan <gwshan@linux.vnet.ibm.com>\nCC: Alexander Duyck <alexander.h.duyck@intel.com>\n(cherry picked from commit 5b0948dfe138f0837699f46f5877f4f81c252dac)\nSigned-off-by: Joseph Salisbury <joseph.salisbury@canonical.com>\n---\n drivers/pci/iov.c       |  7 -------\n drivers/pci/pci-sysfs.c | 23 ++++++++++++++++-------\n drivers/pci/pci.h       |  2 +-\n 3 files changed, 17 insertions(+), 15 deletions(-)","diff":"diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c\nindex 4722782..2479ae8 100644\n--- a/drivers/pci/iov.c\n+++ b/drivers/pci/iov.c\n@@ -124,7 +124,6 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id, int reset)\n \tstruct pci_sriov *iov = dev->sriov;\n \tstruct pci_bus *bus;\n \n-\tmutex_lock(&iov->dev->sriov->lock);\n \tbus = virtfn_add_bus(dev->bus, pci_iov_virtfn_bus(dev, id));\n \tif (!bus)\n \t\tgoto failed;\n@@ -162,7 +161,6 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id, int reset)\n \t\t__pci_reset_function(virtfn);\n \n \tpci_device_add(virtfn, virtfn->bus);\n-\tmutex_unlock(&iov->dev->sriov->lock);\n \n \tpci_bus_add_device(virtfn);\n \tsprintf(buf, \"virtfn%u\", id);\n@@ -181,12 +179,10 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id, int reset)\n \tsysfs_remove_link(&dev->dev.kobj, buf);\n failed1:\n \tpci_dev_put(dev);\n-\tmutex_lock(&iov->dev->sriov->lock);\n \tpci_stop_and_remove_bus_device(virtfn);\n failed0:\n \tvirtfn_remove_bus(dev->bus, bus);\n failed:\n-\tmutex_unlock(&iov->dev->sriov->lock);\n \n \treturn rc;\n }\n@@ -195,7 +191,6 @@ void pci_iov_remove_virtfn(struct pci_dev *dev, int id, int reset)\n {\n \tchar buf[VIRTFN_ID_LEN];\n \tstruct pci_dev *virtfn;\n-\tstruct pci_sriov *iov = dev->sriov;\n \n \tvirtfn = pci_get_domain_bus_and_slot(pci_domain_nr(dev->bus),\n \t\t\t\t\t     pci_iov_virtfn_bus(dev, id),\n@@ -218,10 +213,8 @@ void pci_iov_remove_virtfn(struct pci_dev *dev, int id, int reset)\n \tif (virtfn->dev.kobj.sd)\n \t\tsysfs_remove_link(&virtfn->dev.kobj, \"physfn\");\n \n-\tmutex_lock(&iov->dev->sriov->lock);\n \tpci_stop_and_remove_bus_device(virtfn);\n \tvirtfn_remove_bus(dev->bus, virtfn->bus);\n-\tmutex_unlock(&iov->dev->sriov->lock);\n \n \t/* balance pci_get_domain_bus_and_slot() */\n \tpci_dev_put(virtfn);\ndiff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c\nindex 9867e0c..c18ca5d 100644\n--- a/drivers/pci/pci-sysfs.c\n+++ b/drivers/pci/pci-sysfs.c\n@@ -473,6 +473,7 @@ static ssize_t sriov_numvfs_store(struct device *dev,\n \t\t\t\t  const char *buf, size_t count)\n {\n \tstruct pci_dev *pdev = to_pci_dev(dev);\n+\tstruct pci_sriov *iov = pdev->sriov;\n \tint ret;\n \tu16 num_vfs;\n \n@@ -483,38 +484,46 @@ static ssize_t sriov_numvfs_store(struct device *dev,\n \tif (num_vfs > pci_sriov_get_totalvfs(pdev))\n \t\treturn -ERANGE;\n \n+\tmutex_lock(&iov->dev->sriov->lock);\n+\n \tif (num_vfs == pdev->sriov->num_VFs)\n-\t\treturn count;\t\t/* no change */\n+\t\tgoto exit;\n \n \t/* is PF driver loaded w/callback */\n \tif (!pdev->driver || !pdev->driver->sriov_configure) {\n \t\tdev_info(&pdev->dev, \"Driver doesn't support SRIOV configuration via sysfs\\n\");\n-\t\treturn -ENOSYS;\n+\t\tret = -ENOENT;\n+\t\tgoto exit;\n \t}\n \n \tif (num_vfs == 0) {\n \t\t/* disable VFs */\n \t\tret = pdev->driver->sriov_configure(pdev, 0);\n-\t\tif (ret < 0)\n-\t\t\treturn ret;\n-\t\treturn count;\n+\t\tgoto exit;\n \t}\n \n \t/* enable VFs */\n \tif (pdev->sriov->num_VFs) {\n \t\tdev_warn(&pdev->dev, \"%d VFs already enabled. Disable before enabling %d VFs\\n\",\n \t\t\t pdev->sriov->num_VFs, num_vfs);\n-\t\treturn -EBUSY;\n+\t\tret = -EBUSY;\n+\t\tgoto exit;\n \t}\n \n \tret = pdev->driver->sriov_configure(pdev, num_vfs);\n \tif (ret < 0)\n-\t\treturn ret;\n+\t\tgoto exit;\n \n \tif (ret != num_vfs)\n \t\tdev_warn(&pdev->dev, \"%d VFs requested; only %d enabled\\n\",\n \t\t\t num_vfs, ret);\n \n+exit:\n+\tmutex_unlock(&iov->dev->sriov->lock);\n+\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n \treturn count;\n }\n \ndiff --git a/drivers/pci/pci.h b/drivers/pci/pci.h\nindex cb17db2..8dd38e6 100644\n--- a/drivers/pci/pci.h\n+++ b/drivers/pci/pci.h\n@@ -270,7 +270,7 @@ struct pci_sriov {\n \tu16 driver_max_VFs;\t/* max num VFs driver supports */\n \tstruct pci_dev *dev;\t/* lowest numbered PF */\n \tstruct pci_dev *self;\t/* this PF */\n-\tstruct mutex lock;\t/* lock for VF bus */\n+\tstruct mutex lock;\t/* lock for setting sriov_numvfs in sysfs */\n \tresource_size_t barsz[PCI_SRIOV_NUM_BARS];\t/* VF BAR size */\n };\n \n","prefixes":["SRU","Zesty","1/2"]}