From nobody Sat Apr 27 11:50:05 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 1487234671765389.4883610234252; Thu, 16 Feb 2017 00:44:31 -0800 (PST) Received: from localhost ([::1]:45265 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ceHfy-0007i6-Ef for importer@patchew.org; Thu, 16 Feb 2017 03:44:30 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48106) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ceHf5-0007Q3-7B for qemu-devel@nongnu.org; Thu, 16 Feb 2017 03:43:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ceHf4-0002A3-8C for qemu-devel@nongnu.org; Thu, 16 Feb 2017 03:43:35 -0500 Received: from mail-pg0-x242.google.com ([2607:f8b0:400e:c05::242]:33842) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ceHeu-00021I-4F; Thu, 16 Feb 2017 03:43:24 -0500 Received: by mail-pg0-x242.google.com with SMTP id v184so1422367pgv.1; Thu, 16 Feb 2017 00:43:23 -0800 (PST) Received: from luffy.com (23.83.233.186.16clouds.com. [23.83.233.186]) by smtp.gmail.com with ESMTPSA id x10sm11923644pfi.117.2017.02.16.00.43.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Feb 2017 00:43:22 -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=EDiynQQNupGU+rM12l93LSXIg6uOV3yoMvPgN1j95dk=; b=r+QiFNypyIq41IzbN38GTp/n4eKUO8dKmudS8t/hbMWArzAB2yiK5cQIJSPNI5jhx7 nT2ECBv8y5U2FQ0rygrjfhOi3G2Ie4TQSfzStXwdDPeFfQk7y9RZ+30QoCE3xuIGZQR2 /xoMr/Z9lk2rN6ymTF0xA6MEPWQXL4kDoaKdh5mmFJigFlTOnqtNfJHyrsGALtzxIWRx T6ySrBT8onSy9nilCFhXWsaM6gJun8D5qZWPlUFoBpPbT501q06cClw7VwWhyx/bL/m+ ren8geXZ8bVCkcjP4IK5pFPT47jCohOptR4fz+tjlLnQUY17IVZF32l5n995U0+ENBe3 9+XQ== 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=EDiynQQNupGU+rM12l93LSXIg6uOV3yoMvPgN1j95dk=; b=ju/Rvg541g84fD0y31D3i9nH8tM0M0YViFt0Pr8TbvvYBp9O2oRbCsaeXFcaDkMdUx 7G7f1YBXfDzabJqyjSqSFvMeAA0EniDXvi9VUG38Dcgp3+cWw+3KNuRPWMc9N/gJEEul DFkq4XuPrnI9RjzYpbV0Uu/fbaFZrx2pMBIuJgDIjIyVmUDJoOP1N2V3pFxxPxs4zeyD 6JrhXlcQAdcS3NU3WjU0pEOAQK/hWFfRksOCxHYFVHhthqP0ZThtvWuWxiE6mY2kJB03 LzNDU9XMsqs7ymWBcgy4E3VK3JRDbF/i+ePehuoS1vW2LO3l1G2W+JvXGCxsGsekfuN6 RJvA== X-Gm-Message-State: AMke39kpqwWZDFonQoHXtu4eK2Z6VtLpWLlFKXyDeHi3PWjHX/rv1LvDEvaRegtfht84dQ== X-Received: by 10.98.158.210 with SMTP id f79mr1257213pfk.145.1487234602868; Thu, 16 Feb 2017 00:43:22 -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 16:43:18 +0800 Message-Id: <20170216084318.11122-1-jazeltq@gmail.com> X-Mailer: git-send-email 2.10.2 In-Reply-To: <20170121131909.17230-1-jazeltq@gmail.com> References: <20170121131909.17230-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::242 Subject: [Qemu-devel] [RFC v4] 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 | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/block/rbd.c b/block/rbd.c index a57b3e3..0cbd9e3 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -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