From nobody Mon Feb 9 17:25:09 2026 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1664308710; cv=none; d=zohomail.com; s=zohoarc; b=HIVWu4UVkxJcTf3R+YcgEHtR+5b2s933HwyrJz3VlXCdVSNtG1zwZGVBd2s7+t11r17TvoS46MWN9riIYNaceBokc4N16fvrEsXYA7PcMlX9SCZ7RY6tyugx+QoFDli1piP506hWEoBmNVnbCfVnx6PO3y2EgjfCm1JDGYTKdzQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1664308710; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Q3k5xxgLci7w3NjYeetRfQM1HfpM0zNoEvNQR10IswI=; b=nN7jK8tDQJQ9UeBMuCw39GuIqEgJf2wlBo9c3gb8bWp4Xx+ZApSnrRRb29gygN1tUxyOPlAVqC52fVTd86uvrx5IgiCjbTHY9GVt4nfiP9i81ud5bhVukzN4UUEseXin+QrRu730P5Wf/O8KV0q62bRhBaVPSIvV16u1dUbfECk= 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 1664308710617167.8946695050373; Tue, 27 Sep 2022 12:58:30 -0700 (PDT) Received: from localhost ([::1]:60706 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1odGir-0001rS-JO for importer@patchew.org; Tue, 27 Sep 2022 15:58:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:36604) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1odGNG-0001u1-Rt for qemu-devel@nongnu.org; Tue, 27 Sep 2022 15:36:10 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:60451) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1odGNF-0004ph-0U for qemu-devel@nongnu.org; Tue, 27 Sep 2022 15:36:10 -0400 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-48-XflKnutHPs-BhOLrYOIpeQ-1; Tue, 27 Sep 2022 15:36:01 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 0FD4C830F9F; Tue, 27 Sep 2022 19:35:59 +0000 (UTC) Received: from localhost (unknown [10.39.192.120]) by smtp.corp.redhat.com (Postfix) with ESMTP id 516FF2024CB7; Tue, 27 Sep 2022 19:35:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1664307367; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Q3k5xxgLci7w3NjYeetRfQM1HfpM0zNoEvNQR10IswI=; b=NijTP5td7Sg0uWw9y16B4enhWdu5+ILSFGLt7XwNtnVgfvhVyvf66Qh28jRuC+fJOvr5TM qBNMZGifrqzEVXHy4VNbmFCA0+ZKOiKoIz9YiRLrskzHCnf3yodV4V+JrcPz1+llOTKcIh CJq/N8qT+6y3crjDpKA6Cx/wy1cfbBU= X-MC-Unique: XflKnutHPs-BhOLrYOIpeQ-1 From: Stefan Hajnoczi To: qemu-devel@nongnu.org Cc: Yanan Wang , Kevin Wolf , Markus Armbruster , John Snow , "Denis V. Lunev" , Xie Changlong , Eric Blake , integration@gluster.org, David Hildenbrand , Wen Congyang , Laurent Vivier , "Richard W.M. Jones" , afaria@redhat.com, Fam Zheng , Thomas Huth , Hanna Reitz , Eduardo Habkost , Peter Xu , Raphael Norwitz , Stefan Hajnoczi , Marcel Apfelbaum , Vladimir Sementsov-Ogievskiy , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jeff Cody , qemu-block@nongnu.org, Paolo Bonzini , Richard Henderson , "Michael S. Tsirkin" , sgarzare@redhat.com Subject: [PATCH v5 12/12] virtio-blk: use BDRV_REQ_REGISTERED_BUF optimization hint Date: Tue, 27 Sep 2022 15:34:31 -0400 Message-Id: <20220927193431.22302-13-stefanha@redhat.com> In-Reply-To: <20220927193431.22302-1-stefanha@redhat.com> References: <20220927193431.22302-1-stefanha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.4 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=170.10.133.124; envelope-from=stefanha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, 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" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1664308711477100001 Content-Type: text/plain; charset="utf-8" Register guest RAM using BlockRAMRegistrar and set the BDRV_REQ_REGISTERED_BUF flag so block drivers can optimize memory accesses in I/O requests. This is for vdpa-blk, vhost-user-blk, and other I/O interfaces that rely on DMA mapping/unmapping. Signed-off-by: Stefan Hajnoczi --- include/hw/virtio/virtio-blk.h | 2 ++ hw/block/virtio-blk.c | 39 ++++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/include/hw/virtio/virtio-blk.h b/include/hw/virtio/virtio-blk.h index d311c57cca..7f589b4146 100644 --- a/include/hw/virtio/virtio-blk.h +++ b/include/hw/virtio/virtio-blk.h @@ -19,6 +19,7 @@ #include "hw/block/block.h" #include "sysemu/iothread.h" #include "sysemu/block-backend.h" +#include "sysemu/block-ram-registrar.h" #include "qom/object.h" =20 #define TYPE_VIRTIO_BLK "virtio-blk-device" @@ -64,6 +65,7 @@ struct VirtIOBlock { struct VirtIOBlockDataPlane *dataplane; uint64_t host_features; size_t config_size; + BlockRAMRegistrar blk_ram_registrar; }; =20 typedef struct VirtIOBlockReq { diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c index e9ba752f6b..907f012c45 100644 --- a/hw/block/virtio-blk.c +++ b/hw/block/virtio-blk.c @@ -21,6 +21,7 @@ #include "hw/block/block.h" #include "hw/qdev-properties.h" #include "sysemu/blockdev.h" +#include "sysemu/block-ram-registrar.h" #include "sysemu/sysemu.h" #include "sysemu/runstate.h" #include "hw/virtio/virtio-blk.h" @@ -384,12 +385,14 @@ static void virtio_blk_handle_scsi(VirtIOBlockReq *re= q) } } =20 -static inline void submit_requests(BlockBackend *blk, MultiReqBuffer *mrb, +static inline void submit_requests(VirtIOBlock *s, MultiReqBuffer *mrb, int start, int num_reqs, int niov) { + BlockBackend *blk =3D s->blk; QEMUIOVector *qiov =3D &mrb->reqs[start]->qiov; int64_t sector_num =3D mrb->reqs[start]->sector_num; bool is_write =3D mrb->is_write; + BdrvRequestFlags flags =3D 0; =20 if (num_reqs > 1) { int i; @@ -420,12 +423,18 @@ static inline void submit_requests(BlockBackend *blk,= MultiReqBuffer *mrb, num_reqs - 1); } =20 + if (blk_ram_registrar_ok(&s->blk_ram_registrar)) { + flags |=3D BDRV_REQ_REGISTERED_BUF; + } + if (is_write) { - blk_aio_pwritev(blk, sector_num << BDRV_SECTOR_BITS, qiov, 0, - virtio_blk_rw_complete, mrb->reqs[start]); + blk_aio_pwritev(blk, sector_num << BDRV_SECTOR_BITS, qiov, + flags, virtio_blk_rw_complete, + mrb->reqs[start]); } else { - blk_aio_preadv(blk, sector_num << BDRV_SECTOR_BITS, qiov, 0, - virtio_blk_rw_complete, mrb->reqs[start]); + blk_aio_preadv(blk, sector_num << BDRV_SECTOR_BITS, qiov, + flags, virtio_blk_rw_complete, + mrb->reqs[start]); } } =20 @@ -447,14 +456,14 @@ static int multireq_compare(const void *a, const void= *b) } } =20 -static void virtio_blk_submit_multireq(BlockBackend *blk, MultiReqBuffer *= mrb) +static void virtio_blk_submit_multireq(VirtIOBlock *s, MultiReqBuffer *mrb) { int i =3D 0, start =3D 0, num_reqs =3D 0, niov =3D 0, nb_sectors =3D 0; uint32_t max_transfer; int64_t sector_num =3D 0; =20 if (mrb->num_reqs =3D=3D 1) { - submit_requests(blk, mrb, 0, 1, -1); + submit_requests(s, mrb, 0, 1, -1); mrb->num_reqs =3D 0; return; } @@ -474,11 +483,11 @@ static void virtio_blk_submit_multireq(BlockBackend *= blk, MultiReqBuffer *mrb) * 3. merge would exceed maximum transfer length of backend de= vice */ if (sector_num + nb_sectors !=3D req->sector_num || - niov > blk_get_max_iov(blk) - req->qiov.niov || + niov > blk_get_max_iov(s->blk) - req->qiov.niov || req->qiov.size > max_transfer || nb_sectors > (max_transfer - req->qiov.size) / BDRV_SECTOR_SIZE) { - submit_requests(blk, mrb, start, num_reqs, niov); + submit_requests(s, mrb, start, num_reqs, niov); num_reqs =3D 0; } } @@ -494,7 +503,7 @@ static void virtio_blk_submit_multireq(BlockBackend *bl= k, MultiReqBuffer *mrb) num_reqs++; } =20 - submit_requests(blk, mrb, start, num_reqs, niov); + submit_requests(s, mrb, start, num_reqs, niov); mrb->num_reqs =3D 0; } =20 @@ -509,7 +518,7 @@ static void virtio_blk_handle_flush(VirtIOBlockReq *req= , MultiReqBuffer *mrb) * Make sure all outstanding writes are posted to the backing device. */ if (mrb->is_write && mrb->num_reqs > 0) { - virtio_blk_submit_multireq(s->blk, mrb); + virtio_blk_submit_multireq(s, mrb); } blk_aio_flush(s->blk, virtio_blk_flush_complete, req); } @@ -689,7 +698,7 @@ static int virtio_blk_handle_request(VirtIOBlockReq *re= q, MultiReqBuffer *mrb) if (mrb->num_reqs > 0 && (mrb->num_reqs =3D=3D VIRTIO_BLK_MAX_MERG= E_REQS || is_write !=3D mrb->is_write || !s->conf.request_merging)) { - virtio_blk_submit_multireq(s->blk, mrb); + virtio_blk_submit_multireq(s, mrb); } =20 assert(mrb->num_reqs < VIRTIO_BLK_MAX_MERGE_REQS); @@ -796,7 +805,7 @@ void virtio_blk_handle_vq(VirtIOBlock *s, VirtQueue *vq) } while (!virtio_queue_empty(vq)); =20 if (mrb.num_reqs) { - virtio_blk_submit_multireq(s->blk, &mrb); + virtio_blk_submit_multireq(s, &mrb); } =20 blk_io_unplug(s->blk); @@ -845,7 +854,7 @@ void virtio_blk_process_queued_requests(VirtIOBlock *s,= bool is_bh) } =20 if (mrb.num_reqs) { - virtio_blk_submit_multireq(s->blk, &mrb); + virtio_blk_submit_multireq(s, &mrb); } if (is_bh) { blk_dec_in_flight(s->conf.conf.blk); @@ -1227,6 +1236,7 @@ static void virtio_blk_device_realize(DeviceState *de= v, Error **errp) } =20 s->change =3D qemu_add_vm_change_state_handler(virtio_blk_dma_restart_= cb, s); + blk_ram_registrar_init(&s->blk_ram_registrar, s->blk); blk_set_dev_ops(s->blk, &virtio_block_ops, s); =20 blk_iostatus_enable(s->blk); @@ -1252,6 +1262,7 @@ static void virtio_blk_device_unrealize(DeviceState *= dev) virtio_del_queue(vdev, i); } qemu_coroutine_dec_pool_size(conf->num_queues * conf->queue_size / 2); + blk_ram_registrar_destroy(&s->blk_ram_registrar); qemu_del_vm_change_state_handler(s->change); blockdev_mark_auto_del(s->blk); virtio_cleanup(vdev); --=20 2.37.3