From patchwork Tue Sep 8 08:00:26 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Denis V. Lunev" X-Patchwork-Id: 515309 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)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id E485514018C for ; Tue, 8 Sep 2015 18:02:43 +1000 (AEST) Received: from localhost ([::1]:60619 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZZDrW-00054f-45 for incoming@patchwork.ozlabs.org; Tue, 08 Sep 2015 04:02:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38985) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZZDpb-0001l2-4m for qemu-devel@nongnu.org; Tue, 08 Sep 2015 04:00:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZZDpZ-0000iw-29 for qemu-devel@nongnu.org; Tue, 08 Sep 2015 04:00:42 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:24340 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZZDpY-0000h7-EX for qemu-devel@nongnu.org; Tue, 08 Sep 2015 04:00:40 -0400 Received: from irbis.sw.ru ([10.30.2.139]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id t8880SDg008153; Tue, 8 Sep 2015 11:00:35 +0300 (MSK) From: "Denis V. Lunev" To: Date: Tue, 8 Sep 2015 11:00:26 +0300 Message-Id: <1441699228-25767-4-git-send-email-den@openvz.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1441699228-25767-1-git-send-email-den@openvz.org> References: <1441699228-25767-1-git-send-email-den@openvz.org> X-detected-operating-system: by eggs.gnu.org: OpenBSD 3.x X-Received-From: 195.214.232.25 Cc: Kevin Wolf , qemu-devel@nongnu.org, Raushaniya Maksudova , Markus Armbruster , Stefan Hajnoczi , "Denis V. Lunev" Subject: [Qemu-devel] [PATCH 3/5] disk_deadlines: add disk-deadlines option per drive 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: Raushaniya Maksudova This patch adds per-drive option disk-deadlines. If it is enabled, one tracks which disk'requests were not completed in time. By default it is unset. Signed-off-by: Raushaniya Maksudova Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Kevin Wolf CC: Markus Armbruster --- block/Makefile.objs | 1 + block/disk-deadlines.c | 30 ++++++++++++++++++++++++++++++ blockdev.c | 19 +++++++++++++++++++ include/block/accounting.h | 2 ++ include/block/disk-deadlines.h | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 block/disk-deadlines.c create mode 100644 include/block/disk-deadlines.h diff --git a/block/Makefile.objs b/block/Makefile.objs index 58ef2ef..cf30ce5 100644 --- a/block/Makefile.objs +++ b/block/Makefile.objs @@ -20,6 +20,7 @@ block-obj-$(CONFIG_RBD) += rbd.o block-obj-$(CONFIG_GLUSTERFS) += gluster.o block-obj-$(CONFIG_ARCHIPELAGO) += archipelago.o block-obj-$(CONFIG_LIBSSH2) += ssh.o +block-obj-y += disk-deadlines.o block-obj-y += accounting.o block-obj-y += write-threshold.o diff --git a/block/disk-deadlines.c b/block/disk-deadlines.c new file mode 100644 index 0000000..39dec53 --- /dev/null +++ b/block/disk-deadlines.c @@ -0,0 +1,30 @@ +/* + * QEMU System Emulator disk deadlines control + * + * Copyright (c) 2015 Raushaniya Maksudova + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "block/disk-deadlines.h" + +void disk_deadlines_init(DiskDeadlines *disk_deadlines, bool enabled) +{ + disk_deadlines->enabled = enabled; +} diff --git a/blockdev.c b/blockdev.c index 6b48be6..6cd9c6e 100644 --- a/blockdev.c +++ b/blockdev.c @@ -361,6 +361,7 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts, ThrottleConfig cfg; int snapshot = 0; bool copy_on_read; + bool disk_deadlines; Error *error = NULL; QemuOpts *opts; const char *id; @@ -394,6 +395,11 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts, ro = qemu_opt_get_bool(opts, "read-only", 0); copy_on_read = qemu_opt_get_bool(opts, "copy-on-read", false); + disk_deadlines = qdict_get_try_bool(bs_opts, "disk-deadlines", false); + if (disk_deadlines) { + qdict_del(bs_opts, "disk-deadlines"); + } + if ((buf = qemu_opt_get(opts, "discard")) != NULL) { if (bdrv_parse_discard_flags(buf, &bdrv_flags) != 0) { error_setg(errp, "invalid discard option"); @@ -555,6 +561,8 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts, bs->detect_zeroes = detect_zeroes; + disk_deadlines_init(&bs->stats.disk_deadlines, disk_deadlines); + bdrv_set_on_error(bs, on_read_error, on_write_error); /* disk I/O throttling */ @@ -658,6 +666,10 @@ QemuOptsList qemu_legacy_drive_opts = { .name = "file", .type = QEMU_OPT_STRING, .help = "file name", + },{ + .name = "disk-deadlines", + .type = QEMU_OPT_BOOL, + .help = "control of disk requests' time execution", }, /* Options that are passed on, but have special semantics with -drive */ @@ -698,6 +710,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type) const char *werror, *rerror; bool read_only = false; bool copy_on_read; + bool disk_deadlines; const char *serial; const char *filename; Error *local_err = NULL; @@ -812,6 +825,12 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type) qdict_put(bs_opts, "copy-on-read", qstring_from_str(copy_on_read ? "on" :"off")); + /* Enable control of disk requests' time execution */ + disk_deadlines = qemu_opt_get_bool(legacy_opts, "disk-deadlines", false); + if (disk_deadlines) { + qdict_put(bs_opts, "disk-deadlines", qbool_from_bool(disk_deadlines)); + } + /* Controller type */ value = qemu_opt_get(legacy_opts, "if"); if (value) { diff --git a/include/block/accounting.h b/include/block/accounting.h index 4c406cf..4e2b345 100644 --- a/include/block/accounting.h +++ b/include/block/accounting.h @@ -27,6 +27,7 @@ #include #include "qemu/typedefs.h" +#include "block/disk-deadlines.h" enum BlockAcctType { BLOCK_ACCT_READ, @@ -41,6 +42,7 @@ typedef struct BlockAcctStats { uint64_t total_time_ns[BLOCK_MAX_IOTYPE]; uint64_t merged[BLOCK_MAX_IOTYPE]; uint64_t wr_highest_sector; + DiskDeadlines disk_deadlines; } BlockAcctStats; typedef struct BlockAcctCookie { diff --git a/include/block/disk-deadlines.h b/include/block/disk-deadlines.h new file mode 100644 index 0000000..2ea193b --- /dev/null +++ b/include/block/disk-deadlines.h @@ -0,0 +1,35 @@ +/* + * QEMU System Emulator disk deadlines control + * + * Copyright (c) 2015 Raushaniya Maksudova + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef DISK_DEADLINES_H +#define DISK_DEADLINES_H + +#include + +typedef struct DiskDeadlines { + bool enabled; +} DiskDeadlines; + +void disk_deadlines_init(DiskDeadlines *disk_deadlines, bool enabled); + +#endif