From nobody Sun Apr 28 09:19:34 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487235595481861.7984119640302; Thu, 16 Feb 2017 00:59:55 -0800 (PST) Received: from localhost ([::1]:45308 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ceHuq-0004hI-Rx for importer@patchew.org; Thu, 16 Feb 2017 03:59:52 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51175) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ceHtz-0004MG-9q for qemu-devel@nongnu.org; Thu, 16 Feb 2017 03:59:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ceHty-00007q-B6 for qemu-devel@nongnu.org; Thu, 16 Feb 2017 03:58:59 -0500 Received: from mail-pg0-x241.google.com ([2607:f8b0:400e:c05::241]:35342) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ceHts-0008WA-TV; Thu, 16 Feb 2017 03:58:53 -0500 Received: by mail-pg0-x241.google.com with SMTP id y6so355498pgy.2; Thu, 16 Feb 2017 00:58:52 -0800 (PST) Received: from luffy.com (23.83.233.186.16clouds.com. [23.83.233.186]) by smtp.gmail.com with ESMTPSA id c64sm12116731pfa.45.2017.02.16.00.58.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Feb 2017 00:58:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=GgJX8ItqwZ5JioG1eGkohluhbch2EDgZxhM4+X2/S8Q=; b=M7MiyKlcW+0kbv7wshdWvdDbOb31DlQl8PTpV661Cd+GOPyZ8LkXPVz2iKg2s56Rbp J+9DQ9/LdBL0zhirWYuyLt+83Ifrv45VjGDlw6JT5unHX2sVFYwsb/5z0FFywASwZBsL ZkZqUdmxgkl8RM0qqXL7TxG4cZmFHyjjLZaNg87dXur4dLqZUWI6aycA+EmQYnau4C+r fRec2m39VasmWtS+yAZgc7SCVisCmPaS/WZdBAYHV8Qn+ZGbHFIk8QBoWq8dsr0rirza P9TihboSqbKAuJS3leBGPvoPZrQ86P3qIFbyiT0y+w4zIdWhCBZ4wL8GVv4BBMbgxZ5d +ayw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=GgJX8ItqwZ5JioG1eGkohluhbch2EDgZxhM4+X2/S8Q=; b=FzYeSJpDpKj0c7qJ0OqWZmTljB9OHJQcBxku5/TdGFMwCo64plc9FulFtxnlgKGE3Q Ih9Sz4JXVBMqIaXZQkSFdHvrjZbETEvX24Sdk+c5GGcLZTrns51+IU32o0Xx1IieQwVC B+k8LSf9GDnWvi/pPQyEZ7PkdE+bwdMrKPBn93YUURtPZoIy+XKfH0wBkoMYcgo6X9FF qsrOkHa/fDil1DXqPEsbof3VNXvIQdOWmnME4Bgje24W9Zfwv2kvcCj0x1HH8f251z5e GNft/0gnVfui4YtD+QlGupmAC7a5+kAZaME/Ot8HTd04CFmNdhLa9cbjyzGcM3ZwFshg 0QHw== X-Gm-Message-State: AMke39koaZh9xL+cuiIKGT+TJ3RxKd4p5sPJ0h4G7Dnbj+oqep9BWVYmPGgshkwUcLZ+eA== X-Received: by 10.99.116.22 with SMTP id p22mr1424217pgc.161.1487235531869; Thu, 16 Feb 2017 00:58:51 -0800 (PST) From: jazeltq@gmail.com To: jdurgin@redhat.com, jcody@redhat.com, dillaman@redhat.com, kwolf@redhat.com, mreitz@redhat.com, qemu-block@nongnu.org Date: Thu, 16 Feb 2017 17:00:02 +0800 Message-Id: <20170216090002.12511-1-jazeltq@gmail.com> X-Mailer: git-send-email 2.10.2 In-Reply-To: <20170216084318.11122-1-jazeltq@gmail.com> References: <20170216084318.11122-1-jazeltq@gmail.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400e:c05::241 Subject: [Qemu-devel] [RFC v5] RBD: Add support readv,writev for rbd X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: tianqing , ceph-devel@vger.kernel.org, jazeltq@gmail.com, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: tianqing Rbd can do readv and writev directly, so wo do not need to transform iov to buf or vice versa any more. Signed-off-by: tianqing --- block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/block/rbd.c b/block/rbd.c index a57b3e3..75ae1d6 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -47,7 +47,7 @@ */ =20 /* rbd_aio_discard added in 0.1.2 */ -#if LIBRBD_VERSION_CODE >=3D LIBRBD_VERSION(0, 1, 2) +#if LIBRBD_VERSION_CODE >=3D LIBRBD_VERSION(12, 0, 0) #define LIBRBD_SUPPORTS_DISCARD #else #undef LIBRBD_SUPPORTS_DISCARD @@ -73,7 +73,12 @@ typedef struct RBDAIOCB { BlockAIOCB common; int64_t ret; QEMUIOVector *qiov; +/* Note: + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h. + */ +#ifndef LIBRBD_SUPPORTS_IOVEC char *bounce; +#endif RBDAIOCmd cmd; int error; struct BDRVRBDState *s; @@ -83,7 +88,9 @@ typedef struct RADOSCB { RBDAIOCB *acb; struct BDRVRBDState *s; int64_t size; +#ifndef LIBRBD_SUPPORTS_IOVEC char *buf; +#endif int64_t ret; } RADOSCB; =20 @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb) } } else { if (r < 0) { +#ifndef LIBRBD_SUPPORTS_IOVEC memset(rcb->buf, 0, rcb->size); +#else + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->s= ize); +#endif acb->ret =3D r; acb->error =3D 1; } else if (r < rcb->size) { +#ifndef LIBRBD_SUPPORTS_IOVEC memset(rcb->buf + r, 0, rcb->size - r); +#else + iov_memset(acb->qiov->iov, acb->qiov->niov, + r, 0, acb->qiov->size - r); +#endif + if (!acb->error) { acb->ret =3D rcb->size; } @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb) =20 g_free(rcb); =20 +#ifndef LIBRBD_SUPPORTS_IOVEC if (acb->cmd =3D=3D RBD_AIO_READ) { qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size); } qemu_vfree(acb->bounce); +#endif acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret)); =20 qemu_aio_unref(acb); @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs, RBDAIOCB *acb; RADOSCB *rcb =3D NULL; rbd_completion_t c; - char *buf; int r; +#ifndef LIBRBD_SUPPORTS_IOVEC + char *buf =3D NULL; +#endif =20 BDRVRBDState *s =3D bs->opaque; =20 @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs, acb->cmd =3D cmd; acb->qiov =3D qiov; assert(!qiov || qiov->size =3D=3D size); +#ifndef LIBRBD_SUPPORTS_IOVEC + if (cmd =3D=3D RBD_AIO_DISCARD || cmd =3D=3D RBD_AIO_FLUSH) { acb->bounce =3D NULL; } else { @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs, goto failed; } } - acb->ret =3D 0; - acb->error =3D 0; - acb->s =3D s; - if (cmd =3D=3D RBD_AIO_WRITE) { qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size); } - buf =3D acb->bounce; +#endif + acb->ret =3D 0; + acb->error =3D 0; + acb->s =3D s; =20 rcb =3D g_new(RADOSCB, 1); + rcb->acb =3D acb; +#ifndef LIBRBD_SUPPORTS_IOVEC rcb->buf =3D buf; +#endif rcb->s =3D acb->s; rcb->size =3D size; r =3D rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb= , &c); @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs, =20 switch (cmd) { case RBD_AIO_WRITE: +#ifndef LIBRBD_SUPPORTS_IOVEC r =3D rbd_aio_write(s->image, off, size, buf, c); +#else + r =3D rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c); +#endif break; case RBD_AIO_READ: +#ifndef LIBRBD_SUPPORTS_IOVEC r =3D rbd_aio_read(s->image, off, size, buf, c); +#else + r =3D rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c); +#endif break; case RBD_AIO_DISCARD: r =3D rbd_aio_discard_wrapper(s->image, off, size, c); @@ -719,7 +752,9 @@ failed_completion: rbd_aio_release(c); failed: g_free(rcb); +#ifndef LIBRBD_SUPPORTS_IOVEC qemu_vfree(acb->bounce); +#endif qemu_aio_unref(acb); return NULL; } --=20 2.10.2