get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2219070,
    "url": "http://patchwork.ozlabs.org/api/patches/2219070/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/ltp/patch/20260402121356.31266-5-chrubis@suse.cz/",
    "project": {
        "id": 59,
        "url": "http://patchwork.ozlabs.org/api/projects/59/?format=api",
        "name": "Linux Test Project development",
        "link_name": "ltp",
        "list_id": "ltp.lists.linux.it",
        "list_email": "ltp@lists.linux.it",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260402121356.31266-5-chrubis@suse.cz>",
    "list_archive_url": null,
    "date": "2026-04-02T12:13:43",
    "name": "[04/17] lib: tst_kconfig: Add module presence checks",
    "commit_ref": null,
    "pull_url": null,
    "state": "needs-review-ack",
    "archived": false,
    "hash": "0f2e2550d17304e7d50253045be075646170bb4f",
    "submitter": {
        "id": 8530,
        "url": "http://patchwork.ozlabs.org/api/people/8530/?format=api",
        "name": "Cyril Hrubis",
        "email": "chrubis@suse.cz"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/ltp/patch/20260402121356.31266-5-chrubis@suse.cz/mbox/",
    "series": [
        {
            "id": 498474,
            "url": "http://patchwork.ozlabs.org/api/series/498474/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/ltp/list/?series=498474",
            "date": "2026-04-02T12:13:40",
            "name": "Replace needs_drivers with needs_kconfigs",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/498474/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2219070/comments/",
    "check": "success",
    "checks": "http://patchwork.ozlabs.org/api/patches/2219070/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "ltp@lists.linux.it"
        ],
        "Delivered-To": [
            "patchwork-incoming@legolas.ozlabs.org",
            "ltp@picard.linux.it"
        ],
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n unprotected) header.d=suse.cz header.i=@suse.cz header.a=rsa-sha256\n header.s=susede2_rsa header.b=EfQ3SlG7;\n\tdkim=fail reason=\"signature verification failed\" header.d=suse.cz\n header.i=@suse.cz header.a=ed25519-sha256 header.s=susede2_ed25519\n header.b=ZXu5TD9C;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key)\n header.d=suse.cz header.i=@suse.cz header.a=rsa-sha256 header.s=susede2_rsa\n header.b=EfQ3SlG7;\n\tdkim=neutral header.d=suse.cz header.i=@suse.cz header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=ZXu5TD9C;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.linux.it\n (client-ip=2001:1418:10:5::2; helo=picard.linux.it;\n envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it;\n receiver=patchwork.ozlabs.org)",
            "smtp-out1.suse.de;\n\tnone"
        ],
        "Received": [
            "from picard.linux.it (picard.linux.it [IPv6:2001:1418:10:5::2])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fmgmC6WQVz1yGH\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 02 Apr 2026 23:15:23 +1100 (AEDT)",
            "from picard.linux.it (localhost [IPv6:::1])\n\tby picard.linux.it (Postfix) with ESMTP id EC2343E1C3E\n\tfor <incoming@patchwork.ozlabs.org>; Thu,  2 Apr 2026 14:15:21 +0200 (CEST)",
            "from in-5.smtp.seeweb.it (in-5.smtp.seeweb.it [217.194.8.5])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n (No client certificate requested)\n by picard.linux.it (Postfix) with ESMTPS id E96C13E2F52\n for <ltp@lists.linux.it>; Thu,  2 Apr 2026 14:14:06 +0200 (CEST)",
            "from smtp-out1.suse.de (smtp-out1.suse.de\n [IPv6:2a07:de40:b251:101:10:150:64:1])\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 in-5.smtp.seeweb.it (Postfix) with ESMTPS id 150C9600D60\n for <ltp@lists.linux.it>; Thu,  2 Apr 2026 14:14:05 +0200 (CEST)",
            "from imap1.dmz-prg2.suse.org (unknown [10.150.64.97])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by smtp-out1.suse.de (Postfix) with ESMTPS id 9740E4D333\n for <ltp@lists.linux.it>; Thu,  2 Apr 2026 12:13:57 +0000 (UTC)",
            "from imap1.dmz-prg2.suse.org (localhost [127.0.0.1])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 891AC4A0B0\n for <ltp@lists.linux.it>; Thu,  2 Apr 2026 12:13:57 +0000 (UTC)",
            "from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167])\n by imap1.dmz-prg2.suse.org with ESMTPSA id caGTIIVdzmmmDgAAD6G6ig\n (envelope-from <chrubis@suse.cz>)\n for <ltp@lists.linux.it>; Thu, 02 Apr 2026 12:13:57 +0000"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz;\n s=susede2_rsa;\n t=1775132037; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:\n mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=5WmuSyuMYPXgpEKIuGobXLT9r285Nrwx2nEYwFtDVWc=;\n b=EfQ3SlG7/uQMetlk/jd956C2nawjsUYZlGOK66rJH6y4G5Q4IVkiAwIysuurtVEgdazKLE\n wgM3Iz3J0woeivGXsaN4Cw48QYaVluQbghO9KvnRgIPFsfNY/n8atWY0XBYaYtM5Bgs60r\n 5DqTPa12pRsF8NEhYCszVkQ15Web2Xw=",
            "v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz;\n s=susede2_ed25519; t=1775132037;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:\n mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=5WmuSyuMYPXgpEKIuGobXLT9r285Nrwx2nEYwFtDVWc=;\n b=ZXu5TD9CNA+zBjTyV/b2t6UMSgmgt2KOehvaXJTI/MdGYzfPCCkRmFcCyiHBg1+MBvBuD8\n eVQTVKPsJjQBMdAg==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz;\n s=susede2_rsa;\n t=1775132037; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:\n mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=5WmuSyuMYPXgpEKIuGobXLT9r285Nrwx2nEYwFtDVWc=;\n b=EfQ3SlG7/uQMetlk/jd956C2nawjsUYZlGOK66rJH6y4G5Q4IVkiAwIysuurtVEgdazKLE\n wgM3Iz3J0woeivGXsaN4Cw48QYaVluQbghO9KvnRgIPFsfNY/n8atWY0XBYaYtM5Bgs60r\n 5DqTPa12pRsF8NEhYCszVkQ15Web2Xw=",
            "v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz;\n s=susede2_ed25519; t=1775132037;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:\n mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=5WmuSyuMYPXgpEKIuGobXLT9r285Nrwx2nEYwFtDVWc=;\n b=ZXu5TD9CNA+zBjTyV/b2t6UMSgmgt2KOehvaXJTI/MdGYzfPCCkRmFcCyiHBg1+MBvBuD8\n eVQTVKPsJjQBMdAg=="
        ],
        "From": "Cyril Hrubis <chrubis@suse.cz>",
        "To": "ltp@lists.linux.it",
        "Date": "Thu,  2 Apr 2026 14:13:43 +0200",
        "Message-ID": "<20260402121356.31266-5-chrubis@suse.cz>",
        "X-Mailer": "git-send-email 2.52.0",
        "In-Reply-To": "<20260402121356.31266-1-chrubis@suse.cz>",
        "References": "<20260402121356.31266-1-chrubis@suse.cz>",
        "MIME-Version": "1.0",
        "X-Spamd-Result": "default: False [-2.80 / 50.00]; BAYES_HAM(-3.00)[100.00%];\n NEURAL_HAM_LONG(-1.00)[-1.000]; MID_CONTAINS_FROM(1.00)[];\n R_MISSING_CHARSET(0.50)[]; NEURAL_HAM_SHORT(-0.20)[-1.000];\n MIME_GOOD(-0.10)[text/plain];\n FUZZY_RATELIMITED(0.00)[rspamd.com];\n RCVD_VIA_SMTP_AUTH(0.00)[]; RCPT_COUNT_ONE(0.00)[1];\n ARC_NA(0.00)[];\n DKIM_SIGNED(0.00)[suse.cz:s=susede2_rsa,suse.cz:s=susede2_ed25519];\n DBL_BLOCKED_OPENRESOLVER(0.00)[imap1.dmz-prg2.suse.org:helo,suse.cz:mid,suse.cz:email];\n FROM_EQ_ENVFROM(0.00)[]; FROM_HAS_DN(0.00)[];\n MIME_TRACE(0.00)[0:+]; RCVD_COUNT_TWO(0.00)[2];\n TO_MATCH_ENVRCPT_ALL(0.00)[]; TO_DN_NONE(0.00)[];\n PREVIOUSLY_DELIVERED(0.00)[ltp@lists.linux.it];\n RCVD_TLS_ALL(0.00)[]",
        "X-Spam-Score": "-2.80",
        "X-Spam-Level": "",
        "X-Spam-Status": "No, score=0.1 required=7.0 tests=DKIM_SIGNED,DKIM_VALID,\n DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS shortcircuit=no\n autolearn=disabled version=4.0.1",
        "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on in-5.smtp.seeweb.it",
        "X-Virus-Scanned": "clamav-milter 1.0.9 at in-5.smtp.seeweb.it",
        "X-Virus-Status": "Clean",
        "Subject": "[LTP] [PATCH 04/17] lib: tst_kconfig: Add module presence checks",
        "X-BeenThere": "ltp@lists.linux.it",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "Linux Test Project <ltp.lists.linux.it>",
        "List-Unsubscribe": "<https://lists.linux.it/options/ltp>,\n <mailto:ltp-request@lists.linux.it?subject=unsubscribe>",
        "List-Archive": "<http://lists.linux.it/pipermail/ltp/>",
        "List-Post": "<mailto:ltp@lists.linux.it>",
        "List-Help": "<mailto:ltp-request@lists.linux.it?subject=help>",
        "List-Subscribe": "<https://lists.linux.it/listinfo/ltp>,\n <mailto:ltp-request@lists.linux.it?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it",
        "Sender": "\"ltp\" <ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it>"
    },
    "content": "The .needs_kconfig and .needs_drivers fields in the tst_test structure\nhad overlaping functionality. Both were checking if a functionality was\nbuild in into the kernel or compiled as a driver. Similarily to the\nruntime checks added to tst_kconfig modules can be build but packaged\ninto separate packages and may not be installed on the system even if\ncorresponding config option was set to 'm'.\n\nThis commit adds a mapping table from CONFIG options to module names for\nthe modules we care about. Most of the time the mapping is trivial, but\nsome CONFIG options does not really match the module name, hence we need\na mapping. We may also be able to generate the table from kernel config\ninfrastructure later on, but at this point the number of options is\nsmall enough to be manageable by hand editing.\n\nOnce we have that mapping we can run aditional check for a module\npresence if the confing option was set to 'm' and if mapping exists in\norder to disable the config option when the module was not found.\n\nSigned-off-by: Cyril Hrubis <chrubis@suse.cz>\n---\n lib/tst_kconfig.c | 41 +++++++++++++++++++++++++++++++++++++++++\n 1 file changed, 41 insertions(+)",
    "diff": "diff --git a/lib/tst_kconfig.c b/lib/tst_kconfig.c\nindex 52dd6d726..c5dd97a45 100644\n--- a/lib/tst_kconfig.c\n+++ b/lib/tst_kconfig.c\n@@ -144,6 +144,46 @@ static void runtime_check(struct tst_kconfig_var *var)\n \t}\n }\n \n+static struct module_check {\n+\tconst char *config;\n+\tconst char *module_name;\n+} module_checks[] = {\n+\t{\"CONFIG_KVM\", \"kvm\"},\n+\t{\"CONFIG_ZRAM\", \"zram\"},\n+\t{\"CONFIG_SQUASHFS\", \"squashfs\"},\n+\t{\"CONFIG_BLK_DEV_LOOP\", \"loop\"},\n+\t{\"CONFIG_TUN\", \"tun\"},\n+\t{\"CONFIG_BLK_DEV_RAM\", \"brd\"},\n+\t{\"CONFIG_HWPOISON_INJECT\", \"hwpoison_inject\"},\n+\t{\"CONFIG_QFMT_V2\", \"quota_v2\"},\n+\t{\"CONFIG_INPUT_UINPUT\", \"uinput\"},\n+\t{\"CONFIG_DUMMY\", \"dummy\"},\n+\t{\"CONFIG_CAN_VCAN\", \"vcan\"},\n+\t{\"CONFIG_CAN_RAW\", \"can-raw\"},\n+\t{\"CONFIG_CAN_BCM\", \"can-bcm\"},\n+\t{\"CONFIG_IP_SCTP\", \"sctp\"},\n+\t{}\n+};\n+\n+static void module_check(struct tst_kconfig_var *var)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; module_checks[i].config; i++) {\n+\t\tif (strcmp(module_checks[i].config, var->id))\n+\t\t\tcontinue;\n+\n+\t\ttst_res(TDEBUG, \"Running module check for '%s'\", var->id);\n+\n+\t\tif (tst_check_module_driver(module_checks[i].module_name)) {\n+\t\t\ttst_res(TINFO, \"%s=%c present but module '%s' not installed\",\n+\t\t\t\t\tvar->id, var->choice, module_checks[i].module_name);\n+\t\t\tvar->choice = 'n';\n+\t\t\treturn;\n+\t\t}\n+\t}\n+}\n+\n static inline int kconfig_parse_line(const char *line,\n                                      struct tst_kconfig_var *vars,\n                                      unsigned int vars_len)\n@@ -222,6 +262,7 @@ out:\n \t\t\tcase 'm':\n \t\t\t\tvars[i].choice = 'm';\n \t\t\t\truntime_check(&vars[i]);\n+\t\t\t\tmodule_check(&vars[i]);\n \t\t\t\treturn 1;\n \t\t\t}\n \t\t}\n",
    "prefixes": [
        "04/17"
    ]
}