get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2216184,
    "url": "http://patchwork.ozlabs.org/api/patches/2216184/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/ubuntu-kernel/patch/20260325232149.127814-3-ian.whitfield@canonical.com/",
    "project": {
        "id": 15,
        "url": "http://patchwork.ozlabs.org/api/projects/15/?format=api",
        "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": "<20260325232149.127814-3-ian.whitfield@canonical.com>",
    "list_archive_url": null,
    "date": "2026-03-25T23:21:45",
    "name": "[SRU,Q:linux-gcp,2/6] iopoll: Generalize read_poll_timeout() into poll_timeout_us()",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "4fe9950498e0f5e33d0874a0bc02bb78814eec94",
    "submitter": {
        "id": 89403,
        "url": "http://patchwork.ozlabs.org/api/people/89403/?format=api",
        "name": "Ian Whitfield",
        "email": "ian.whitfield@canonical.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/ubuntu-kernel/patch/20260325232149.127814-3-ian.whitfield@canonical.com/mbox/",
    "series": [
        {
            "id": 497521,
            "url": "http://patchwork.ozlabs.org/api/series/497521/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/ubuntu-kernel/list/?series=497521",
            "date": "2026-03-25T23:21:43",
            "name": "Add irdma fixups since 6.19",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/497521/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2216184/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2216184/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<kernel-team-bounces@lists.ubuntu.com>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (4096-bit key;\n unprotected) header.d=canonical.com header.i=@canonical.com\n header.a=rsa-sha256 header.s=20251003 header.b=gboq59Hc;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com\n (client-ip=185.125.189.65; helo=lists.ubuntu.com;\n envelope-from=kernel-team-bounces@lists.ubuntu.com;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fh2x61wQtz1yGJ\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 26 Mar 2026 10:22:01 +1100 (AEDT)",
            "from localhost ([127.0.0.1] helo=lists.ubuntu.com)\n\tby lists.ubuntu.com with esmtp (Exim 4.86_2)\n\t(envelope-from <kernel-team-bounces@lists.ubuntu.com>)\n\tid 1w5XXv-0004h1-Av; Wed, 25 Mar 2026 23:21:55 +0000",
            "from smtp-relay-internal-1.internal ([10.131.114.114]\n helo=smtp-relay-internal-1.canonical.com)\n by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.86_2) (envelope-from <ian.whitfield@canonical.com>)\n id 1w5XXt-0004fM-V0\n for kernel-team@lists.ubuntu.com; Wed, 25 Mar 2026 23:21:54 +0000",
            "from mail-qt1-f197.google.com (mail-qt1-f197.google.com\n [209.85.160.197])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id C9FD23F0B1\n for <kernel-team@lists.ubuntu.com>; Wed, 25 Mar 2026 23:21:53 +0000 (UTC)",
            "by mail-qt1-f197.google.com with SMTP id\n d75a77b69052e-50b878a8c07so16055101cf.0\n for <kernel-team@lists.ubuntu.com>; Wed, 25 Mar 2026 16:21:53 -0700 (PDT)",
            "from localhost ([2600:4041:dc:e800:448b:3cc:c137:e67a])\n by smtp.gmail.com with ESMTPSA id\n d75a77b69052e-50b920f8370sm13330241cf.1.2026.03.25.16.21.51\n for <kernel-team@lists.ubuntu.com>\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Wed, 25 Mar 2026 16:21:51 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com;\n s=20251003; t=1774480913;\n bh=I1J3eOYUulRh+A353lNq0yH6MxT2LdlOcO7wCrdvwoE=;\n h=From:To:Subject:Date:Message-ID:In-Reply-To:References:\n MIME-Version:Content-Type;\n b=gboq59HcmGo0/Z3mPgmQlt4sZ19ARPleWNiaAHyQfRvBnd+gc943XGP7fGfi/4fLZ\n UzUet2DYqmuqacAOEhE78XcSzE8vjlJfi/tlAljOkC8BTRTXssBgFCrRErglabZIRH\n YHo/HtZDKBijkyicwU0p8iFXLY8aWJz1T1lxd29gx51k9WJiy2WjZHtSPzK7SH/QzY\n nQLfZKvb+f3bRGOHzh4ouYUKK2G5Xr9zSczcfsu3F9tVg6gbAq2PmY9bpgDpWMBXeG\n i6rgYsxwfcy/izdI+m+lV/krPR6icrAA0tSNnrovG8XirdJx1H0tkd9sszNcUL0cGO\n lSVm06v8LrZWYHouSy+H61DYDQ+xDFn1C6ugSu+ZS4kZb0lGatY+4NhfEMkQ9WxLX9\n nnMyoCfAW9F3RqInXXZ69Pzk06LvI4ZMdbQyuTF+ArzLhtJZnumm1AshkZS9qnEPHL\n +xsxf2i/MwkBIb+WIEdezbOb0IKOtgFEbg/QVpMymkfkGHJba6W8Bo2Li2pgAdCpnK\n zomV3xPmy1Q44lKNynBW0Uuzd4fU8dGe/onm7YLoQ6gFDxe01wlRaeq/Ecd0GXEiuG\n ixI/fZmT48K0vZR1mCdFv4+qEgzchiIJUI/Wcsh7W1o82aFlgP1hUC2hESRh8YMqGY\n eObOrwsgrC2fqUtiQ71TUgXQ=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1774480912; x=1775085712;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=I1J3eOYUulRh+A353lNq0yH6MxT2LdlOcO7wCrdvwoE=;\n b=SeeDSwR6scUSEb5Z38PerkmM/s6BydApFxCEk+X3SLcw+5bn+j90wRG5W/gaU4o6rY\n LU3TwHE7rbZlvxepVLL7RvSRIX2PQAtqlOisJnJWbMDhq99wphA43gRU366kBi7OoAND\n QJ4Ohr2zI4H2nmroAh3AwUPd7fLRVIXwAek4QiPNmUKNCHpQnP4Bo9S3RwwLGyzSEVXo\n +ZGVLVRk0ssZbkYJs2HX3M4yHC5EByM4tebY7dDr5f1ePZGT88/83tcrjlc3ZcFnayn5\n kyLES1LLptkP9sMTPFS68sAf0DtRG0Vv/OFONKm1yRRe0Y4n7VJqWcmKwC7SdoNBxQ7/\n IECA==",
        "X-Gm-Message-State": "AOJu0YwZMyijDGEI92eg3bAqn6YVJdp7GkN59hgoxuP610O/zzfhH9s0\n e+mQ+2k2QaeYQg0+DhkovhpJiEFiSokgsYY7RvMtoYmXsILY8p7arIv2SlcsvLOykDOCveY6rbD\n VSI22kWvHc9cHcntmXSUV6bzAKdWusCsMk9LheSlJ715FZ2I7ShB1AWrCFNGVou1WiQfDy5NbSe\n JvaZlROoe4AsndlA==",
        "X-Gm-Gg": "ATEYQzwd6Be991uLl2Z6DTkbPTuc0eSn/NDWbk4rA6wZ9nxTPppHMqJMoSKM9KlzlBG\n ynkAMg2C/2aYINFjIWX44v6/6vRF7A13xbs2cZeOFoqx+M+NylVSh353kaZ/eEill22KYd+KCyM\n JXla3GsY8JAaZP8pL+K7G5tV03uUNliRObnCPRjOe+C07AOmH6ikBl8MVCFIKEle0PGy6PsBhGB\n U5NoAIhckKLYcPpcpbO42m2jL1/TME20zzfmJwxWljhz2MtacNFMPYDAdvdKg3GvIuhgQoChcu4\n w9qZ2Zazz7BYhw0BIWY9GCClYyfD1rwXjqgeYd0RbXjPPLIlokNuUgn5S/fbJXqk/ZS2TSnm8VJ\n z5hl1iggPZkVoDHhNi3l/bX4A6yYI3w==",
        "X-Received": [
            "by 2002:a05:622a:5:b0:50b:4b2f:160f with SMTP id\n d75a77b69052e-50b80c9bd96mr73878931cf.2.1774480912381;\n Wed, 25 Mar 2026 16:21:52 -0700 (PDT)",
            "by 2002:a05:622a:5:b0:50b:4b2f:160f with SMTP id\n d75a77b69052e-50b80c9bd96mr73878641cf.2.1774480911853;\n Wed, 25 Mar 2026 16:21:51 -0700 (PDT)"
        ],
        "From": "Ian Whitfield <ian.whitfield@canonical.com>",
        "To": "kernel-team@lists.ubuntu.com",
        "Subject": "[SRU][Q:linux-gcp][PATCH 2/6] iopoll: Generalize read_poll_timeout()\n into poll_timeout_us()",
        "Date": "Wed, 25 Mar 2026 19:21:45 -0400",
        "Message-ID": "<20260325232149.127814-3-ian.whitfield@canonical.com>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<20260325232149.127814-1-ian.whitfield@canonical.com>",
        "References": "<20260325232149.127814-1-ian.whitfield@canonical.com>",
        "MIME-Version": "1.0",
        "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 <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 <mailto:kernel-team-request@lists.ubuntu.com?subject=subscribe>",
        "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: Ville Syrjälä <ville.syrjala@linux.intel.com>\n\nBugLink: https://bugs.launchpad.net/bugs/2146168\n\nWhile read_poll_timeout() & co. were originally introduced just\nfor simple I/O usage scenarios they have since been generalized to\nbe useful in more cases.\n\nHowever the interface is very cumbersome to use in the general case.\nAttempt to make it more flexible by combining the 'op', 'var' and\n'args' parameter into just a single 'op' that the caller can fully\nspecify.\n\nFor example i915 has one case where one might currently\nhave to write something like:\n\tret = read_poll_timeout(drm_dp_dpcd_read_byte, err,\n\t\t\t\terr || (status & mask),\n\t\t\t\t0 * 1000, 200 * 1000, false,\n\t\t\t\taux, DP_FEC_STATUS, &status);\nwhich is practically illegible, but with the adjusted macro\nwe do:\n\tret = poll_timeout_us(err = drm_dp_dpcd_read_byte(aux, DP_FEC_STATUS, &status),\n\t\t\t      err || (status & mask),\n\t\t\t      0 * 1000, 200 * 1000, false);\nwhich much easier to understand.\n\nOne could even combine the 'op' and 'cond'  parameters into\none, but that might make the caller a bit too unwieldly with\nassignments and checks being done on the same statement.\n\nThis makes poll_timeout_us() closer to the i915 __wait_for()\nmacro, with the main difference being that __wait_for() uses\nexpenential backoff as opposed to the fixed polling interval\nused by poll_timeout_us(). Eventually we might be able to switch\n(at least most of) i915 to use poll_timeout_us().\n\nv2: Fix typos (Jani)\n    Fix delay_us docs for poll_timeout_us_atomic() (Jani)\n\nCc: Lucas De Marchi <lucas.demarchi@intel.com>\nCc: Dibin Moolakadan Subrahmanian <dibin.moolakadan.subrahmanian@intel.com>\nCc: Imre Deak <imre.deak@intel.com>\nCc: David Laight <david.laight.linux@gmail.com>\nCc: Geert Uytterhoeven <geert+renesas@glider.be>\nCc: Matt Wagantall <mattw@codeaurora.org>\nCc: Dejin Zheng <zhengdejin5@gmail.com>\nCc: intel-gfx@lists.freedesktop.org\nCc: intel-xe@lists.freedesktop.org\nCc: linux-kernel@vger.kernel.org\nReviewed-by: Jani Nikula <jani.nikula@intel.com>\nAcked-by: Simona Vetter <simona.vetter@ffwll.ch>\nSigned-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>\nLink: https://lore.kernel.org/r/20250826121859.15497-1-ville.syrjala@linux.intel.com\nSigned-off-by: Jani Nikula <jani.nikula@intel.com>\n(cherry picked from commit 9df8043a546d2eb3adfaba920c027c0d701c73a1)\nSigned-off-by: Ian Whitfield <ian.whitfield@canonical.com>\n---\n include/linux/iopoll.h | 110 +++++++++++++++++++++++++++++------------\n 1 file changed, 78 insertions(+), 32 deletions(-)",
    "diff": "diff --git a/include/linux/iopoll.h b/include/linux/iopoll.h\nindex 91324c331a4b..440aca5b4b59 100644\n--- a/include/linux/iopoll.h\n+++ b/include/linux/iopoll.h\n@@ -14,41 +14,38 @@\n #include <linux/io.h>\n \n /**\n- * read_poll_timeout - Periodically poll an address until a condition is\n- *\t\t\tmet or a timeout occurs\n- * @op: accessor function (takes @args as its arguments)\n- * @val: Variable to read the value into\n- * @cond: Break condition (usually involving @val)\n- * @sleep_us: Maximum time to sleep between reads in us (0 tight-loops). Please\n- *            read usleep_range() function description for details and\n+ * poll_timeout_us - Periodically poll and perform an operation until\n+ *                   a condition is met or a timeout occurs\n+ *\n+ * @op: Operation\n+ * @cond: Break condition\n+ * @sleep_us: Maximum time to sleep between operations in us (0 tight-loops).\n+ *            Please read usleep_range() function description for details and\n  *            limitations.\n  * @timeout_us: Timeout in us, 0 means never timeout\n- * @sleep_before_read: if it is true, sleep @sleep_us before read.\n- * @args: arguments for @op poll\n+ * @sleep_before_op: if it is true, sleep @sleep_us before operation.\n  *\n  * When available, you'll probably want to use one of the specialized\n  * macros defined below rather than this macro directly.\n  *\n- * Returns: 0 on success and -ETIMEDOUT upon a timeout. In either\n- * case, the last read value at @args is stored in @val. Must not\n+ * Returns: 0 on success and -ETIMEDOUT upon a timeout. Must not\n  * be called from atomic context if sleep_us or timeout_us are used.\n  */\n-#define read_poll_timeout(op, val, cond, sleep_us, timeout_us, \\\n-\t\t\t\tsleep_before_read, args...) \\\n+#define poll_timeout_us(op, cond, sleep_us, timeout_us, sleep_before_op) \\\n ({ \\\n \tu64 __timeout_us = (timeout_us); \\\n \tunsigned long __sleep_us = (sleep_us); \\\n \tktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \\\n \tmight_sleep_if((__sleep_us) != 0); \\\n-\tif (sleep_before_read && __sleep_us) \\\n+\tif ((sleep_before_op) && __sleep_us) \\\n \t\tusleep_range((__sleep_us >> 2) + 1, __sleep_us); \\\n \tfor (;;) { \\\n-\t\t(val) = op(args); \\\n+\t\top; \\\n \t\tif (cond) \\\n \t\t\tbreak; \\\n \t\tif (__timeout_us && \\\n \t\t    ktime_compare(ktime_get(), __timeout) > 0) { \\\n-\t\t\t(val) = op(args); \\\n+\t\t\top; \\\n \t\t\tbreak; \\\n \t\t} \\\n \t\tif (__sleep_us) \\\n@@ -59,17 +56,16 @@\n })\n \n /**\n- * read_poll_timeout_atomic - Periodically poll an address until a condition is\n- * \t\t\t\tmet or a timeout occurs\n- * @op: accessor function (takes @args as its arguments)\n- * @val: Variable to read the value into\n- * @cond: Break condition (usually involving @val)\n- * @delay_us: Time to udelay between reads in us (0 tight-loops). Please\n- *            read udelay() function description for details and\n+ * poll_timeout_us_atomic - Periodically poll and perform an operation until\n+ *                          a condition is met or a timeout occurs\n+ *\n+ * @op: Operation\n+ * @cond: Break condition\n+ * @delay_us: Time to udelay between operations in us (0 tight-loops).\n+ *            Please read udelay() function description for details and\n  *            limitations.\n  * @timeout_us: Timeout in us, 0 means never timeout\n- * @delay_before_read: if it is true, delay @delay_us before read.\n- * @args: arguments for @op poll\n+ * @delay_before_op: if it is true, delay @delay_us before operation.\n  *\n  * This macro does not rely on timekeeping.  Hence it is safe to call even when\n  * timekeeping is suspended, at the expense of an underestimation of wall clock\n@@ -78,27 +74,26 @@\n  * When available, you'll probably want to use one of the specialized\n  * macros defined below rather than this macro directly.\n  *\n- * Returns: 0 on success and -ETIMEDOUT upon a timeout. In either\n- * case, the last read value at @args is stored in @val.\n+ * Returns: 0 on success and -ETIMEDOUT upon a timeout.\n  */\n-#define read_poll_timeout_atomic(op, val, cond, delay_us, timeout_us, \\\n-\t\t\t\t\tdelay_before_read, args...) \\\n+#define poll_timeout_us_atomic(op, cond, delay_us, timeout_us, \\\n+\t\t\t       delay_before_op) \\\n ({ \\\n \tu64 __timeout_us = (timeout_us); \\\n \ts64 __left_ns = __timeout_us * NSEC_PER_USEC; \\\n \tunsigned long __delay_us = (delay_us); \\\n \tu64 __delay_ns = __delay_us * NSEC_PER_USEC; \\\n-\tif (delay_before_read && __delay_us) { \\\n+\tif ((delay_before_op) && __delay_us) { \\\n \t\tudelay(__delay_us); \\\n \t\tif (__timeout_us) \\\n \t\t\t__left_ns -= __delay_ns; \\\n \t} \\\n \tfor (;;) { \\\n-\t\t(val) = op(args); \\\n+\t\top; \\\n \t\tif (cond) \\\n \t\t\tbreak; \\\n \t\tif (__timeout_us && __left_ns < 0) { \\\n-\t\t\t(val) = op(args); \\\n+\t\t\top; \\\n \t\t\tbreak; \\\n \t\t} \\\n \t\tif (__delay_us) { \\\n@@ -113,6 +108,57 @@\n \t(cond) ? 0 : -ETIMEDOUT; \\\n })\n \n+/**\n+ * read_poll_timeout - Periodically poll an address until a condition is\n+ *                     met or a timeout occurs\n+ * @op: accessor function (takes @args as its arguments)\n+ * @val: Variable to read the value into\n+ * @cond: Break condition (usually involving @val)\n+ * @sleep_us: Maximum time to sleep between reads in us (0 tight-loops). Please\n+ *            read usleep_range() function description for details and\n+ *            limitations.\n+ * @timeout_us: Timeout in us, 0 means never timeout\n+ * @sleep_before_read: if it is true, sleep @sleep_us before read.\n+ * @args: arguments for @op poll\n+ *\n+ * When available, you'll probably want to use one of the specialized\n+ * macros defined below rather than this macro directly.\n+ *\n+ * Returns: 0 on success and -ETIMEDOUT upon a timeout. In either\n+ * case, the last read value at @args is stored in @val. Must not\n+ * be called from atomic context if sleep_us or timeout_us are used.\n+ */\n+#define read_poll_timeout(op, val, cond, sleep_us, timeout_us, \\\n+\t\t\t  sleep_before_read, args...) \\\n+\tpoll_timeout_us((val) = op(args), cond, sleep_us, timeout_us, sleep_before_read)\n+\n+/**\n+ * read_poll_timeout_atomic - Periodically poll an address until a condition is\n+ *                            met or a timeout occurs\n+ * @op: accessor function (takes @args as its arguments)\n+ * @val: Variable to read the value into\n+ * @cond: Break condition (usually involving @val)\n+ * @delay_us: Time to udelay between reads in us (0 tight-loops). Please\n+ *            read udelay() function description for details and\n+ *            limitations.\n+ * @timeout_us: Timeout in us, 0 means never timeout\n+ * @delay_before_read: if it is true, delay @delay_us before read.\n+ * @args: arguments for @op poll\n+ *\n+ * This macro does not rely on timekeeping.  Hence it is safe to call even when\n+ * timekeeping is suspended, at the expense of an underestimation of wall clock\n+ * time, which is rather minimal with a non-zero delay_us.\n+ *\n+ * When available, you'll probably want to use one of the specialized\n+ * macros defined below rather than this macro directly.\n+ *\n+ * Returns: 0 on success and -ETIMEDOUT upon a timeout. In either\n+ * case, the last read value at @args is stored in @val.\n+ */\n+#define read_poll_timeout_atomic(op, val, cond, sleep_us, timeout_us, \\\n+\t\t\t\t sleep_before_read, args...) \\\n+\tpoll_timeout_us_atomic((val) = op(args), cond, sleep_us, timeout_us, sleep_before_read)\n+\n /**\n  * readx_poll_timeout - Periodically poll an address until a condition is met or a timeout occurs\n  * @op: accessor function (takes @addr as its only argument)\n",
    "prefixes": [
        "SRU",
        "Q:linux-gcp",
        "2/6"
    ]
}