From patchwork Thu Jan 26 17:22:43 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 137996 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 2FC92B6EFE for ; Fri, 27 Jan 2012 04:24:45 +1100 (EST) Received: from localhost ([::1]:49456 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RqT3v-0006yU-1k for incoming@patchwork.ozlabs.org; Thu, 26 Jan 2012 12:24:39 -0500 Received: from eggs.gnu.org ([140.186.70.92]:52602) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RqT2y-0004xr-LZ for qemu-devel@nongnu.org; Thu, 26 Jan 2012 12:23:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RqT2p-0003RF-0U for qemu-devel@nongnu.org; Thu, 26 Jan 2012 12:23:40 -0500 Received: from mail-gx0-f173.google.com ([209.85.161.173]:59379) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RqT2o-0003Mz-Tx for qemu-devel@nongnu.org; Thu, 26 Jan 2012 12:23:30 -0500 Received: by mail-gx0-f173.google.com with SMTP id h1so470472ggn.4 for ; Thu, 26 Jan 2012 09:23:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=elBlq2qcbei4xSfs1uF9DWBbC9IdZ1OLAKD6t5XgXzg=; b=W0H5H4ZhAz9hkmLg504P6Wo/ytRhYhDtl80niC0onceV+lwMYTfS9U1xRw6saj2Gty QwTkBxcJhTd48V7jo4zI11ixE6mb5qbZ4+MxXT0QPUuGHBY5AbfIY1TIPw5bI79F6W/i KUzsBjFXKtTZ0+ggdLSFBnCu0zy7fAz8sM5DA= Received: by 10.50.6.194 with SMTP id d2mr3064892iga.24.1327598610521; Thu, 26 Jan 2012 09:23:30 -0800 (PST) Received: from yakj.usersys.redhat.com (93-34-182-16.ip50.fastwebnet.it. [93.34.182.16]) by mx.google.com with ESMTPS id ak10sm2142476igc.6.2012.01.26.09.23.28 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 26 Jan 2012 09:23:29 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 26 Jan 2012 18:22:43 +0100 Message-Id: <1327598569-5199-13-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1327598569-5199-1-git-send-email-pbonzini@redhat.com> References: <1327598569-5199-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.161.173 Cc: kwolf@redhat.com Subject: [Qemu-devel] [PATCH v2 12/18] block: allow waiting only for overlapping writes 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 To implement mismatching block size, we will reuse the request tracking mechanism that is used for copy-on-read. However, waiting for overlapping reads is not needed to protect against "torn reads", so add a flag to wait_for_overlapping_requests. Signed-off-by: Paolo Bonzini --- block.c | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) diff --git a/block.c b/block.c index af41fb3..76e1c6a 100644 --- a/block.c +++ b/block.c @@ -1198,7 +1198,7 @@ static bool tracked_request_overlaps(BdrvTrackedRequest *req, } static void coroutine_fn wait_for_overlapping_requests(BlockDriverState *bs, - int64_t sector_num, int nb_sectors) + int64_t sector_num, int nb_sectors, bool writes_only) { BdrvTrackedRequest *req; int64_t cluster_sector_num; @@ -1214,9 +1214,16 @@ static void coroutine_fn wait_for_overlapping_requests(BlockDriverState *bs, round_to_clusters(bs, sector_num, nb_sectors, &cluster_sector_num, &cluster_nb_sectors); + if (writes_only && !(bs->open_flags & BDRV_O_RDWR)) { + return; + } + do { retry = false; QLIST_FOREACH(req, &bs->tracked_requests, list) { + if (writes_only && !req->is_write) { + continue; + } if (tracked_request_overlaps(req, cluster_sector_num, cluster_nb_sectors)) { /* Hitting this means there was a reentrant request, for @@ -1591,7 +1598,7 @@ static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs, } if (bs->copy_on_read_in_flight) { - wait_for_overlapping_requests(bs, sector_num, nb_sectors); + wait_for_overlapping_requests(bs, sector_num, nb_sectors, false); } tracked_request_begin(&req, bs, sector_num, nb_sectors, false); @@ -1665,7 +1672,7 @@ static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs, } if (bs->copy_on_read_in_flight) { - wait_for_overlapping_requests(bs, sector_num, nb_sectors); + wait_for_overlapping_requests(bs, sector_num, nb_sectors, false); } tracked_request_begin(&req, bs, sector_num, nb_sectors, true);