From patchwork Thu Apr 16 12:18:45 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Lieven X-Patchwork-Id: 461751 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 897DD1401AB for ; Thu, 16 Apr 2015 22:27:56 +1000 (AEST) Received: from localhost ([::1]:36571 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yiite-0002ra-JE for incoming@patchwork.ozlabs.org; Thu, 16 Apr 2015 08:27:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48154) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YiioI-0001yc-Ku for qemu-devel@nongnu.org; Thu, 16 Apr 2015 08:22:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Yiio8-0006D4-LE for qemu-devel@nongnu.org; Thu, 16 Apr 2015 08:22:22 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:49761 helo=mx01.kamp.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yiio8-0006By-AK for qemu-devel@nongnu.org; Thu, 16 Apr 2015 08:22:12 -0400 Received: (qmail 19284 invoked by uid 89); 16 Apr 2015 12:22:11 -0000 Received: from [82.141.1.145] by client-16-kamp (envelope-from , uid 89) with qmail-scanner-2010/03/19-MF (clamdscan: 0.98.6/20330. hbedv: 8.3.30.16/7.11.224.132. spamassassin: 3.4.0. Clear:RC:1(82.141.1.145):SA:0(-1.2/5.0):. Processed in 1.428277 secs); 16 Apr 2015 12:22:11 -0000 Received: from ns.kamp-intra.net (HELO dns.kamp-intra.net) ([82.141.1.145]) by mx01.kamp.de with SMTP; 16 Apr 2015 12:22:09 -0000 X-GL_Whitelist: yes Received: from lieven-vm-neu (lieven-vm.kamp-intra.net [172.21.12.69]) by dns.kamp-intra.net (Postfix) with ESMTP id 92440E006B; Thu, 16 Apr 2015 14:21:28 +0200 (CEST) Received: by lieven-vm-neu (Postfix, from userid 1000) id 3B6A4202DF; Thu, 16 Apr 2015 14:18:51 +0200 (CEST) From: Peter Lieven To: qemu-devel@nongnu.org Date: Thu, 16 Apr 2015 14:18:45 +0200 Message-Id: <1429186730-3866-6-git-send-email-pl@kamp.de> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1429186730-3866-1-git-send-email-pl@kamp.de> References: <1429186730-3866-1-git-send-email-pl@kamp.de> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a02:248:0:51::16 Cc: pbonzini@redhat.com, Peter Lieven , ronniesahlberg@gmail.com, qemu-block@nongnu.org Subject: [Qemu-devel] [PATCH for-2.4 05/10] block/iscsi: optimize WRITE10/16 if cache.writeback is not set 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 SCSI allowes to tell the target to not return from a write command if the date is not written to the disk. Use this so called FUA bit if it is supported to optimize WRITE commands if writeback is not allowed. In this case qemu always issues a WRITE followed by a FLUSH. This is 2 round trip times. If we set the FUA bit we can ignore the following FLUSH. Signed-off-by: Peter Lieven --- block/iscsi.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/block/iscsi.c b/block/iscsi.c index 237faa1..7fb04d7 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -68,6 +68,7 @@ typedef struct IscsiLun { bool lbprz; bool dpofua; bool has_write_same; + bool force_next_flush; } IscsiLun; typedef struct IscsiTask { @@ -370,6 +371,7 @@ static int coroutine_fn iscsi_co_writev(BlockDriverState *bs, struct IscsiTask iTask; uint64_t lba; uint32_t num_sectors; + int fua = iscsilun->dpofua && !bs->enable_write_cache; if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) { return -EINVAL; @@ -388,12 +390,12 @@ retry: if (iscsilun->use_16_for_rw) { iTask.task = iscsi_write16_task(iscsilun->iscsi, iscsilun->lun, lba, NULL, num_sectors * iscsilun->block_size, - iscsilun->block_size, 0, 0, 0, 0, 0, + iscsilun->block_size, 0, 0, fua, 0, 0, iscsi_co_generic_cb, &iTask); } else { iTask.task = iscsi_write10_task(iscsilun->iscsi, iscsilun->lun, lba, NULL, num_sectors * iscsilun->block_size, - iscsilun->block_size, 0, 0, 0, 0, 0, + iscsilun->block_size, 0, 0, fua, 0, 0, iscsi_co_generic_cb, &iTask); } if (iTask.task == NULL) { @@ -621,6 +623,11 @@ static int coroutine_fn iscsi_co_flush(BlockDriverState *bs) return 0; } + if (iscsilun->dpofua && !bs->enable_write_cache && + !iscsilun->force_next_flush) { + return 0; + } + iscsi_co_init_iscsitask(iscsilun, &iTask); retry: @@ -648,6 +655,8 @@ retry: return -EIO; } + iscsilun->force_next_flush = false; + return 0; } @@ -969,6 +978,8 @@ retry: iscsi_allocationmap_set(iscsilun, sector_num, nb_sectors); } + iscsilun->force_next_flush = true; + return 0; }