get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 808129,
    "url": "http://patchwork.ozlabs.org/api/patches/808129/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170831082210.8362-6-stefanha@redhat.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20170831082210.8362-6-stefanha@redhat.com>",
    "list_archive_url": null,
    "date": "2017-08-31T08:22:00",
    "name": "[PULL,for-2.10,05/15] throttle: Remove throttle_fix_bucket() / throttle_unfix_bucket()",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "3b1836d59f61e25a1a51a0933db7a00075144d1f",
    "submitter": {
        "id": 17227,
        "url": "http://patchwork.ozlabs.org/api/people/17227/?format=api",
        "name": "Stefan Hajnoczi",
        "email": "stefanha@redhat.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170831082210.8362-6-stefanha@redhat.com/mbox/",
    "series": [
        {
            "id": 766,
            "url": "http://patchwork.ozlabs.org/api/series/766/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=766",
            "date": "2017-08-31T08:21:55",
            "name": "[PULL,for-2.10,01/15] nvme: Fix get/set number of queues feature, again",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/766/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/808129/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/808129/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)",
            "ext-mx02.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com",
            "ext-mx02.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=stefanha@redhat.com"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xjb9N2WRFz9t2M\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 31 Aug 2017 18:28:08 +1000 (AEST)",
            "from localhost ([::1]:54490 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dnKpa-0001GJ-BZ\n\tfor incoming@patchwork.ozlabs.org; Thu, 31 Aug 2017 04:28:06 -0400",
            "from eggs.gnu.org ([2001:4830:134:3::10]:42478)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <stefanha@redhat.com>) id 1dnKkE-0005Ke-3K\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 04:22:35 -0400",
            "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <stefanha@redhat.com>) id 1dnKkD-0005sS-0m\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 04:22:34 -0400",
            "from mx1.redhat.com ([209.132.183.28]:39280)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <stefanha@redhat.com>) id 1dnKkC-0005sK-Ol\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 04:22:32 -0400",
            "from smtp.corp.redhat.com\n\t(int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id DD0D567734;\n\tThu, 31 Aug 2017 08:22:31 +0000 (UTC)",
            "from localhost (ovpn-117-89.ams2.redhat.com [10.36.117.89])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 3226892D0B;\n\tThu, 31 Aug 2017 08:22:30 +0000 (UTC)"
        ],
        "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com DD0D567734",
        "From": "Stefan Hajnoczi <stefanha@redhat.com>",
        "To": "<qemu-devel@nongnu.org>",
        "Date": "Thu, 31 Aug 2017 09:22:00 +0100",
        "Message-Id": "<20170831082210.8362-6-stefanha@redhat.com>",
        "In-Reply-To": "<20170831082210.8362-1-stefanha@redhat.com>",
        "References": "<20170831082210.8362-1-stefanha@redhat.com>",
        "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.15",
        "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.26]);\n\tThu, 31 Aug 2017 08:22:32 +0000 (UTC)",
        "X-detected-operating-system": "by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]",
        "X-Received-From": "209.132.183.28",
        "Subject": "[Qemu-devel] [PULL for-2.10 05/15] throttle: Remove\n\tthrottle_fix_bucket() / throttle_unfix_bucket()",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.21",
        "Precedence": "list",
        "List-Id": "<qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Cc": "Peter Maydell <peter.maydell@linaro.org>,\n\tAlberto Garcia <berto@igalia.com>, Stefan Hajnoczi <stefanha@redhat.com>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"
    },
    "content": "From: Alberto Garcia <berto@igalia.com>\n\nThe throttling code can change internally the value of bkt->max if it\nhasn't been set by the user. The problem with this is that if we want\nto retrieve the original value we have to undo this change first. This\nis ugly and unnecessary: this patch removes the throttle_fix_bucket()\nand throttle_unfix_bucket() functions completely and moves the logic\nto throttle_compute_wait().\n\nSigned-off-by: Alberto Garcia <berto@igalia.com>\nReviewed-by: Manos Pitsidianakis <el13635@mail.ntua.gr>\nMessage-id: 5b0b9e1ac6eb208d709eddc7b09e7669a523bff3.1503580370.git.berto@igalia.com\nSigned-off-by: Stefan Hajnoczi <stefanha@redhat.com>\n---\n util/throttle.c | 62 +++++++++++++++++++++------------------------------------\n 1 file changed, 23 insertions(+), 39 deletions(-)",
    "diff": "diff --git a/util/throttle.c b/util/throttle.c\nindex bde56fe3de..4e80a7ea54 100644\n--- a/util/throttle.c\n+++ b/util/throttle.c\n@@ -95,23 +95,36 @@ static int64_t throttle_do_compute_wait(double limit, double extra)\n int64_t throttle_compute_wait(LeakyBucket *bkt)\n {\n     double extra; /* the number of extra units blocking the io */\n+    double bucket_size;   /* I/O before throttling to bkt->avg */\n+    double burst_bucket_size; /* Before throttling to bkt->max */\n \n     if (!bkt->avg) {\n         return 0;\n     }\n \n-    /* If the bucket is full then we have to wait */\n-    extra = bkt->level - bkt->max * bkt->burst_length;\n+    if (!bkt->max) {\n+        /* If bkt->max is 0 we still want to allow short bursts of I/O\n+         * from the guest, otherwise every other request will be throttled\n+         * and performance will suffer considerably. */\n+        bucket_size = bkt->avg / 10;\n+        burst_bucket_size = 0;\n+    } else {\n+        /* If we have a burst limit then we have to wait until all I/O\n+         * at burst rate has finished before throttling to bkt->avg */\n+        bucket_size = bkt->max * bkt->burst_length;\n+        burst_bucket_size = bkt->max / 10;\n+    }\n+\n+    /* If the main bucket is full then we have to wait */\n+    extra = bkt->level - bucket_size;\n     if (extra > 0) {\n         return throttle_do_compute_wait(bkt->avg, extra);\n     }\n \n-    /* If the bucket is not full yet we have to make sure that we\n-     * fulfill the goal of bkt->max units per second. */\n+    /* If the main bucket is not full yet we still have to check the\n+     * burst bucket in order to enforce the burst limit */\n     if (bkt->burst_length > 1) {\n-        /* We use 1/10 of the max value to smooth the throttling.\n-         * See throttle_fix_bucket() for more details. */\n-        extra = bkt->burst_level - bkt->max / 10;\n+        extra = bkt->burst_level - burst_bucket_size;\n         if (extra > 0) {\n             return throttle_do_compute_wait(bkt->max, extra);\n         }\n@@ -357,31 +370,6 @@ bool throttle_is_valid(ThrottleConfig *cfg, Error **errp)\n     return true;\n }\n \n-/* fix bucket parameters */\n-static void throttle_fix_bucket(LeakyBucket *bkt)\n-{\n-    double min;\n-\n-    /* zero bucket level */\n-    bkt->level = bkt->burst_level = 0;\n-\n-    /* If bkt->max is 0 we still want to allow short bursts of I/O\n-     * from the guest, otherwise every other request will be throttled\n-     * and performance will suffer considerably. */\n-    min = bkt->avg / 10;\n-    if (bkt->avg && !bkt->max) {\n-        bkt->max = min;\n-    }\n-}\n-\n-/* undo internal bucket parameter changes (see throttle_fix_bucket()) */\n-static void throttle_unfix_bucket(LeakyBucket *bkt)\n-{\n-    if (bkt->max < bkt->avg) {\n-        bkt->max = 0;\n-    }\n-}\n-\n /* Used to configure the throttle\n  *\n  * @ts: the throttle state we are working on\n@@ -396,8 +384,10 @@ void throttle_config(ThrottleState *ts,\n \n     ts->cfg = *cfg;\n \n+    /* Zero bucket level */\n     for (i = 0; i < BUCKETS_COUNT; i++) {\n-        throttle_fix_bucket(&ts->cfg.buckets[i]);\n+        ts->cfg.buckets[i].level = 0;\n+        ts->cfg.buckets[i].burst_level = 0;\n     }\n \n     ts->previous_leak = qemu_clock_get_ns(clock_type);\n@@ -410,13 +400,7 @@ void throttle_config(ThrottleState *ts,\n  */\n void throttle_get_config(ThrottleState *ts, ThrottleConfig *cfg)\n {\n-    int i;\n-\n     *cfg = ts->cfg;\n-\n-    for (i = 0; i < BUCKETS_COUNT; i++) {\n-        throttle_unfix_bucket(&cfg->buckets[i]);\n-    }\n }\n \n \n",
    "prefixes": [
        "PULL",
        "for-2.10",
        "05/15"
    ]
}