From patchwork Wed May 6 13:39:28 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alberto Garcia X-Patchwork-Id: 468932 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 D85F71402BF for ; Wed, 6 May 2015 23:41:22 +1000 (AEST) Received: from localhost ([::1]:45146 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YpzZg-0001Cr-17 for incoming@patchwork.ozlabs.org; Wed, 06 May 2015 09:41:20 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39949) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YpzYw-0000AZ-No for qemu-devel@nongnu.org; Wed, 06 May 2015 09:40:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YpzYs-0001Ra-0t for qemu-devel@nongnu.org; Wed, 06 May 2015 09:40:34 -0400 Received: from smtp3.mundo-r.com ([212.51.32.191]:6703 helo=smtp4.mundo-r.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YpzYr-0001R3-GY; Wed, 06 May 2015 09:40:29 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtQFAEMZSlVbdWOb/2dsb2JhbABcgwyBL7NtAQEBAwUBgQKYSgKBJUwBAQEBAQGBC4QhAQEEJ1IQUTwbGYgwAcUYAQEIIoYXiicHFoQXBYZUhTWMdoN+jFSJZCNggSccgVU7MYJFAQEB X-IPAS-Result: AtQFAEMZSlVbdWOb/2dsb2JhbABcgwyBL7NtAQEBAwUBgQKYSgKBJUwBAQEBAQGBC4QhAQEEJ1IQUTwbGYgwAcUYAQEIIoYXiicHFoQXBYZUhTWMdoN+jFSJZCNggSccgVU7MYJFAQEB X-IronPort-AV: E=Sophos;i="5.13,379,1427752800"; d="scan'208";a="354101281" Received: from fanzine.igalia.com ([91.117.99.155]) by smtp4.mundo-r.com with ESMTP; 06 May 2015 15:39:48 +0200 Received: from maestria.local.igalia.com ([192.168.10.14] helo=mail.igalia.com) by fanzine.igalia.com with esmtps (Cipher TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim) id 1YpzYC-0003bQ-UK; Wed, 06 May 2015 15:39:48 +0200 Received: from fanzine.local.igalia.com ([192.168.10.13] helo=perseus.local) by mail.igalia.com with esmtps (Cipher TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim) id 1YpzYC-0006RK-09; Wed, 06 May 2015 15:39:48 +0200 Received: from berto by perseus.local with local (Exim 4.85) (envelope-from ) id 1YpzYA-0006uA-LC; Wed, 06 May 2015 16:39:46 +0300 From: Alberto Garcia To: qemu-devel@nongnu.org Date: Wed, 6 May 2015 16:39:28 +0300 Message-Id: <119060b56f474e32cbbe9327303a8a690f3f24e0.1430919406.git.berto@igalia.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 212.51.32.191 Cc: Kevin Wolf , Alberto Garcia , qemu-block@nongnu.org, Stefan Hajnoczi Subject: [Qemu-devel] [PATCH 4/7] qcow2: remove qcow2_cache_find_entry_to_replace() 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 A cache miss means that the whole array was traversed and the entry we were looking for was not found, so there's no need to traverse it again in order to select an entry to replace. Signed-off-by: Alberto Garcia Reviewed-by: Stefan Hajnoczi Reviewed-by: Max Reitz --- block/qcow2-cache.c | 45 ++++++++++++++++----------------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/block/qcow2-cache.c b/block/qcow2-cache.c index 786c10a..dffb887 100644 --- a/block/qcow2-cache.c +++ b/block/qcow2-cache.c @@ -242,51 +242,38 @@ int qcow2_cache_empty(BlockDriverState *bs, Qcow2Cache *c) return 0; } -static int qcow2_cache_find_entry_to_replace(Qcow2Cache *c) -{ - int i; - uint64_t min_lru_counter = UINT64_MAX; - int min_index = -1; - - - for (i = 0; i < c->size; i++) { - if (c->entries[i].ref) { - continue; - } - - if (c->entries[i].lru_counter < min_lru_counter) { - min_index = i; - min_lru_counter = c->entries[i].lru_counter; - } - } - - if (min_index == -1) { - /* This can't happen in current synchronous code, but leave the check - * here as a reminder for whoever starts using AIO with the cache */ - abort(); - } - return min_index; -} - static int qcow2_cache_do_get(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset, void **table, bool read_from_disk) { BDRVQcowState *s = bs->opaque; int i; int ret; + uint64_t min_lru_counter = UINT64_MAX; + int min_lru_index = -1; trace_qcow2_cache_get(qemu_coroutine_self(), c == s->l2_table_cache, offset, read_from_disk); /* Check if the table is already cached */ for (i = 0; i < c->size; i++) { - if (c->entries[i].offset == offset) { + const Qcow2CachedTable *t = &c->entries[i]; + if (t->offset == offset) { goto found; } + if (t->ref == 0 && t->lru_counter < min_lru_counter) { + min_lru_counter = t->lru_counter; + min_lru_index = i; + } + } + + if (min_lru_index == -1) { + /* This can't happen in current synchronous code, but leave the check + * here as a reminder for whoever starts using AIO with the cache */ + abort(); } - /* If not, write a table back and replace it */ - i = qcow2_cache_find_entry_to_replace(c); + /* Cache miss: write a table back and replace it */ + i = min_lru_index; trace_qcow2_cache_get_replace_entry(qemu_coroutine_self(), c == s->l2_table_cache, i); if (i < 0) {