From patchwork Tue Nov 15 06:37:11 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Butsykin X-Patchwork-Id: 9429485 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 2DF6D6047D for ; Tue, 15 Nov 2016 11:17:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1C6AE28736 for ; Tue, 15 Nov 2016 11:17:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B94322875C; Tue, 15 Nov 2016 11:17:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id E9C9D28736 for ; Tue, 15 Nov 2016 11:17:37 +0000 (UTC) Received: from localhost ([::1]:45584 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c6bk8-0008Ck-28 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 15 Nov 2016 06:17:36 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45655) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c6bc4-0001gO-EQ for qemu-devel@nongnu.org; Tue, 15 Nov 2016 06:09:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c6bbz-0000dF-Ee for qemu-devel@nongnu.org; Tue, 15 Nov 2016 06:09:16 -0500 Received: from mail-db5eur01on0130.outbound.protection.outlook.com ([104.47.2.130]:3776 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1c6bby-0000d5-Ti; Tue, 15 Nov 2016 06:09:11 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=ZszdrxxGaJ/4FTg+lI1kgZkXRaSfQJf6TzfIZnTH0Oc=; b=EvNYX20HK+RfwOGzg528wo3VhtRiKJKsr5g/cfBfY71T9XuQDZw+HwoUSKAEQMDp28s8iia2EEuc0VGudgVjkbo3caHtikG4u+N4Tf8ZFO44vD/FJMafcXpPPw8f0txpKwqHPAdfiZ63wPHmhvu05NyBExBQHZ84yiTmoXUGOLk= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=pbutsykin@virtuozzo.com; Received: from pavelb-Z68P-DS3.sw.ru (195.214.232.10) by VI1PR0802MB2558.eurprd08.prod.outlook.com (10.172.255.136) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.721.10; Tue, 15 Nov 2016 06:38:28 +0000 From: Pavel Butsykin To: , Date: Tue, 15 Nov 2016 09:37:11 +0300 Message-ID: <20161115063715.12561-15-pbutsykin@virtuozzo.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20161115063715.12561-1-pbutsykin@virtuozzo.com> References: <20161115063715.12561-1-pbutsykin@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AM5PR0101CA0010.eurprd01.prod.exchangelabs.com (10.169.240.20) To VI1PR0802MB2558.eurprd08.prod.outlook.com (10.172.255.136) X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2558; 2:W8kGHLH9QvaaaWl/ckKLhsiBsw64RFE/mOOo5vplIxnJfqJwcd1+LsZdLPS9WRTbaPDsoEK9nef/T99l29MNHTxc0o3xHfVuHN7HANa6myf/mRS/ybLrVKtbcj0e2cCfrGpX3cLrys5b//xL7D9imEfo0aVqRRwQotd6CZBjblg=; 3:YEvhxyPT3EW81BYbrjoEV6PKeJcQt9ybp2TkJzqe/4VmKKeJcvGzhP4RlSNhB69d8t/y7o7qenqTH3yrcxujHWnT+Vu9/f/YZnBawEjTMfm3ZD7Fa2FZLLqbEhRUc8QJlz+0WYw/PWVvqqaqKgf7megzZZZrOSosVnEodv0ElJw= X-MS-Office365-Filtering-Correlation-Id: f0dc6ee7-78e1-4d16-5ca0-08d40d2202fe X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:VI1PR0802MB2558; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2558; 25:KYK9FlZWOwDsjui7XM30KtzlPZiG4np1V0yl3IppR9Gk3QUN/pWxz1Tk4wgC282X1AzPzaoYyIeguuNaYzedkrPn29WOdOiCAhKec06uuTSpnTvjuzgEO0i/o+DpuHUADxGbSaz3MQVwW0bXrWRC8JilgvffEaTJfGheBhK5cgSmGfkZgzeli+CGJeft2OyJfOfiUwr5GAvWzVymjcJLEPjAPhLFuxzR4eJhiz/osEfVINufnA7WSC1uz86FlWntBbTNg4k+IW0W4BSPoCOmi90fklvl9O4H57nnECml0tYZK5oql5s5rO617Rx8vvh6JpRDe3ZpCd2bdlcAmohriOMiFD0emVwl4X9su+wLCpd8E8xIZOK4MCMzKwM8Shwnj8bixEOrwaSFdHCpErnuKxDb5gvdohpe/swpXgUuTS2ffzPXCbV+uVPJtx7eCXQ8RkHEjKHyusKI4v0XH+n0ERiUaFLSuRs8pKFyFiueksrUsgxqhzEga6EZ8M/WKnclnkdf3ILQ75G0032rWUJTXjXly83PAdhbMIUGPczUWSTXVODv2nPTW5wnLN/HvVFDJPs+Q6nxUobsRWhCG0boPE6aK7ffP+Jp1bI1aKE9L8jYSgBG3McJLc0Rq3l+G7l0A8OQ8t6+BO0Lxv8yNSKuiFDpRim4TjOZsDoup9676Tzf+HpIoPg1/El6gvKfK9zGfANUVnCqYC3BvR89IJX9Cw== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2558; 31:OO4Ehd8a0R/PqS0CBufKTr8eHyUsQmfxRjr8u1KYQJIstyAk3Zh22+uMGlZXqhZMCFPa9WBsPQ7Fwxc9FIjkmAr/ApjF/FYc6ADpshieonCxba3vEMxr8NwnKYcaT0TGPQW+RVPw9qe5RhWZ5i4nmzrMPjEl+XF05E4mMWGfx5ldWVJl2osHBdCTEPfwLSP1eoJ4YAOt20ZozVw0588AkYUqfGcP2AqH/RIh9nYauMw09hBHPPEkpXUP9vOTAF2V; 20:fV598O+9KOM1igKEcye96cj+WChM580qN5oDJSuLhxbRRU7ZZbHi5VL6ww/RYBbMSU+EWHEm2KKgckfnpPWU5PcKr4MAZSj7B4rwoVuekjF4AkM42oFfugc1JjcfYRokAqwDaCCZbCsxxe+oJvUNZvKGLU5pevwOr33UPTgubq0=; 4:jfPict42dVjRUMstkQU8um5XdILdLwJG78COjfu70H6C35S8BZ4pkTqdoQfOWsEsk14udIf+MDnIvPlRx18o2o+7jmg/Rj/drUrnZyxaYn981t+tWRF29q9uaZ275QzXYNQUqDlStE+YnSLVey5gZtWv50/j9QUDqeO+i5ond/qcVdnsIstdrOMDsk38yFTo2StokIpTnDEhZkGjDzC4jXatNB8k/KwUXq/EADXI0lsemus+Su88w5zFr+1jAScLYtGqY4CASJp8rjX09Xcptvm9MNGk8iOleVx+dcO/ZYnq0shzvSGEe8jvqMBR0HuTwuizziL82/iA3gH+lAGyC3MTkJ70JATsoCa2+5ZsWxMy6txHvKBhdVS3Gdy6MhD6ruoj7j7d+PLCSraTp/WKtOsdTDYtI95o4XzrcShXe6+3XoaARRFk5Aa62YQ2roRI X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6060326)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6061324)(6043046); SRVR:VI1PR0802MB2558; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0802MB2558; X-Forefront-PRVS: 012792EC17 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(7916002)(199003)(189002)(47776003)(105586002)(101416001)(1076002)(68736007)(106356001)(6666003)(76176999)(305945005)(4326007)(97736004)(66066001)(53416004)(189998001)(42186005)(69596002)(2906002)(7736002)(5001770100001)(7846002)(86362001)(48376002)(50226002)(2950100002)(50466002)(50986999)(5003940100001)(33646002)(77096005)(81156014)(8676002)(92566002)(81166006)(3846002)(36756003)(6116002)(5660300001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0802MB2558; H:pavelb-Z68P-DS3.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0802MB2558; 23:axtgbOF9cZGClN9vWdBZLJNsp70+GX5WnEq28qg?= =?us-ascii?Q?4fOYIc6q0s+jdThlxLj1X1zvjbnEmM5RLpPm5NXVbsmfK7y2rP590qKID7xB?= =?us-ascii?Q?GuBU6Fcg+b9+w8fqBOKXode5RKesAKuhZjvwNJwP+n6qUcWEiq6n3t2m3myl?= =?us-ascii?Q?ubOWJfyVzejN4+m8ivPadaaDnHRbRmWL1WOFB+50BBgKA2CoZsBiW75aXtCE?= =?us-ascii?Q?yTxlUEXibk6cGyYiP5McwR+rGsrthlAhG3JQ5TschrQoh8YwwStbYlVKXl43?= =?us-ascii?Q?ztNf4cJtOOE6gGd4+x8cp7reFNzwXjoz6ZqFFxuoY2vmI/4iTTPqndSL9aXM?= =?us-ascii?Q?eWTmOeNT0OE7mTWdjeSd9+6pM+02B4gAyb4B+xeEOvjANl8r6pvuThyUf919?= =?us-ascii?Q?5PIXViSM/mhjh+V5tSlp5jkOOsJDlQqevvaeRr3uFiGTZE/4lAIwGpGVSjaW?= =?us-ascii?Q?lDaZgdcUXOYvvTfSpd2lAj3JEgTXKGFUicivUvVRmaAsxO6+JK7dNaFDgsJv?= =?us-ascii?Q?KKpB1G7HotFRuFhCTMovmxSsrtkvaYK3DOtjAo67AV8a/ipZUx4rMma0YGw8?= =?us-ascii?Q?mMJMYKVRVTA+4zZ8/cS8xQol+W+T2Vf90SSZ56GpaMX37O4uNDn+wHawaNsc?= =?us-ascii?Q?UOYkr4Zn1mBSGRALblJ+3XA08EJc8U3BzGXEuGTk9QiJgqWPBPll305LmV7+?= =?us-ascii?Q?km3YqRclrFXxAslxqvjUvzexnYwHUAT3O/cornoi46geeajcEtf58xUNXIIC?= =?us-ascii?Q?OaBsYe8/DnGWFv2Zsghnq63hFAS3JSu3iZS6K5eeYhRTSt9K09PEfwdHMWBn?= =?us-ascii?Q?Z6J0bLDUXw66fj4fYzCjmNNxroocXC1XM0AdwiOTSZgPqbDBSK+xduoPQIjr?= =?us-ascii?Q?IVWAU8Sh/9Pt0G0sTpGnJbN2+L70/Esu8RJ/uKQVHOHPp9YF8Z/6H3ONrw8v?= =?us-ascii?Q?UySqVMcQx1Tk7g6YjLY77w5mZdJwXjmWn32NXJ/ete7xXvugtltnmPSNtmCR?= =?us-ascii?Q?MaCtCEeZGXuqc559Ez3cHEENdXBfhLO5D+fk15SY/WmZLfGi6yjBXyOPBEJW?= =?us-ascii?Q?gEQCTjwBQ4vKytu/im57PWJW/Y3aW?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2558; 6:S3q3ZpjteApe9PLpWT0isMvo2hGxXzl8+Zxel0Rfzp8GXrbt9PLltQGW9YlCCe0QbULkGNsnkqNSNXjeedVHmNZsTlM11LKRb/UQDlUF5f9+kHa3/XFByf/PGMz5f2B3lzutWgWvluHNkFg9WGz7E5xZs/L3O/pfr/4W42vhwNXjEoUK2MCpxwwsW8B1M0X2HE5vilbTgW69Y9il1/EeGzBxyUCHl40h+BJ3xoU98RjjUtFeCSOhwUY4EofUsVKfIi7hYhrmk8w8Nn2IHQcNQMkU22InTxjLWqzTe+GiuJ57TKzg3rDxM3BnIsuWP158g/+RKtz0cdj/KBzdsG20ThLZIZElS8q8hVEv7LD1fck=; 5:lUOGlZl8fm6dXOH6TcjESEKUzd1/TJIVmawLcFnlVJmX6pyKoyNdxxQAZUqZ0vYy+b7lLBfL8/D9pGRBvPWOgC6wMWRxFGfj3SSi323BPBMv31p8sSgfjZooexUrESgRCnMTs+pqRFin4jo+B7MOphLjFw378L8jc6thtBS61+4=; 24:gDYLB3UxGOMPvDIt/8TUwtDSnZWNSFYmI/1a8/mBLz2eujdUrJtJ/Z/fgo4sFTdWw7SAPR6b4hKyQMfRYu39hm/JHqWDd1o1Un7ZN/ys3sU= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2558; 7:Qey5HR3f2qvHk/jRXyHqGdx7JFvW7lk8EpCCJhT8dcUDAdD+Fn6xdK70c6FG6O8pew/1ZA5eOx777G7eNE8wum8lQ1D9a1OeOAMJj3K5cAkQjeIDQ0jVUpY4itsq0gXGG8DjzxORG1U6e9ueuFSFHw5Hr/4Aik8ISSaB9r3OfOevUYvq7itaE79KXXE/j74R11BJNxceXz73pg8vKqkSfrP8C0wIwiSkpjVluQD7siXvyBUMbjPu0s+DbXwwdLtV/iAjbNm7gQHFjuxGkmCzHlySryQSUUjpHrgCeBinJUslleUbYEO9hzwiIcE0krd4tVT9lv724mwvD+qrZLczUa6SNEWTnVR1SL+2EkcSTXY=; 20:2JLbMxgXkMQu5AHd1V3xbS4Lhf6MwMNwMjV+QrOLPQyH7YTErGGEkQmYQk19Uzsp3UeXbeVJTwzmSVa46mUx5UFF2hSmRUPQuNpaQ2Y/Vl8+Smubohs8Tpv/2+z38LzhnMZFSvAOBH0RpausgY7OLTDg5zbHo+ejrDEzo3WAJGY= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Nov 2016 06:38:28.9230 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0802MB2558 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.130 Subject: [Qemu-devel] [PATCH v1 14/18] backup/pcache: pick up parts of the cache 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: kwolf@redhat.com, famz@redhat.com, mreitz@redhat.com, stefanha@redhat.com, den@openvz.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Provided that the request size is less than the readahead size, a partial cache hit can occur in the following three cases: 1. The request covers the bottom part of the node 2. The request covers the upper part of the node 3. The request is between two nodes and partially covers both of them The function pickup_parts_of_cache() covers all three cases and for the uncached part of the request it creates a new request. Signed-off-by: Pavel Butsykin --- block/pcache.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/block/pcache.c b/block/pcache.c index 55d1061..40fa3f3 100644 --- a/block/pcache.c +++ b/block/pcache.c @@ -100,6 +100,11 @@ typedef struct PCacheAIOCBRead { uint64_t offset; uint64_t bytes; QEMUIOVector *qiov; + struct { + QEMUIOVector qiov; + uint64_t offset; + uint64_t bytes; + } part; int ref; int ret; } PCacheAIOCBRead; @@ -189,6 +194,10 @@ static void pcache_aio_read_cb(void *opaque, int ret) { PCacheAIOCBRead *acb = opaque; + if (acb->part.qiov.niov != 0) { + qemu_iovec_destroy(&acb->part.qiov); + } + aio_read_complete(acb, ret); } @@ -421,6 +430,44 @@ static void pcache_readahead_request(PCacheAIOCBRead *acb) qemu_coroutine_enter(co); } +static void set_part_req(PCacheAIOCBRead *acb, uint64_t offset, uint64_t bytes) +{ + acb->part.offset = offset; + acb->part.bytes = bytes; + + assert(acb->part.qiov.niov == 0); + + qemu_iovec_init(&acb->part.qiov, acb->qiov->niov); + qemu_iovec_concat(&acb->part.qiov, acb->qiov, offset - acb->offset, bytes); +} + +static void pickup_parts_of_cache(PCacheAIOCBRead *acb, PCacheNode *node, + uint64_t offset, uint64_t bytes) +{ + BDRVPCacheState *s = acb->bs->opaque; + uint64_t end_offs = offset + bytes; + + do { + if (offset < node->common.offset) { + set_part_req(acb, offset, node->common.offset - offset); + } + + pcache_aio_read(acb, node); + + offset = node->common.offset + node->common.bytes; + if (end_offs <= offset) { + break; + } + + bytes = end_offs - offset; + node = rbcache_search(s->cache, offset, bytes); + if (node == NULL) { + set_part_req(acb, offset, bytes); + break; + } + } while (true); +} + enum { CACHE_MISS, CACHE_HIT, @@ -444,7 +491,9 @@ static int pcache_lookup_data(PCacheAIOCBRead *acb) return CACHE_HIT; } - return PARTIAL_CACHE_HIT; + pickup_parts_of_cache(acb, node, acb->offset, acb->bytes); + + return acb->part.qiov.niov == 0 ? CACHE_HIT : PARTIAL_CACHE_HIT; } static coroutine_fn int pcache_co_preadv(BlockDriverState *bs, uint64_t offset, @@ -471,9 +520,13 @@ static coroutine_fn int pcache_co_preadv(BlockDriverState *bs, uint64_t offset, update_req_stats(s->req_stats, offset, bytes); status = pcache_lookup_data(&acb); - if (status == CACHE_MISS || status == PARTIAL_CACHE_HIT) { + if (status == CACHE_MISS) { bdrv_aio_preadv(bs->file, offset, qiov, bytes, pcache_aio_read_cb, &acb); + } else if (status == PARTIAL_CACHE_HIT) { + assert(acb.part.qiov.niov != 0); + bdrv_aio_preadv(bs->file, acb.part.offset, &acb.part.qiov, + acb.part.bytes, pcache_aio_read_cb, &acb); } pcache_readahead_request(&acb);