[{"id":3675170,"web_url":"http://patchwork.ozlabs.org/comment/3675170/","msgid":"<80abd884-7d3a-48d0-875d-a95a306de3f6@gmail.com>","list_archive_url":null,"date":"2026-04-09T08:33:24","subject":"Re: [PATCH v3 4/5] hw/ufs: Add UFS Write Booster Support","submitter":{"id":86755,"url":"http://patchwork.ozlabs.org/api/people/86755/","name":"Jeuk Kim","email":"jeuk20.kim@gmail.com"},"content":"On 4/9/2026 2:37 PM, Jaemyung Lee wrote:\n> Add UFS Write Booster implementation which follows UFS 4.1 Spec.\n>\n> Signed-off-by: Jaemyung Lee <jaemyung.lee@samsung.com>\n> ---\n>   hw/ufs/lu.c         |  94 +++++++++++++++\n>   hw/ufs/ufs.c        | 333 +++++++++++++++++++++++++++++++++++++++++++++++++---\n>   hw/ufs/ufs.h        |  47 ++++++++\n>   include/block/ufs.h |  51 ++++++++\n>   4 files changed, 510 insertions(+), 15 deletions(-)\n>\n> diff --git a/hw/ufs/lu.c b/hw/ufs/lu.c\n> index 3f3c9589cee57ae3e77e2f486476d5fcec204d80..993fea8aae8d0b9135f4f1664b6cfa1bc34a9c82 100644\n> --- a/hw/ufs/lu.c\n> +++ b/hw/ufs/lu.c\n> @@ -58,6 +58,99 @@ static void ufs_build_scsi_response_upiu(UfsRequest *req, uint8_t *sense,\n>                             status, data_segment_length);\n>   }\n>   \n> +#define UFS_GROUP_NUMBER_MASK 0x1F\n> +#define UFS_WB_GROUP_NUMBER_DEFAULT 0x00 /* 00000b */\n> +#define UFS_WB_GROUP_NUMBER_PINNED 0x18 /* 11000b */\n> +static bool ufs_wb_check_write_pinned(UfsHc *u, UfsRequest *req)\n> +{\n> +    uint8_t cmd = req->req_upiu.sc.cdb[0];\n> +    uint8_t group_number = UFS_WB_GROUP_NUMBER_DEFAULT;\n> +\n> +    if (u->attributes.wb_buffer_partial_flush_mode != UFS_WB_FLUSH_PINNED) {\n> +        return false;\n> +    }\n> +\n> +    if (cmd == WRITE_16) {\n> +        group_number = req->req_upiu.sc.cdb[14] & UFS_GROUP_NUMBER_MASK;\n> +\n> +    } else if (cmd == WRITE_10) {\n> +        group_number = req->req_upiu.sc.cdb[6] & UFS_GROUP_NUMBER_MASK;\n> +    }\n> +\n> +    return (group_number == UFS_WB_GROUP_NUMBER_PINNED);\n> +}\n> +\n> +#define UFS_WB_TOTAL_WRITTEN_SHIFT 21 /* 10MB */\n> +static void ufs_wb_process_write_pinned(UfsHc *u, UfsRequest *req,\n> +                                        uint32_t transfered_len)\n`req` is unused in `ufs_wb_process_write_pinned()`.\nIt looks like this helper only needs `UfsHc *u` and `transfered_len`.\n\nThe same applies to `ufs_wb_process_write_normal()`.\n\n\n> +{\n> +    UfsWb *wb = &u->wb;\n> +    uint64_t remain_bytes, remain_data;\n> +    uint32_t total_written;\n> +\n> +    if (!wb->pinned_curr_bytes) {\n> +        return;\n> +    }\n> +\n> +    if (wb->pinned_used_bytes >= wb->pinned_curr_bytes) {\n> +        return;\n> +    }\n> +\n> +    remain_bytes = wb->pinned_curr_bytes - wb->pinned_used_bytes;\n> +    if (remain_bytes >= transfered_len) {\n> +        wb->pinned_total_written_bytes += transfered_len;\n> +        wb->pinned_used_bytes += transfered_len;\n> +        remain_data = 0;\n> +\n> +    } else {\n> +        wb->pinned_total_written_bytes += remain_bytes;\n> +        wb->pinned_used_bytes += remain_bytes;\n> +        remain_data = transfered_len - remain_bytes;\n> +    }\n> +\n> +    total_written = wb->pinned_total_written_bytes >> UFS_WB_TOTAL_WRITTEN_SHIFT;\n> +    u->attributes.pinned_wb_cumm_written_size = cpu_to_be32(total_written);\n> +\n> +    remain_bytes = wb->curr_bytes - wb->used_bytes;\n> +    wb->used_bytes += MIN(remain_bytes, remain_data);\n> +}\n> +\n> +static void ufs_wb_process_write_normal(UfsHc *u, UfsRequest *req,\n> +                                        uint32_t transfered_len)\n> +{\n> +    UfsWb *wb = &u->wb;\n> +    uint64_t curr_bytes, used_bytes, remain_bytes;\n> +\n> +    if (!wb->curr_bytes) {\n> +        return;\n> +    }\n> +\n> +    curr_bytes = wb->curr_bytes - wb->pinned_curr_bytes;\n> +    used_bytes = wb->used_bytes - wb->pinned_used_bytes;\n> +\n> +    if (used_bytes >= curr_bytes) {\n> +        return;\n> +    }\n> +\n> +    remain_bytes = curr_bytes - used_bytes;\n> +    wb->used_bytes += MIN(remain_bytes, transfered_len);\n> +}\n> +\n> +static void ufs_wb_process_write_req(UfsRequest *req, uint32_t transfered_len)\n> +{\n> +    UfsHc *u = req->hc;\n> +\n> +    if (!u->flags.wb_en || !ufs_is_write_req(req)) {\n> +        return;\n> +    }\n> +\n> +    if (ufs_wb_check_write_pinned(u, req)) {\n> +        ufs_wb_process_write_pinned(u, req, transfered_len);\n> +    } else {\n> +        ufs_wb_process_write_normal(u, req, transfered_len);\n> +    }\n> +}\n> +\n>   static void ufs_scsi_command_complete(SCSIRequest *scsi_req, size_t resid)\n>   {\n>       UfsRequest *req = scsi_req->hba_private;\n> @@ -68,6 +161,7 @@ static void ufs_scsi_command_complete(SCSIRequest *scsi_req, size_t resid)\n>       ufs_build_scsi_response_upiu(req, scsi_req->sense, scsi_req->sense_len,\n>                                    transfered_len, status);\n>   \n> +    ufs_wb_process_write_req(req, transfered_len);\n\nPlease guard `ufs_wb_process_write_req()` with `status == GOOD`. WB \naccounting should only happen for successful writes.\n\n>       ufs_complete_req(req, UFS_REQUEST_SUCCESS);\n>   \n>       scsi_req->hba_private = NULL;\n>","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 (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=MjbEYruS;\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 (lists1p.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 4frtWt6XWQz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 18:34:17 +1000 (AEST)","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 1wAkpT-0003az-MK; Thu, 09 Apr 2026 04:33:35 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <jeuk20.kim@gmail.com>)\n id 1wAkpP-0003a9-Cn\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 04:33:31 -0400","from mail-pj1-x1033.google.com ([2607:f8b0:4864:20::1033])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <jeuk20.kim@gmail.com>)\n id 1wAkpJ-0007LK-UI\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 04:33:28 -0400","by mail-pj1-x1033.google.com with SMTP id\n 98e67ed59e1d1-35da2d35eccso595678a91.0\n for <qemu-devel@nongnu.org>; Thu, 09 Apr 2026 01:33:25 -0700 (PDT)","from [192.168.0.22] ([211.226.54.223])\n by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-35e34fa9ecdsm2313212a91.4.2026.04.09.01.33.22\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Thu, 09 Apr 2026 01:33:23 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1775723604; x=1776328404; darn=nongnu.org;\n h=content-transfer-encoding:in-reply-to:from:references:cc:to\n :content-language:subject:user-agent:mime-version:date:message-id\n :from:to:cc:subject:date:message-id:reply-to;\n bh=BCfCYkGALZIJEY6dXbEnDgJcOZSiaMpydLKwK5skXeQ=;\n b=MjbEYruSsTkWoM7FSHyNobgDOJyrAiyLQQpFSVnGlrm0fbf1EusAL7RU7fm8c3snWp\n QUPq+JaMS+lTsik3fO3GRcZ9YS7EjfRHXcfVlAUTdxbUEfHe3XwBYWIhtZPYSPZpaqCO\n wGQWwM872bCcbnvtV9nf9m95++9ZFBciH43kxpQBoefWwY27t0MTIDVb7JsYiCthwEt8\n AcloepyMbRG9GIfIWOJiUdMmmPTsyH2K5igkcj+OjB3HeEhZJigHUvwAraaJ1XVykS5T\n nHCfACyAtUaW9JjJY4T9jjLsxUVupgT2Lpb2kGwrH6SVXNbT3EXXqxoFxAgQQY4V8Ctu\n vBZg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775723604; x=1776328404;\n h=content-transfer-encoding:in-reply-to:from:references:cc:to\n :content-language:subject:user-agent:mime-version:date:message-id\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=BCfCYkGALZIJEY6dXbEnDgJcOZSiaMpydLKwK5skXeQ=;\n b=aj9goKnLA4gHjINaafViU5ct1x8aDiz9UvZjxr7QsDHWRQ8lTrP1k3kaxjE1aPshKi\n pNPKTcecuP0pFlD4Qo6auZJACukbtiVTxOO2vjUz5YeovEYAKX1ZWhvpBpo2XpJqEg+m\n XM+9pVv4JBreGNF43xRqqgz6Yh/JJQA9MfI5llIVrAfQD0BJM35Vk3yh/5I2SPTs0LTV\n M6sejABE0ymTXU4U90yQbX5Nm+hHv7lxP0NDLUqP507t1v+lzh4PFXwJwPHiC017T2J5\n YlerfKNY9NhKXSD1j7NOR3FUyHrguv7+FOD8hHCps9G0oBliQzQNmf2YjzZTv/ni+bNO\n CqgQ==","X-Forwarded-Encrypted":"i=1;\n AJvYcCV1RgcU9X1JPSSz0HpQR/c2GWf3Bz5SJubzWRveTW3KyGL97Fc39Zs3y5O8QbDS454f+khVcKW/0RVZ@nongnu.org","X-Gm-Message-State":"AOJu0YxEoqU13nw4Sw4IFjZQ1SCzIpQ8sWtUD2DCp2PYartsirbBmrgq\n e0oNCjty6ozOntaCy0ZNgYd6fH3xY0KQaFk5E/7rTmj+9Swj/qg8mzZJDryWuA==","X-Gm-Gg":"AeBDieu7YlD14U5rtlSaLSvbAphbu2wdUVvUK6PZX+mlG3frpUQLD0HJ5CEckqQOaIU\n h5BTo44vHXWV75ChrYyrzUctpqSMA/OItjcMuyHHwp+zji2T0lF/eVetuHGKYMT2k06lWnROu7t\n qRtBKYqDt4mfEVdzjljoHFcGi5X/xFHRE2WehmpgmVBT123UcXWpbzIJfqWw/j8p0l9X92Kj9ce\n dzddv2g+HngEd9CNKHKaaOLjOhe4jpUIZFZc2JtaYaxMzza64QyBLlz9oN3kqG5lTfimjB45k/Y\n THFp0jgZcVcpT7HGrTatHIY5kSqE4HlP68fHVgAc3WW20ACiNfhKpTw0sYpLJavyCm/wDpt6kmc\n fqxarslpi4vUT83EO+4Vu53yYHtEBmm2+47gGkn/IzVAoVvWLx5DkgGZUg8pIZLnPHApsG2WxXx\n KrjQOrkjclCQLkXd9vG/Ef8kF65fcbSCS4brAHQFbQgA==","X-Received":"by 2002:a17:90b:52c6:b0:35b:e56e:b5a6 with SMTP id\n 98e67ed59e1d1-35e357b1faamr2245309a91.1.1775723604416;\n Thu, 09 Apr 2026 01:33:24 -0700 (PDT)","Message-ID":"<80abd884-7d3a-48d0-875d-a95a306de3f6@gmail.com>","Date":"Thu, 9 Apr 2026 17:33:24 +0900","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v3 4/5] hw/ufs: Add UFS Write Booster Support","Content-Language":"ko","To":"Jaemyung Lee <ldc.jml@gmail.com>, qemu-devel@nongnu.org","Cc":"Jeuk Kim <jeuk20.kim@samsung.com>, Kevin Wolf <kwolf@redhat.com>,\n Hanna Reitz <hreitz@redhat.com>, qemu-block@nongnu.org,\n Fabiano Rosas <farosas@suse.de>, Laurent Vivier <lvivier@redhat.com>,\n Paolo Bonzini <pbonzini@redhat.com>, Jaemyung Lee <jaemyung.lee@samsung.com>","References":"<20260409-write_booster-v3-0-dd2f1c0119c8@samsung.com>\n <20260409-write_booster-v3-4-dd2f1c0119c8@samsung.com>","From":"Jeuk Kim <jeuk20.kim@gmail.com>","In-Reply-To":"<20260409-write_booster-v3-4-dd2f1c0119c8@samsung.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Received-SPF":"pass client-ip=2607:f8b0:4864:20::1033;\n envelope-from=jeuk20.kim@gmail.com; helo=mail-pj1-x1033.google.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, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham 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"}}]