From patchwork Tue Jan 22 16:37:42 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 214595 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id AAA732C0082 for ; Wed, 23 Jan 2013 03:38:23 +1100 (EST) Received: from localhost ([::1]:44269 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Txgrd-0003Fd-Jl for incoming@patchwork.ozlabs.org; Tue, 22 Jan 2013 11:38:21 -0500 Received: from eggs.gnu.org ([208.118.235.92]:33053) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TxgrM-00037r-72 for qemu-devel@nongnu.org; Tue, 22 Jan 2013 11:38:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TxgrF-0004il-DS for qemu-devel@nongnu.org; Tue, 22 Jan 2013 11:38:04 -0500 Received: from mail-qe0-f45.google.com ([209.85.128.45]:40750) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TxgrF-0004ia-8H for qemu-devel@nongnu.org; Tue, 22 Jan 2013 11:37:57 -0500 Received: by mail-qe0-f45.google.com with SMTP id b4so362199qen.4 for ; Tue, 22 Jan 2013 08:37:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=PqTnjQ8nRvzp8uXiQFO6VhSCvgKb2dOF5hcxTaJHw5M=; b=BCkIu0FRdagXg6z8g3Oocb2pzfYOdqCpjIY0o8RbQ5xs5Ow//fAYxJ3M3eNYJ+nKct FJjOCcfPmVKON/bOBlpEGuoKIGdwAjw1ZJJjk4FyLGcG6RoeM61LikwYj47xaZ7HJSyj SKuMnZzfkKmFBAD5gP8Ib2pflfg5udZh3OVoD80VZJYx8AMRLdlohU0Iaf6lO01Mxrko ppsX/HC3BYvpdOk99XbSKcmLKKo1uSB4iNshlHhMnTZ06ClLKTRFx1Y0MzafzusLhgly TjYTy/XpI0eOVQXIjVLVWPd+/1ttxx5sTL4D/ZOFpBIRMd7k7CrwS4eLilYbsfFoF2GL Vbdg== X-Received: by 10.224.222.82 with SMTP id if18mr24140631qab.9.1358872676718; Tue, 22 Jan 2013 08:37:56 -0800 (PST) Received: from yakj.usersys.redhat.com (host175-147-dynamic.2-87-r.retail.telecomitalia.it. [87.2.147.175]) by mx.google.com with ESMTPS id j20sm11353750qaq.17.2013.01.22.08.37.54 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Tue, 22 Jan 2013 08:37:56 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 22 Jan 2013 17:37:42 +0100 Message-Id: <1358872662-5922-3-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.1 In-Reply-To: <1358872662-5922-1-git-send-email-pbonzini@redhat.com> References: <1358872662-5922-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 209.85.128.45 Cc: Peter Lieven , pl@kamp.de Subject: [Qemu-devel] [PATCH 1.4 2/2] iscsi: add support for iovectors X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Peter Lieven This patch adds support for directly passing the iovec array from QEMUIOVector if libiscsi supports it. Signed-off-by: Peter Lieven [Preserve the improvements from commit 4cc841b, iscsi: partly avoid iovec linearization in iscsi_aio_writev, 2012-11-19 - Paolo] Signed-off-by: Paolo Bonzini --- block/iscsi.c | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/block/iscsi.c b/block/iscsi.c index 3787eef..db0b6e3 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -57,7 +57,9 @@ typedef struct IscsiAIOCB { QEMUBH *bh; IscsiLun *iscsilun; struct scsi_task *task; +#if !defined(LIBISCSI_FEATURE_IOVECTOR) uint8_t *buf; +#endif int status; int canceled; size_t read_size; @@ -234,7 +236,10 @@ iscsi_aio_writev(BlockDriverState *bs, int64_t sector_num, size_t size; uint32_t num_sectors; uint64_t lba; +#if !defined(LIBISCSI_FEATURE_IOVECTOR) struct iscsi_data data; +#endif + int ret; acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque); trace_iscsi_aio_writev(iscsi, sector_num, nb_sectors, opaque, acb); @@ -247,9 +252,10 @@ iscsi_aio_writev(BlockDriverState *bs, int64_t sector_num, acb->status = -EINPROGRESS; acb->buf = NULL; - /* XXX we should pass the iovec to write16 to avoid the extra copy */ /* this will allow us to get rid of 'buf' completely */ size = nb_sectors * BDRV_SECTOR_SIZE; + +#if !defined(LIBISCSI_FEATURE_IOVECTOR) data.size = MIN(size, acb->qiov->size); /* if the iovec only contains one buffer we can pass it directly */ @@ -260,6 +266,7 @@ iscsi_aio_writev(BlockDriverState *bs, int64_t sector_num, qemu_iovec_to_buf(acb->qiov, 0, acb->buf, data.size); data.data = acb->buf; } +#endif acb->task = malloc(sizeof(struct scsi_task)); if (acb->task == NULL) { @@ -280,16 +287,28 @@ iscsi_aio_writev(BlockDriverState *bs, int64_t sector_num, *(uint32_t *)&acb->task->cdb[10] = htonl(num_sectors); acb->task->expxferlen = size; - if (iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task, - iscsi_aio_write16_cb, - &data, - acb) != 0) { +#if defined(LIBISCSI_FEATURE_IOVECTOR) + ret = iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task, + iscsi_aio_write16_cb, + NULL, + acb); +#else + ret = iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task, + iscsi_aio_write16_cb, + &data, + acb); +#endif + if (ret != 0) { scsi_free_scsi_task(acb->task); g_free(acb->buf); qemu_aio_release(acb); return NULL; } +#if defined(LIBISCSI_FEATURE_IOVECTOR) + scsi_task_set_iov_out(acb->task, (struct scsi_iovec*) acb->qiov->iov, acb->qiov->niov); +#endif + iscsi_set_events(iscsilun); return &acb->common; @@ -327,7 +346,10 @@ iscsi_aio_readv(BlockDriverState *bs, int64_t sector_num, struct iscsi_context *iscsi = iscsilun->iscsi; IscsiAIOCB *acb; size_t qemu_read_size; +#if !defined(LIBISCSI_FEATURE_IOVECTOR) int i; +#endif + int ret; uint64_t lba; uint32_t num_sectors; @@ -389,20 +411,25 @@ iscsi_aio_readv(BlockDriverState *bs, int64_t sector_num, break; } - if (iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task, - iscsi_aio_read16_cb, - NULL, - acb) != 0) { + ret = iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task, + iscsi_aio_read16_cb, + NULL, + acb); + if (ret != 0) { scsi_free_scsi_task(acb->task); qemu_aio_release(acb); return NULL; } +#if defined(LIBISCSI_FEATURE_IOVECTOR) + scsi_task_set_iov_in(acb->task, (struct scsi_iovec*) acb->qiov->iov, acb->qiov->niov); +#else for (i = 0; i < acb->qiov->niov; i++) { scsi_task_add_data_in_buffer(acb->task, acb->qiov->iov[i].iov_len, acb->qiov->iov[i].iov_base); } +#endif iscsi_set_events(iscsilun);