From nobody Sun May 5 01:06:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of _spf.google.com designates 209.85.128.45 as permitted sender) client-ip=209.85.128.45; envelope-from=philippe.mathieu.daude@gmail.com; helo=mail-wm1-f45.google.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of _spf.google.com designates 209.85.128.45 as permitted sender) smtp.mailfrom=philippe.mathieu.daude@gmail.com; dmarc=fail(p=quarantine dis=quarantine) header.from=amsat.org ARC-Seal: i=1; a=rsa-sha256; t=1642423894; cv=none; d=zohomail.com; s=zohoarc; b=Lnjeb2F6GPwvl7rczk7K7kJiZl9xT8y7v4LKuISjtugtfRwHDrU5V6725Tiolvb5tgqNpYeq66f45qhYUib+fVw2gXICsdMdsi0oeBOX/USGyQiPch26IsvaHDnvlaxilzo8VJ3K2vftRPUd9AR1T3rOqfJVriU0sb54bNFgO8A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1642423894; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:MIME-Version:Message-ID:Sender:Subject:To; bh=ZGBtWBK1EhR9MCoW1CsZDgrWxEUJPAn+9HE32S1AlJI=; b=bK6bHu4/hs7iZHBIIgjpo/7OQDWMy8hLOJlKCCN69fcooWJG4+m/XP99IZ9wPav/ylX1dlk4vq/5nhjs1TXDMPX2mxt+Pib5h0/v/Hj8PgSaBxAysll2YDK5f0o54xjv6PSC6AEpLcma0UUX0FkBCyRayvxW/jBspV/ulxidvk4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of _spf.google.com designates 209.85.128.45 as permitted sender) smtp.mailfrom=philippe.mathieu.daude@gmail.com; dmarc=fail header.from= (p=quarantine dis=quarantine) Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) by mx.zohomail.com with SMTPS id 1642423894370929.2705181999937; Mon, 17 Jan 2022 04:51:34 -0800 (PST) Received: by mail-wm1-f45.google.com with SMTP id w26so20119077wmi.0 for ; Mon, 17 Jan 2022 04:51:33 -0800 (PST) Return-Path: Return-Path: Received: from nuc.. (154.red-83-50-83.dynamicip.rima-tde.net. [83.50.83.154]) by smtp.gmail.com with ESMTPSA id w6sm13781795wrq.86.2022.01.17.04.51.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Jan 2022 04:51:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=sender:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=ZGBtWBK1EhR9MCoW1CsZDgrWxEUJPAn+9HE32S1AlJI=; b=ZVMFuyBmA0SKMaaqDAM/P+59/dtT2Yq4uax9GBru9cTIbM35b5eFX0vXKCq1Y4bVdf UOa4LGPBwJAaz8CIc2FGeH8X0I/Q/mqVBtNeL53Fym9foPNrAYHJ2tSARretnqnbSnO6 5fqGmffODq1NiT8nEKi4BKg2qc2p9+fbEXnRb0MuH3dmkl37bK4Svdx+55iQOvTarhn1 BtJ0G4DvPpWQ7kZ29R8HuCpr9NPX4JtZvsxvsK+vDmkZquw0utMCQ6+Y960NFeH/meZW r7sV3UTwMs3inB1SZZOAqT4uV7JJ2MRT6+6OvzJYRHshN+JCezMw7ttZSlBc5LBtyDLJ 0G/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; bh=ZGBtWBK1EhR9MCoW1CsZDgrWxEUJPAn+9HE32S1AlJI=; b=1ArCcnXqdzwMzDmKxDPnYtwvBPJDdwwKymXLuMpejLhrFEmIakHwhEDtoOpCmn2yu/ OPbZj/GDWk9DqJZrIZSYQS+T4vZciEoD7L1lnmCDqltWmZiP9qq5TJE/0kpH718ab9zD PsMwPjSYPmQczEir3a/2USqgAkS8tKP/j2gtpwmnPflndCMP88b5WAEJUB1gBj1TMpVZ BS7ZZuQpMsNkCDvCT9V7cM4dpJLBehprImhPqwf5LVz4cP5zeAi20197xWfZc4XnlPY+ WVbfwk+yRK8d81A5c9+5h+qISDDs5HuzaweoBAROyf4eriAunMFwqg7tdEbm735+Fl/g 900g== X-Gm-Message-State: AOAM530SDYWbn/SZ4aDx8TFx8FT6jB4hctClyqL+aO4nC0zvU0ub1SKC WaAh88VtnnUAnV8lw3FOY7w= X-Google-Smtp-Source: ABdhPJzqrRqc1aBoKTKh4wpzJg/NB7hu7uiMAhv+KDVWCAFKNmDA7rA4rlgs7gAsNC9qQbJRqCTJJw== X-Received: by 2002:a05:6000:1ac7:: with SMTP id i7mr2021011wry.491.1642423892508; Mon, 17 Jan 2022 04:51:32 -0800 (PST) Sender: =?UTF-8?Q?Philippe_Mathieu=2DDaud=C3=A9?= From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Peter Xu , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Klaus Jensen , Paolo Bonzini , qemu-block@nongnu.org, David Hildenbrand , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Klaus Jensen Subject: [PATCH v3] hw/dma: Let dma_buf_read() / dma_buf_write() propagate MemTxResult Date: Mon, 17 Jan 2022 13:51:30 +0100 Message-Id: <20220117125130.131828-1-f4bug@amsat.org> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1642423895335100003 From: Philippe Mathieu-Daud=C3=A9 Since commit 292e13142d2, dma_buf_rw() returns a MemTxResult type. Do not discard it, return it to the caller. Pass the previously returned value (the QEMUSGList residual size, which was rarely used) as an optional argument. With this new API, SCSIRequest::residual might now be accessed via a pointer. Since the size_t type does not have the same size on 32 and 64-bit host architectures, convert it to a uint64_t, which is big enough to hold the residual size, and the type is constant on both 32/64-bit hosts. Update the few dma_buf_read() / dma_buf_write() callers to the new API. Reviewed-by: Klaus Jensen Signed-off-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Philippe Mathieu-Daud=C3=A9 Acked-by: Peter Xu --- v3: - Reworded to precise the SCSIRequest::residual type change - Posted out of the "Use dma_addr_t type definition when relevant" series (dhildenb) --- include/hw/scsi/scsi.h | 2 +- include/sysemu/dma.h | 4 +-- hw/ide/ahci.c | 8 +++--- hw/nvme/ctrl.c | 4 +-- hw/scsi/megasas.c | 59 ++++++++++++++++++++++++++++++------------ hw/scsi/scsi-bus.c | 6 +++-- softmmu/dma-helpers.c | 16 +++--------- 7 files changed, 59 insertions(+), 40 deletions(-) diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h index b27d133b113..1ffb367f94f 100644 --- a/include/hw/scsi/scsi.h +++ b/include/hw/scsi/scsi.h @@ -30,7 +30,7 @@ struct SCSIRequest { int16_t status; int16_t host_status; void *hba_private; - size_t residual; + uint64_t residual; SCSICommand cmd; NotifierList cancel_notifiers; =20 diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h index 36039c5e687..a1ac5bc1b54 100644 --- a/include/sysemu/dma.h +++ b/include/sysemu/dma.h @@ -301,9 +301,9 @@ BlockAIOCB *dma_blk_read(BlockBackend *blk, BlockAIOCB *dma_blk_write(BlockBackend *blk, QEMUSGList *sg, uint64_t offset, uint32_t align, BlockCompletionFunc *cb, void *opaque); -dma_addr_t dma_buf_read(void *ptr, dma_addr_t len, +MemTxResult dma_buf_read(void *ptr, dma_addr_t len, dma_addr_t *residual, QEMUSGList *sg, MemTxAttrs attrs); -dma_addr_t dma_buf_write(void *ptr, dma_addr_t len, +MemTxResult dma_buf_write(void *ptr, dma_addr_t len, dma_addr_t *residual, QEMUSGList *sg, MemTxAttrs attrs); =20 void dma_acct_start(BlockBackend *blk, BlockAcctCookie *cookie, diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index 6c727dd0c08..7ce001cacdb 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -1384,9 +1384,9 @@ static void ahci_pio_transfer(const IDEDMA *dma) const MemTxAttrs attrs =3D MEMTXATTRS_UNSPECIFIED; =20 if (is_write) { - dma_buf_write(s->data_ptr, size, &s->sg, attrs); + dma_buf_write(s->data_ptr, size, NULL, &s->sg, attrs); } else { - dma_buf_read(s->data_ptr, size, &s->sg, attrs); + dma_buf_read(s->data_ptr, size, NULL, &s->sg, attrs); } } =20 @@ -1479,9 +1479,9 @@ static int ahci_dma_rw_buf(const IDEDMA *dma, bool is= _write) } =20 if (is_write) { - dma_buf_read(p, l, &s->sg, MEMTXATTRS_UNSPECIFIED); + dma_buf_read(p, l, NULL, &s->sg, MEMTXATTRS_UNSPECIFIED); } else { - dma_buf_write(p, l, &s->sg, MEMTXATTRS_UNSPECIFIED); + dma_buf_write(p, l, NULL, &s->sg, MEMTXATTRS_UNSPECIFIED); } =20 /* free sglist, update byte count */ diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index c3c49176110..1f62116af98 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -1150,9 +1150,9 @@ static uint16_t nvme_tx(NvmeCtrl *n, NvmeSg *sg, uint= 8_t *ptr, uint32_t len, dma_addr_t residual; =20 if (dir =3D=3D NVME_TX_DIRECTION_TO_DEVICE) { - residual =3D dma_buf_write(ptr, len, &sg->qsg, attrs); + dma_buf_write(ptr, len, &residual, &sg->qsg, attrs); } else { - residual =3D dma_buf_read(ptr, len, &sg->qsg, attrs); + dma_buf_read(ptr, len, &residual, &sg->qsg, attrs); } =20 if (unlikely(residual)) { diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c index 6c1ae6b980f..de613c8b355 100644 --- a/hw/scsi/megasas.c +++ b/hw/scsi/megasas.c @@ -750,6 +750,7 @@ static int megasas_ctrl_get_info(MegasasState *s, Megas= asCmd *cmd) size_t dcmd_size =3D sizeof(info); BusChild *kid; int num_pd_disks =3D 0; + dma_addr_t residual; =20 memset(&info, 0x0, dcmd_size); if (cmd->iov_size < dcmd_size) { @@ -860,7 +861,9 @@ static int megasas_ctrl_get_info(MegasasState *s, Megas= asCmd *cmd) MFI_INFO_PDMIX_SATA | MFI_INFO_PDMIX_LD); =20 - cmd->iov_size -=3D dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTR= S_UNSPECIFIED); + dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, + MEMTXATTRS_UNSPECIFIED); + cmd->iov_size -=3D residual; return MFI_STAT_OK; } =20 @@ -868,6 +871,7 @@ static int megasas_mfc_get_defaults(MegasasState *s, Me= gasasCmd *cmd) { struct mfi_defaults info; size_t dcmd_size =3D sizeof(struct mfi_defaults); + dma_addr_t residual; =20 memset(&info, 0x0, dcmd_size); if (cmd->iov_size < dcmd_size) { @@ -890,7 +894,9 @@ static int megasas_mfc_get_defaults(MegasasState *s, Me= gasasCmd *cmd) info.disable_preboot_cli =3D 1; info.cluster_disable =3D 1; =20 - cmd->iov_size -=3D dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTR= S_UNSPECIFIED); + dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, + MEMTXATTRS_UNSPECIFIED); + cmd->iov_size -=3D residual; return MFI_STAT_OK; } =20 @@ -898,6 +904,7 @@ static int megasas_dcmd_get_bios_info(MegasasState *s, = MegasasCmd *cmd) { struct mfi_bios_data info; size_t dcmd_size =3D sizeof(info); + dma_addr_t residual; =20 memset(&info, 0x0, dcmd_size); if (cmd->iov_size < dcmd_size) { @@ -911,7 +918,9 @@ static int megasas_dcmd_get_bios_info(MegasasState *s, = MegasasCmd *cmd) info.expose_all_drives =3D 1; } =20 - cmd->iov_size -=3D dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTR= S_UNSPECIFIED); + dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, + MEMTXATTRS_UNSPECIFIED); + cmd->iov_size -=3D residual; return MFI_STAT_OK; } =20 @@ -919,10 +928,13 @@ static int megasas_dcmd_get_fw_time(MegasasState *s, = MegasasCmd *cmd) { uint64_t fw_time; size_t dcmd_size =3D sizeof(fw_time); + dma_addr_t residual; =20 fw_time =3D cpu_to_le64(megasas_fw_time()); =20 - cmd->iov_size -=3D dma_buf_read(&fw_time, dcmd_size, &cmd->qsg, MEMTXA= TTRS_UNSPECIFIED); + dma_buf_read(&fw_time, dcmd_size, &residual, &cmd->qsg, + MEMTXATTRS_UNSPECIFIED); + cmd->iov_size -=3D residual; return MFI_STAT_OK; } =20 @@ -942,6 +954,7 @@ static int megasas_event_info(MegasasState *s, MegasasC= md *cmd) { struct mfi_evt_log_state info; size_t dcmd_size =3D sizeof(info); + dma_addr_t residual; =20 memset(&info, 0, dcmd_size); =20 @@ -949,7 +962,9 @@ static int megasas_event_info(MegasasState *s, MegasasC= md *cmd) info.shutdown_seq_num =3D cpu_to_le32(s->shutdown_event); info.boot_seq_num =3D cpu_to_le32(s->boot_event); =20 - cmd->iov_size -=3D dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTR= S_UNSPECIFIED); + dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, + MEMTXATTRS_UNSPECIFIED); + cmd->iov_size -=3D residual; return MFI_STAT_OK; } =20 @@ -979,6 +994,7 @@ static int megasas_dcmd_pd_get_list(MegasasState *s, Me= gasasCmd *cmd) size_t dcmd_size =3D sizeof(info); BusChild *kid; uint32_t offset, dcmd_limit, num_pd_disks =3D 0, max_pd_disks; + dma_addr_t residual; =20 memset(&info, 0, dcmd_size); offset =3D 8; @@ -1018,7 +1034,9 @@ static int megasas_dcmd_pd_get_list(MegasasState *s, = MegasasCmd *cmd) info.size =3D cpu_to_le32(offset); info.count =3D cpu_to_le32(num_pd_disks); =20 - cmd->iov_size -=3D dma_buf_read(&info, offset, &cmd->qsg, MEMTXATTRS_U= NSPECIFIED); + dma_buf_read(&info, offset, &residual, &cmd->qsg, + MEMTXATTRS_UNSPECIFIED); + cmd->iov_size -=3D residual; return MFI_STAT_OK; } =20 @@ -1113,8 +1131,9 @@ static int megasas_pd_get_info_submit(SCSIDevice *sde= v, int lun, info->connected_port_bitmap =3D 0x1; info->device_speed =3D 1; info->link_speed =3D 1; - residual =3D dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg, - MEMTXATTRS_UNSPECIFIED); + dma_buf_read(cmd->iov_buf, dcmd_size, &residual, &cmd->qsg, + MEMTXATTRS_UNSPECIFIED); + cmd->iov_size -=3D residual; g_free(cmd->iov_buf); cmd->iov_size =3D dcmd_size - residual; cmd->iov_buf =3D NULL; @@ -1187,8 +1206,8 @@ static int megasas_dcmd_ld_get_list(MegasasState *s, = MegasasCmd *cmd) info.ld_count =3D cpu_to_le32(num_ld_disks); trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks); =20 - residual =3D dma_buf_read(&info, dcmd_size, &cmd->qsg, - MEMTXATTRS_UNSPECIFIED); + dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, + MEMTXATTRS_UNSPECIFIED); cmd->iov_size =3D dcmd_size - residual; return MFI_STAT_OK; } @@ -1238,8 +1257,8 @@ static int megasas_dcmd_ld_list_query(MegasasState *s= , MegasasCmd *cmd) info.size =3D dcmd_size; trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks); =20 - residual =3D dma_buf_read(&info, dcmd_size, &cmd->qsg, - MEMTXATTRS_UNSPECIFIED); + dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, + MEMTXATTRS_UNSPECIFIED); cmd->iov_size =3D dcmd_size - residual; return MFI_STAT_OK; } @@ -1290,8 +1309,8 @@ static int megasas_ld_get_info_submit(SCSIDevice *sde= v, int lun, info->ld_config.span[0].num_blocks =3D info->size; info->ld_config.span[0].array_ref =3D cpu_to_le16(sdev_id); =20 - residual =3D dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg, - MEMTXATTRS_UNSPECIFIED); + dma_buf_read(cmd->iov_buf, dcmd_size, &residual, &cmd->qsg, + MEMTXATTRS_UNSPECIFIED); g_free(cmd->iov_buf); cmd->iov_size =3D dcmd_size - residual; cmd->iov_buf =3D NULL; @@ -1336,6 +1355,7 @@ static int megasas_dcmd_cfg_read(MegasasState *s, Meg= asasCmd *cmd) struct mfi_config_data *info; int num_pd_disks =3D 0, array_offset, ld_offset; BusChild *kid; + dma_addr_t residual; =20 if (cmd->iov_size > 4096) { return MFI_STAT_INVALID_PARAMETER; @@ -1410,7 +1430,9 @@ static int megasas_dcmd_cfg_read(MegasasState *s, Meg= asasCmd *cmd) ld_offset +=3D sizeof(struct mfi_ld_config); } =20 - cmd->iov_size -=3D dma_buf_read(data, info->size, &cmd->qsg, MEMTXATTR= S_UNSPECIFIED); + dma_buf_read(data, info->size, &residual, &cmd->qsg, + MEMTXATTRS_UNSPECIFIED); + cmd->iov_size -=3D residual; return MFI_STAT_OK; } =20 @@ -1418,6 +1440,7 @@ static int megasas_dcmd_get_properties(MegasasState *= s, MegasasCmd *cmd) { struct mfi_ctrl_props info; size_t dcmd_size =3D sizeof(info); + dma_addr_t residual; =20 memset(&info, 0x0, dcmd_size); if (cmd->iov_size < dcmd_size) { @@ -1440,7 +1463,9 @@ static int megasas_dcmd_get_properties(MegasasState *= s, MegasasCmd *cmd) info.ecc_bucket_leak_rate =3D cpu_to_le16(1440); info.expose_encl_devices =3D 1; =20 - cmd->iov_size -=3D dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTR= S_UNSPECIFIED); + dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, + MEMTXATTRS_UNSPECIFIED); + cmd->iov_size -=3D residual; return MFI_STAT_OK; } =20 @@ -1485,7 +1510,7 @@ static int megasas_dcmd_set_properties(MegasasState *= s, MegasasCmd *cmd) dcmd_size); return MFI_STAT_INVALID_PARAMETER; } - dma_buf_write(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED); + dma_buf_write(&info, dcmd_size, NULL, &cmd->qsg, MEMTXATTRS_UNSPECIFIE= D); trace_megasas_dcmd_unsupported(cmd->index, cmd->iov_size); return MFI_STAT_OK; } diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c index 3466e680ac7..4057e04ce89 100644 --- a/hw/scsi/scsi-bus.c +++ b/hw/scsi/scsi-bus.c @@ -1421,9 +1421,11 @@ void scsi_req_data(SCSIRequest *req, int len) =20 buf =3D scsi_req_get_buf(req); if (req->cmd.mode =3D=3D SCSI_XFER_FROM_DEV) { - req->residual =3D dma_buf_read(buf, len, req->sg, MEMTXATTRS_UNSPE= CIFIED); + dma_buf_read(buf, len, &req->residual, req->sg, + MEMTXATTRS_UNSPECIFIED); } else { - req->residual =3D dma_buf_write(buf, len, req->sg, MEMTXATTRS_UNSP= ECIFIED); + dma_buf_write(buf, len, &req->residual, req->sg, + MEMTXATTRS_UNSPECIFIED); } scsi_req_continue(req); } diff --git a/softmmu/dma-helpers.c b/softmmu/dma-helpers.c index 916cf12ed42..1c6fba6a112 100644 --- a/softmmu/dma-helpers.c +++ b/softmmu/dma-helpers.c @@ -321,24 +321,16 @@ static MemTxResult dma_buf_rw(void *buf, dma_addr_t l= en, dma_addr_t *residual, return res; } =20 -dma_addr_t dma_buf_read(void *ptr, dma_addr_t len, +MemTxResult dma_buf_read(void *ptr, dma_addr_t len, dma_addr_t *residual, QEMUSGList *sg, MemTxAttrs attrs) { - dma_addr_t residual; - - dma_buf_rw(ptr, len, &residual, sg, DMA_DIRECTION_FROM_DEVICE, attrs); - - return residual; + return dma_buf_rw(ptr, len, residual, sg, DMA_DIRECTION_FROM_DEVICE, a= ttrs); } =20 -dma_addr_t dma_buf_write(void *ptr, dma_addr_t len, +MemTxResult dma_buf_write(void *ptr, dma_addr_t len, dma_addr_t *residual, QEMUSGList *sg, MemTxAttrs attrs) { - dma_addr_t residual; - - dma_buf_rw(ptr, len, &residual, sg, DMA_DIRECTION_TO_DEVICE, attrs); - - return residual; + return dma_buf_rw(ptr, len, residual, sg, DMA_DIRECTION_TO_DEVICE, att= rs); } =20 void dma_acct_start(BlockBackend *blk, BlockAcctCookie *cookie, --=20 2.34.1