get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 44732,
    "url": "http://patches.dpdk.org/api/patches/44732/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20180914153019.8983-1-stephen@networkplumber.org/",
    "project": {
        "id": 1,
        "url": "http://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": "<20180914153019.8983-1-stephen@networkplumber.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180914153019.8983-1-stephen@networkplumber.org",
    "date": "2018-09-14T15:30:19",
    "name": "igb_uio: fix refcount if open returns error",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "6d7ee7531cb184871a617534f0d1db9d920efd58",
    "submitter": {
        "id": 27,
        "url": "http://patches.dpdk.org/api/people/27/?format=api",
        "name": "Stephen Hemminger",
        "email": "stephen@networkplumber.org"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20180914153019.8983-1-stephen@networkplumber.org/mbox/",
    "series": [
        {
            "id": 1325,
            "url": "http://patches.dpdk.org/api/series/1325/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=1325",
            "date": "2018-09-14T15:30:19",
            "name": "igb_uio: fix refcount if open returns error",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/1325/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/44732/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/44732/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 382385B12;\n\tFri, 14 Sep 2018 17:30:32 +0200 (CEST)",
            "from mail-pf1-f194.google.com (mail-pf1-f194.google.com\n\t[209.85.210.194]) by dpdk.org (Postfix) with ESMTP id 520F35911\n\tfor <dev@dpdk.org>; Fri, 14 Sep 2018 17:30:30 +0200 (CEST)",
            "by mail-pf1-f194.google.com with SMTP id x17-v6so4478843pfh.5\n\tfor <dev@dpdk.org>; Fri, 14 Sep 2018 08:30:30 -0700 (PDT)",
            "from xeon-e3.lan (204-195-22-127.wavecable.com. [204.195.22.127])\n\tby smtp.gmail.com with ESMTPSA id\n\ti5-v6sm10726686pfe.140.2018.09.14.08.30.28\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tFri, 14 Sep 2018 08:30:28 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=networkplumber-org.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id;\n\tbh=k6PywAon4T7sx5r5xj6r19+kKO/5DpU1g0jJOlLaNt4=;\n\tb=zkx7MtxPHwPfj85+1ZGmPzot8gytrN9lYCmmJjk8+rNIOrqNJlPvbn5g7c8BcL8leu\n\tfK5vBJU6vc/7qT6wPX6WHmiWq2LlzkKoDss/E0pW+P+bBWfqRmUjDfm/+T8NnWGDctZs\n\t6ASznhDQaoL4ATsx3CgAK1xmRnN94RHb7OlQCJW8P/2mL4m76sUeqg7c1486AVl8eKU4\n\tU+SaXF3Al4XSmXEPAxLFe5aQeKN+TQt5Km7p2YBsAvsfVqU30cXyC6qHKYi/EYYfviJP\n\tycyHeWlM+6uRdN3wWAoTJ3dWUwGuNn201CF+wXZZzsIHMuLRSaZLgLQMctf9WQ4mooo5\n\tI4Jw==",
        "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;\n\tbh=k6PywAon4T7sx5r5xj6r19+kKO/5DpU1g0jJOlLaNt4=;\n\tb=HYOO07ytVoJq4hFpueEdvQL9tvVqM6Y8qtp35mnQNTXs94zVi3ZCyjY6TWHlTDQRvM\n\tKC/3f5YEB289jjVtYxvB61Mj0uFkLftuPbE/G/HTbAaIvHI/nsTquSBWbP+PfaHVlfTK\n\t29tK2MzPlnaUUpwQuitah9vFGSdJRgw4IopGbuRMjB6JcJTaUtLl+kvDqefNdVvDJCzv\n\tARw1U7K/bA8s/IgX7sVvle1Zgcw4xxdMPsneaTw/6Rkeb6+WwwZMFIFHzEc/NFVkRfCM\n\tR7qtT0wauk58UmV2+ZJUjqb6YShi8OlObwv7a+WPYXhzq0WOd74oUM9WAf4xPWH9adv9\n\tTFkQ==",
        "X-Gm-Message-State": "APzg51CPbCOlNEeUDW2DascSAnhgN2eDzLdNqz51z/GG836yx1urf5UH\n\tFrvVyCE6V1M1nMLHRup5ORdyvsLAPCg=",
        "X-Google-Smtp-Source": "ANB0Vdbrau7S73PAVfBcoXctbG0N8+740d5BFj16hZECDMYR2QKC3Set0e0k5XuqAhD65V8/77N0Ew==",
        "X-Received": "by 2002:a63:455d:: with SMTP id\n\tu29-v6mr12234973pgk.342.1536939029016; \n\tFri, 14 Sep 2018 08:30:29 -0700 (PDT)",
        "From": "Stephen Hemminger <stephen@networkplumber.org>",
        "To": "dev@dpdk.org",
        "Cc": "Stephen Hemminger <stephen@networkplumber.org>,\n\tStephen Hemminger <sthemmin@microsoft.com>",
        "Date": "Fri, 14 Sep 2018 08:30:19 -0700",
        "Message-Id": "<20180914153019.8983-1-stephen@networkplumber.org>",
        "X-Mailer": "git-send-email 2.18.0",
        "Subject": "[dpdk-dev] [PATCH] igb_uio: fix refcount if open returns error",
        "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": "This fixes the problem of reference count leak if\nigbuio_pci_enable_interrupts fails.\n\nAlso, replace mutex and integer with a kernel atomic counter.\nThis is standard pattern for kernel devices.\n\nFixes: 19685d5aa79c (\"igb_uio: allow multi-process access\")\nSigned-off-by: Stephen Hemminger <sthemmin@microsoft.com>\n---\n kernel/linux/igb_uio/igb_uio.c | 33 +++++++++++----------------------\n 1 file changed, 11 insertions(+), 22 deletions(-)",
    "diff": "diff --git a/kernel/linux/igb_uio/igb_uio.c b/kernel/linux/igb_uio/igb_uio.c\nindex 3398eacd3fcc..fede66cf2735 100644\n--- a/kernel/linux/igb_uio/igb_uio.c\n+++ b/kernel/linux/igb_uio/igb_uio.c\n@@ -26,8 +26,7 @@ struct rte_uio_pci_dev {\n \tstruct uio_info info;\n \tstruct pci_dev *pdev;\n \tenum rte_intr_mode mode;\n-\tstruct mutex lock;\n-\tint refcnt;\n+\tatomic_t refcnt;\n };\n \n static int wc_activate;\n@@ -320,23 +319,19 @@ igbuio_pci_open(struct uio_info *info, struct inode *inode)\n \tstruct pci_dev *dev = udev->pdev;\n \tint err;\n \n-\tmutex_lock(&udev->lock);\n-\tif (++udev->refcnt > 1) {\n-\t\tmutex_unlock(&udev->lock);\n+\tif (atomic_inc_return(&udev->refcnt) != 1)\n \t\treturn 0;\n-\t}\n \n \t/* set bus master, which was cleared by the reset function */\n \tpci_set_master(dev);\n \n \t/* enable interrupts */\n \terr = igbuio_pci_enable_interrupts(udev);\n-\tmutex_unlock(&udev->lock);\n \tif (err) {\n+\t\tatomic_dec(&udev->refcnt);\n \t\tdev_err(&dev->dev, \"Enable interrupt fails\\n\");\n-\t\treturn err;\n \t}\n-\treturn 0;\n+\treturn err;\n }\n \n static int\n@@ -345,19 +340,14 @@ igbuio_pci_release(struct uio_info *info, struct inode *inode)\n \tstruct rte_uio_pci_dev *udev = info->priv;\n \tstruct pci_dev *dev = udev->pdev;\n \n-\tmutex_lock(&udev->lock);\n-\tif (--udev->refcnt > 0) {\n-\t\tmutex_unlock(&udev->lock);\n-\t\treturn 0;\n-\t}\n-\n-\t/* disable interrupts */\n-\tigbuio_pci_disable_interrupts(udev);\n+\tif (atomic_dec_and_test(&udev->refcnt)) {\n+\t\t/* disable interrupts */\n+\t\tigbuio_pci_disable_interrupts(udev);\n \n-\t/* stop the device from further DMA */\n-\tpci_clear_master(dev);\n+\t\t/* stop the device from further DMA */\n+\t\tpci_clear_master(dev);\n+\t}\n \n-\tmutex_unlock(&udev->lock);\n \treturn 0;\n }\n \n@@ -489,7 +479,6 @@ igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)\n \tif (!udev)\n \t\treturn -ENOMEM;\n \n-\tmutex_init(&udev->lock);\n \t/*\n \t * enable device: ask low-level code to enable I/O and\n \t * memory\n@@ -529,6 +518,7 @@ igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)\n \tudev->info.release = igbuio_pci_release;\n \tudev->info.priv = udev;\n \tudev->pdev = dev;\n+\tatomic_set(&udev->refcnt, 0);\n \n \terr = sysfs_create_group(&dev->dev.kobj, &dev_attr_grp);\n \tif (err != 0)\n@@ -580,7 +570,6 @@ igbuio_pci_remove(struct pci_dev *dev)\n {\n \tstruct rte_uio_pci_dev *udev = pci_get_drvdata(dev);\n \n-\tmutex_destroy(&udev->lock);\n \tsysfs_remove_group(&dev->dev.kobj, &dev_attr_grp);\n \tuio_unregister_device(&udev->info);\n \tigbuio_pci_release_iomem(&udev->info);\n",
    "prefixes": []
}