From nobody Sun Nov 16 04:16:13 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1743586350; cv=none; d=zohomail.com; s=zohoarc; b=m67HJaQT3/pd7mKVSckXJ0yX5KFDNBXzMKhU401Bb7N1w96zIdpvGiDn60N5Zsr3axg3uukW1URq37gcLM+AZ0P1VQhk07m6BhCx1B8abs3EIKrt72mnBz6on4SeeK41FvhJkYc4j6q8kPJt//rW3Y6dmGlfVmKR8Ihu64BSAp0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1743586350; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=yqvVEl8tA6R9IQjAY85z/m0Nm3Q19B3rLXCLdGwPbCQ=; b=MU2pq7qREiWazIWC+KKUXbP0Ly/ykgB7zDeFaeZFPn2zOeFGjxoPUav79IIzjQ+nCJWhEs9TK8fDyOsVgstEz/opJZUY6EWmb5kXMkti0UFKAY8RMAm6+UHVsPtJhlrVZgAqeeAHG/mQlIbFwIob+ewvreFq8mOTxMGlQXycaa8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1743586350602909.0183002176204; Wed, 2 Apr 2025 02:32:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tzuRX-0008KV-7S; Wed, 02 Apr 2025 05:31:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tzuRO-0008Jv-9X; Wed, 02 Apr 2025 05:31:28 -0400 Received: from mail-pl1-x636.google.com ([2607:f8b0:4864:20::636]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tzuRL-0004lq-NV; Wed, 02 Apr 2025 05:31:21 -0400 Received: by mail-pl1-x636.google.com with SMTP id d9443c01a7336-227a8cdd241so37603735ad.3; Wed, 02 Apr 2025 02:31:17 -0700 (PDT) Received: from queen.. ([2604:3d08:7485:e900:63e2:c940:de7a:976a]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73970e51337sm10436699b3a.82.2025.04.02.02.31.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Apr 2025 02:31:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743586276; x=1744191076; darn=nongnu.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=yqvVEl8tA6R9IQjAY85z/m0Nm3Q19B3rLXCLdGwPbCQ=; b=JcVwjDTB7UVBiZcQlNziv8AdCvhNddXfjRwz149DCi7qyvLqEZxepR+bL0Tj3LUCkJ oNVwilVSCtdu8pAAdZs0p9d0+cBu9pj/j/Nkk5a/Qo2UTuUQmunjao3djNGDyD0SXzQS OUBrrygHkCstigv94XmBYkrEmVC70gVKZ3oOGLADJWguEWwVy3QfNkLQ3tiEvckgWhrR +9auGZsS8I4Y1sCvPQhj5jGM6aQeCN48psFyg7++ybys3adWL7LcL8gj7CK32qnj4keZ 1eSp8CcwP8VktLYVMjGLLRMCat8PkWptx/mRGyTiRgSS/ADr8L0loMnwc2z1FY5vf3MT oCLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743586276; x=1744191076; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=yqvVEl8tA6R9IQjAY85z/m0Nm3Q19B3rLXCLdGwPbCQ=; b=tsqMkRAvb2ZgCgd8LieMmXKOJ+Dk0O6J4JG8oBjdJ8ufkh77p5utsQwg+tjcoG9GA2 Fe0JemQBp+bywd9qbKZzBslGpfMCYB7t4jK+F2GvEcAeVMRuUWLLulHFPBZagQ4Q2YlP vWPdbOaMT3NjvkFgT5E+zyw4F2GV08kAN1TNwcIFxo0/6PphMm0X7eIEvFP2DKvtomHJ FTUym/xdZILQL3jBrY9ERzO+YRIOapza7AOH2QJmZUZ9YlQ190xfCh2fszVm2yA69xWp yUprNUv92TGB32JHcW7EyZu+kbDzWtAeDMy1pMDF9DveEgcrURJ8p0IqZzVVnON4Jufr lnaw== X-Forwarded-Encrypted: i=1; AJvYcCWvpUpzv1dvUXbZqP9jkDDZfOoD4CzaBUG1LXPnAeIwWwgWI5TjRinqvGHjV4/2gvwSBYU1qwKDdgER@nongnu.org X-Gm-Message-State: AOJu0YwvhzQ8aRy2alBGFYqHxyPXIjKCaoq0jkOtL5MPUbl25CfPPEZV M2XgP8sF7a+dsHuD79sW++leBGKKYvFFG6aFl5Nr5K3E9DbOV/oG X-Gm-Gg: ASbGncs6lGWOhqgG6m5XFaE74sJeucJ55hNafBmprOySzLdxLj2BWyIHgJXQKcjkYNk CuBQDRyF6z8s9zUNkDXVuoCrmjuWtgP0IWN96uFefGo2cZcthdRHp8T9W+bqt97Eg9BfzeqCQRI fQEfZ70gdAb027+4V1CqFA5K18e+FNYPIWUXNs/YOrR4M6J9ka4hzss3IlGQy9EI4g6F00ocDQT PAgbBKgOUEpJHrswWnLEX1FG6rZfeZK77QEdNLWv0IYkPmzyNXRsjvCWRbK2rD0OrUUjfQWizpL z20lziKldKKnlSL1lxCQtJ2JUvOxho5jG/6okzgTa7M= X-Google-Smtp-Source: AGHT+IFa4w93ottiSz/j20RjoHWq7pojwbc09r0qgsQBUG3vl/o3crQJaqZlH0SCImbpNLCu6oEkmQ== X-Received: by 2002:a17:902:d4c4:b0:216:644f:bc0e with SMTP id d9443c01a7336-2296c6863dbmr26359545ad.24.1743586275661; Wed, 02 Apr 2025 02:31:15 -0700 (PDT) From: Pinku Deb Nath To: Stefan Hajnoczi , Kevin Wolf Cc: qemu-block@nongnu.org, qemu-devel@nongnu.org, Pinku Deb Nath Subject: [PATCH] block/file-posix.c: Use pwritev2() with RWF_DSYNC for FUA Date: Wed, 2 Apr 2025 02:31:01 -0700 Message-ID: <20250402093101.256136-1-prantoran@gmail.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::636; envelope-from=prantoran@gmail.com; helo=mail-pl1-x636.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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, 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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1743586352297019000 Content-Type: text/plain; charset="utf-8" Full Unit Access (FUA) is an optimization where a disk write with the flag set will be persisted to disk immediately instead of potentially remaining in the disk's write cache. This commit address the todo task for using pwritev2() with RWF_DSYNC in the thread pool section of raw_co_prw(), if pwritev2 with RWF_DSYNC is available in the host, which is alway for Linux kernel >=3D 4.7. The intent for FUA is indicated with the BDRV_REQ_FUA flag. The old code paths are preserved in case BDRV_REQ_FUA is off or pwritev2() with RWF_DSYNC is not available. During testing, I observed that the BDRV_REQ_FUA is always turned on when blk->enable_write_cache is not set in block/block-backend.c, so I commented this section off during testing: https://gitlab.com/qemu-project/qemu/-/blob/master/block/block-backend.c?re= f_type=3Dheads#L1432-1434 Signed-off-by: Pinku Deb Nath --- block/file-posix.c | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/block/file-posix.c b/block/file-posix.c index 56d1972d15..34de816eab 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -229,6 +229,7 @@ typedef struct RawPosixAIOData { unsigned long op; } zone_mgmt; }; + BdrvRequestFlags flags; } RawPosixAIOData; =20 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) @@ -1674,6 +1675,16 @@ qemu_pwritev(int fd, const struct iovec *iov, int nr= _iov, off_t offset) return pwritev(fd, iov, nr_iov, offset); } =20 +static ssize_t +qemu_pwrite_fua(int fd, const struct iovec *iov, int nr_iov, off_t offset) +{ +#ifdef RWF_DSYNC + return pwritev2(fd, iov, nr_iov, offset, RWF_DSYNC); +#else + return pwritev2(fd, iov, nr_iov, offset, 0); +#endif +} + #else =20 static bool preadv_present =3D false; @@ -1698,10 +1709,15 @@ static ssize_t handle_aiocb_rw_vector(RawPosixAIODa= ta *aiocb) =20 len =3D RETRY_ON_EINTR( (aiocb->aio_type & (QEMU_AIO_WRITE | QEMU_AIO_ZONE_APPEND)) ? - qemu_pwritev(aiocb->aio_fildes, - aiocb->io.iov, - aiocb->io.niov, - aiocb->aio_offset) : + (aiocb->flags & BDRV_REQ_FUA) ? + qemu_pwrite_fua(aiocb->aio_fildes, + aiocb->io.iov, + aiocb->io.niov, + aiocb->aio_offset) : + qemu_pwritev(aiocb->aio_fildes, + aiocb->io.iov, + aiocb->io.niov, + aiocb->aio_offset) : qemu_preadv(aiocb->aio_fildes, aiocb->io.iov, aiocb->io.niov, @@ -1727,10 +1743,17 @@ static ssize_t handle_aiocb_rw_linear(RawPosixAIODa= ta *aiocb, char *buf) =20 while (offset < aiocb->aio_nbytes) { if (aiocb->aio_type & (QEMU_AIO_WRITE | QEMU_AIO_ZONE_APPEND)) { - len =3D pwrite(aiocb->aio_fildes, - (const char *)buf + offset, - aiocb->aio_nbytes - offset, - aiocb->aio_offset + offset); + if (aiocb->flags & BDRV_REQ_FUA) { + len =3D qemu_pwrite_fua(aiocb->aio_fildes, + aiocb->io.iov, + aiocb->io.niov, + aiocb->aio_offset); + } else { + len =3D pwrite(aiocb->aio_fildes, + (const char *)buf + offset, + aiocb->aio_nbytes - offset, + aiocb->aio_offset + offset); + } } else { len =3D pread(aiocb->aio_fildes, buf + offset, @@ -2539,14 +2562,17 @@ static int coroutine_fn raw_co_prw(BlockDriverState= *bs, int64_t *offset_ptr, .iov =3D qiov->iov, .niov =3D qiov->niov, }, + .flags =3D flags, }; =20 assert(qiov->size =3D=3D bytes); ret =3D raw_thread_pool_submit(handle_aiocb_rw, &acb); +#ifndef RWD_DSYNC if (ret =3D=3D 0 && (flags & BDRV_REQ_FUA)) { /* TODO Use pwritev2() instead if it's available */ ret =3D raw_co_flush_to_disk(bs); } +#endif goto out; /* Avoid the compiler err of unused label */ =20 out: --=20 2.43.0