Cover Letter Detail
Show a cover letter.
GET /api/covers/2197739/?format=api
{ "id": 2197739, "url": "http://patchwork.ozlabs.org/api/covers/2197739/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/cover/20260218132633.29748-1-hreitz@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": "<20260218132633.29748-1-hreitz@redhat.com>", "list_archive_url": null, "date": "2026-02-18T13:26:09", "name": "[v4,00/24] export/fuse: Use coroutines and multi-threading", "submitter": { "id": 82279, "url": "http://patchwork.ozlabs.org/api/people/82279/?format=api", "name": "Hanna Czenczek", "email": "hreitz@redhat.com" }, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/cover/20260218132633.29748-1-hreitz@redhat.com/mbox/", "series": [ { "id": 492547, "url": "http://patchwork.ozlabs.org/api/series/492547/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=492547", "date": "2026-02-18T13:26:09", "name": "export/fuse: Use coroutines and multi-threading", "version": 4, "mbox": "http://patchwork.ozlabs.org/series/492547/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/covers/2197739/comments/", "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=KK5SS2ok;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=google header.b=HYRJ5yIp;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from lists.gnu.org (lists.gnu.org [209.51.188.17])\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 4fGHWr40Rsz1xwr\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 19 Feb 2026 00:33:12 +1100 (AEDT)", "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1vshfM-0003wU-3w; Wed, 18 Feb 2026 08:32:33 -0500", "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <hreitz@redhat.com>) id 1vshfI-0003vG-9J\n for qemu-devel@nongnu.org; Wed, 18 Feb 2026 08:32:28 -0500", "from us-smtp-delivery-124.mimecast.com ([170.10.133.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <hreitz@redhat.com>) id 1vshf4-00053X-Po\n for qemu-devel@nongnu.org; Wed, 18 Feb 2026 08:32:28 -0500", "from mail-wm1-f70.google.com (mail-wm1-f70.google.com\n [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-424-erO8PW0XMIqsjIkhbWA8dQ-1; Wed, 18 Feb 2026 08:26:43 -0500", "by mail-wm1-f70.google.com with SMTP id\n 5b1f17b1804b1-4836e35292cso41345905e9.1\n for <qemu-devel@nongnu.org>; Wed, 18 Feb 2026 05:26:42 -0800 (PST)", "from localhost\n (p200300cfd737d029edef7b8da7441ac2.dip0.t-ipconnect.de.\n [2003:cf:d737:d029:edef:7b8d:a744:1ac2])\n by smtp.gmail.com with ESMTPSA id\n 5b1f17b1804b1-4834d8334a8sm618595665e9.12.2026.02.18.05.26.39\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Wed, 18 Feb 2026 05:26:39 -0800 (PST)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1771421521;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:\n content-type:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding;\n bh=1kmaGr0mcvHIgHTxsf78XZVt9XWkGt61UUQPx8EQH1s=;\n b=KK5SS2okh2wc4QUPMqVN4/0dxWlj1cay5N9X1D5UcMuF18Ha9+SKbCx7J2+RZKk5rgcHny\n n2Rfgq/q6CzPGCBYIQVpToO6iaNt7risbuDRZKH0xzjvWmplv0hMQiO8CtSmo9oFKySC1P\n fl2Tian3eBQZZJ0clC4qXZvMSAcNlyc=", "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=redhat.com; s=google; t=1771421202; x=1772026002; darn=nongnu.org;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:from:to:cc:subject:date:message-id:reply-to;\n bh=1kmaGr0mcvHIgHTxsf78XZVt9XWkGt61UUQPx8EQH1s=;\n b=HYRJ5yIpv9pZXRRcYahkHWAzTJnpu5yPxAs2hxLRu8dCfB75HtYlW1TWfxgtTwAGN8\n NrSmDzn/kdtm83co4iJg9lDou6uglQ8M9/UQYTbXUmOkKZO09kvBa4Ct7Sji7gvaUQVa\n c0AUAyTHN7BGynIefAJyTAxVM3HyTqItnRblu/LnDCIc8gQHmVu7JfXVaRqZo4JaOLtV\n s2hVQveuxUQ4YNV+nuX17YsX5+K1YL0moOAu6FiIWJppBx2vJPk/CpX3M6cJUUXA5Rsw\n lZvvbQFPQc0hVkPsBDCUPK0oczlqsqBNWei2MO6lcctduhJnjQW5EzHq1wsF5Hfro1+y\n P4AQ==" ], "X-MC-Unique": "erO8PW0XMIqsjIkhbWA8dQ-1", "X-Mimecast-MFC-AGG-ID": "erO8PW0XMIqsjIkhbWA8dQ_1771421202", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1771421202; x=1772026002;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=1kmaGr0mcvHIgHTxsf78XZVt9XWkGt61UUQPx8EQH1s=;\n b=kVJO6f7iC5+HfOZ7/66a7TSjM0h6FbQhVouwA+liIW/1xI9sG4V+FYPNpJfOQ2B7hG\n BW3ASlxU3RjwZIG5aMcg6XbSTG3S1YkwsH/uYgsKvggQc/1AGqWZccBEO3XHQWfwTdrl\n RdxbooSf6EK3TP8j8q9qH2n//MiGE+Y5nKilTCyf31PjHq/3jt4WEfuk6t6oHAJ1poRw\n qbBH4d0DinxTWa5Q209NRkxAphxl5yCeaCa+HPmnshLoS4bKepvZawvK6coJJXLvQRM4\n K59vqlEwBj6GiKa04sOWvvdVJUaHE6/fc+oWD+dNjJ84CQEHWFwKT0vukX2nGLEEW9wZ\n FSUQ==", "X-Gm-Message-State": "AOJu0YzbDthwMD24tcziNYAm2MWHkLeXiLvwsekY85K+juHM+y1tsfqt\n G3CX4drnquXf+zZ/IeAKzI5UQ40a1ucgCwg7XteKJYDgaz6ONvr5Eo0MGnmPY5DU0eqjESIidvp\n zEyh+OkNL+TvvkvLxmtpUboMXXnN9tUNUn8TtJIjRLg63Mhv95FUfUemo", "X-Gm-Gg": "AZuq6aJHxzQRksae755+bd1QBaHS4URG4Y99ZMt6KL7/MkhPKkyetn/m6EBapEN2xlw\n dZ9MBZkz1En/1FEEXEWizR0Y0hyPXcyo2Ogd+xC7uQK/4FWAteUaswjvP4I6KK29TyiyxjtxAzo\n CRLD860RF9wzaXvaDeep80xh0HMVeHVGc22QZXlCDhyF7aCtfTT1jEel4efqJ0xQ+CIPS9YFhS2\n +LSlsCwD0e5O4pcV0iG+FD00bbnJJD6aKEuPqwuwWgLL2tfbSErSO99gn8RzVx1op/KkEite1lb\n 67ac0JhTp3GMTZnhR5BWweIV1iHkNvWoMxqH4iYoYFPTaf+HXjMptfpypEv4TSSFu+uXAiJ1k5/\n CXJPcIkasf/yneCktXfpe75i3h2m0l4QDTemm0aB4vXVu9IcheLDsWvVFVSLAGExUxLl8facGfl\n 7/F4Vi", "X-Received": [ "by 2002:a05:600c:4e4d:b0:477:c478:46d7 with SMTP id\n 5b1f17b1804b1-48373a3e749mr294261185e9.22.1771421201608;\n Wed, 18 Feb 2026 05:26:41 -0800 (PST)", "by 2002:a05:600c:4e4d:b0:477:c478:46d7 with SMTP id\n 5b1f17b1804b1-48373a3e749mr294260705e9.22.1771421201143;\n Wed, 18 Feb 2026 05:26:41 -0800 (PST)" ], "From": "Hanna Czenczek <hreitz@redhat.com>", "To": "qemu-block@nongnu.org", "Cc": "qemu-devel@nongnu.org, Hanna Czenczek <hreitz@redhat.com>,\n Kevin Wolf <kwolf@redhat.com>, Brian Song <hibriansong@gmail.com>", "Subject": "[PATCH v4 00/24] export/fuse: Use coroutines and multi-threading", "Date": "Wed, 18 Feb 2026 14:26:09 +0100", "Message-ID": "<20260218132633.29748-1-hreitz@redhat.com>", "X-Mailer": "git-send-email 2.53.0", "MIME-Version": "1.0", "Content-Type": [ "text/plain; charset=UTF-8", "text/plain; charset=UTF-8" ], "Content-Transfer-Encoding": "8bit", "Received-SPF": "pass client-ip=170.10.133.124; envelope-from=hreitz@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com", "X-Spam_score_int": "-20", "X-Spam_score": "-2.1", "X-Spam_bar": "--", "X-Spam_report": "(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.043,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_PASS=-0.001,\n SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no", "X-Spam_action": "no action", "X-BeenThere": "qemu-devel@nongnu.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "qemu development <qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<https://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 <mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org" }, "content": "Hi,\n\nThis series:\n- Fixes some bugs/minor inconveniences,\n- Removes libfuse from the request processing path,\n- Make the FUSE export use coroutines for request handling,\n\nMore detail on the v1 cover letter:\nhttps://lists.nongnu.org/archive/html/qemu-block/2025-03/msg00359.html\n\nv2 cover letter:\nhttps://lists.nongnu.org/archive/html/qemu-block/2025-06/msg00040.html\n\nv3 cover letter:\nhttps://lists.nongnu.org/archive/html/qemu-block/2025-07/msg00005.html\n\n\nI noticed some performance differences vs. my previous benchmarks;\nnotably, performance didn’t improve with the introduction of coroutines\nmuch (except for random read performance). However, when I run the same\nbenchmarks on the old branch again, I see no performance improvement\neither. Something about my host system must have changed.\n\n\nChanges from v3:\n- Patch 1: Use QEMU_AUTO_VFREE\n- Patch 6: Added (fix for pre-existing bug)\n- Patch 11: Make flag atomic, better this way for multithreading later\n- Patch 12: Rename not only in fuse_write(), but fuse_read() as well\n- Patch 13: Added (don’t truncate if we don’t want to test that)\n- Patch 14: Added (fix for pre-existing bugs)\n- Patch 16: Rewrote core parts:\n - Remove the macros to handle different FUSE requests in the same\n buffer, instead use unions\n - Restructure how we read data from FUSE:\n No longer one request_buf per queue, but instead a non-WRITE buffer\n on the stack, and a WRITE data buffer on the heap. We pass this via\n readv(), but it means that for non-WRITE requests, data that we want\n on the stack may spill into the heap buffer, so we need to copy it\n back. We cache the data buffer between non-WRITE requests so we at\n least don’t have to reallocate it all the time.\n - Actually take care of older FUSE versions down to 7.9 (2007)\n - Handle some more requests that should be handled: STATFS, DESTROY,\n FORGET, BATCH_FORGET\n - Don’t handle short writes on /dev/fuse\n - Move initializing fuse_out_header into the callers of\n fuse_write_response() and fuse_write_buf_response()\n- Patch 18: Rebase conflicts because of patch 16, and removed the unused\n FuseRequestCoParam\n- Patch 19: Adhere to QAPI max line length\n- Patch 21: Added, not sure if absolutely necessary, but won’t hurt\n either\n- Patch 22: Rebase conflicts because of patch 16\n\n\ngit-backport-diff from v3:\n\nKey:\n[----] : patches are identical\n[####] : number of functional differences between upstream/downstream patch\n[down] : patch is downstream-only\nThe flags [FC] indicate (F)unctional and (C)ontextual differences, respectively\n\n001/24:[0009] [FC] 'fuse: Copy write buffer content before polling'\n002/24:[----] [--] 'fuse: Ensure init clean-up even with error_fatal'\n003/24:[----] [--] 'fuse: Remove superfluous empty line'\n004/24:[----] [--] 'fuse: Explicitly set inode ID to 1'\n005/24:[----] [--] 'fuse: Change setup_... to mount_fuse_export()'\n006/24:[down] 'fuse: Destroy session on mount_fuse_export() fail'\n007/24:[----] [--] 'fuse: Fix mount options'\n008/24:[----] [--] 'fuse: Set direct_io and parallel_direct_writes'\n009/24:[----] [--] 'fuse: Introduce fuse_{at,de}tach_handlers()'\n010/24:[----] [--] 'fuse: Introduce fuse_{inc,dec}_in_flight()'\n011/24:[0008] [FC] 'fuse: Add halted flag'\n012/24:[0012] [FC] 'fuse: fuse_{read,write}: Rename length to blk_len'\n013/24:[down] 'iotests/308: Use conv=notrunc to test growability'\n014/24:[down] 'fuse: Explicitly handle non-grow post-EOF accesses'\n015/24:[----] [--] 'block: Move qemu_fcntl_addfl() into osdep.c'\n016/24:[0718] [FC] 'fuse: Manually process requests (without libfuse)'\n017/24:[----] [-C] 'fuse: Reduce max read size'\n018/24:[0102] [FC] 'fuse: Process requests in coroutines'\n019/24:[0018] [FC] 'block/export: Add multi-threading interface'\n020/24:[----] [--] 'iotests/307: Test multi-thread export interface'\n021/24:[down] 'fuse: Make shared export state atomic'\n022/24:[0084] [FC] 'fuse: Implement multi-threading'\n023/24:[----] [--] 'qapi/block-export: Document FUSE's multi-threading'\n024/24:[----] [--] 'iotests/308: Add multi-threading sanity test'\n\n\nHanna Czenczek (24):\n fuse: Copy write buffer content before polling\n fuse: Ensure init clean-up even with error_fatal\n fuse: Remove superfluous empty line\n fuse: Explicitly set inode ID to 1\n fuse: Change setup_... to mount_fuse_export()\n fuse: Destroy session on mount_fuse_export() fail\n fuse: Fix mount options\n fuse: Set direct_io and parallel_direct_writes\n fuse: Introduce fuse_{at,de}tach_handlers()\n fuse: Introduce fuse_{inc,dec}_in_flight()\n fuse: Add halted flag\n fuse: fuse_{read,write}: Rename length to blk_len\n iotests/308: Use conv=notrunc to test growability\n fuse: Explicitly handle non-grow post-EOF accesses\n block: Move qemu_fcntl_addfl() into osdep.c\n fuse: Manually process requests (without libfuse)\n fuse: Reduce max read size\n fuse: Process requests in coroutines\n block/export: Add multi-threading interface\n iotests/307: Test multi-thread export interface\n fuse: Make shared export state atomic\n fuse: Implement multi-threading\n qapi/block-export: Document FUSE's multi-threading\n iotests/308: Add multi-threading sanity test\n\n qapi/block-export.json | 41 +-\n include/block/export.h | 12 +-\n include/qemu/osdep.h | 1 +\n block/export/export.c | 48 +-\n block/export/fuse.c | 1278 ++++++++++++++++++++------\n block/export/vduse-blk.c | 7 +\n block/export/vhost-user-blk-server.c | 8 +\n block/file-posix.c | 17 +-\n nbd/server.c | 6 +\n util/osdep.c | 18 +\n tests/qemu-iotests/307 | 47 +\n tests/qemu-iotests/307.out | 18 +\n tests/qemu-iotests/308 | 95 +-\n tests/qemu-iotests/308.out | 71 +-\n 14 files changed, 1358 insertions(+), 309 deletions(-)" }