From patchwork Wed Apr 15 00:59:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Adalbert_Laz=C4=83r?= X-Patchwork-Id: 1270799 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=bitdefender.com Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49246b0nk0z9sSm for ; Wed, 15 Apr 2020 11:10:47 +1000 (AEST) Received: from localhost ([::1]:40966 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWZg-00048D-Ut for incoming@patchwork.ozlabs.org; Tue, 14 Apr 2020 21:10:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58494) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPA-0001Lk-Ld for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP9-0005Ce-5K for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:52 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49102) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052P-J0 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:50 -0400 Received: from smtp.bitdefender.com (smtp02.buh.bitdefender.net [10.17.80.76]) by mx01.bbu.dsd.mx.bitdefender.com (Postfix) with ESMTPS id BCBB630747D3 for ; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id AC5CE305B7A0; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) From: =?utf-8?q?Adalbert_Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 17/26] kvm: vmi: add 'unhook_timeout' property Date: Wed, 15 Apr 2020 03:59:29 +0300 Message-Id: <20200415005938.23895-18-alazar@bitdefender.com> In-Reply-To: <20200415005938.23895-1-alazar@bitdefender.com> References: <20200415005938.23895-1-alazar@bitdefender.com> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 91.199.104.161 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?utf-8?q?Adalbert_Laz=C4=83r?= Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" When the introspection tool has to remove all changes made to the introspected VM, the guest must run because some hooks can be removed only in certain conditions. But this shouldn't take too long even with a host under heavy load. So, if the socket is not closed by the introspection tool at the end of this unhook process in the time specified by the unhook_timeout property, QEMU will shutdown the socket. Signed-off-by: Adalbert Lazăr --- accel/kvm/vmi.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 151e27265a..1f3aff3bfe 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -25,6 +25,7 @@ #include "sysemu/vmi-handshake.h" #define HANDSHAKE_TIMEOUT_SEC 10 +#define UNHOOK_TIMEOUT_SEC 60 typedef struct VMIntrospection { Object parent_obj; @@ -48,6 +49,8 @@ typedef struct VMIntrospection { uint32_t handshake_timeout; int intercepted_action; + GSource *unhook_timer; + uint32_t unhook_timeout; int reconnect_time; @@ -219,6 +222,11 @@ static void instance_init(Object *obj) object_property_add(obj, "handshake_timeout", "uint32", prop_set_uint32, prop_get_uint32, NULL, &i->handshake_timeout, NULL); + + i->unhook_timeout = UNHOOK_TIMEOUT_SEC; + object_property_add(obj, "unhook_timeout", "uint32", + prop_set_uint32, prop_get_uint32, + NULL, &i->unhook_timeout, NULL); } static void disconnect_chardev(VMIntrospection *i) @@ -269,6 +277,12 @@ static void cancel_handshake_timer(VMIntrospection *i) i->hsk_timer = NULL; } +static void cancel_unhook_timer(VMIntrospection *i) +{ + cancel_timer(i->unhook_timer); + i->unhook_timer = NULL; +} + static void instance_finalize(Object *obj) { VMIntrospectionClass *ic = VM_INTROSPECTION_CLASS(obj->class); @@ -277,6 +291,7 @@ static void instance_finalize(Object *obj) g_free(i->chardevid); g_free(i->keyid); + cancel_unhook_timer(i); cancel_handshake_timer(i); if (i->chr) { @@ -576,6 +591,7 @@ static void chr_event_close(VMIntrospection *i) disconnect_and_unhook_kvmi(i); } + cancel_unhook_timer(i); cancel_handshake_timer(i); if (suspend_pending) { @@ -604,6 +620,19 @@ static void chr_event(void *opaque, QEMUChrEvent event) } } +static gboolean unhook_timeout_cbk(gpointer opaque) +{ + VMIntrospection *i = opaque; + + warn_report("VMI: the introspection tool is too slow"); + + g_source_unref(i->unhook_timer); + i->unhook_timer = NULL; + + disconnect_and_unhook_kvmi(i); + return FALSE; +} + static VMIntrospection *vm_introspection_object(void) { VMIntrospectionClass *ic; @@ -663,6 +692,10 @@ static bool intercept_action(VMIntrospection *i, return false; } + i->unhook_timer = qemu_chr_timeout_add_ms(i->chr, + i->unhook_timeout * 1000, + unhook_timeout_cbk, i); + i->intercepted_action = action; return true; }