From nobody Mon Apr 29 14:49:19 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1572577088; cv=none; d=zoho.com; s=zohoarc; b=jrjz0BqP3wbZIBHidTpmPsH6c9ZYJoLJItVo9q8w5kEetdUy9N9B/6Tgnfk5EAmBBhx/HT4jTmHfXZusxDMKD4CH2uIhpJJ5mMw352r8Blx+mzC/qQtHAPzCX8SzL7BykRYtQ/CiqgGKUsWvrA6FAFE5hM6AJWK2JUvcIiD7b+Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1572577088; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=Sof4e0CZDWTYNhK68ynEceyrXVdMk+l306nhK/IRaFQ=; b=G7/dlsBZfEEYMyxV9nPcMWjCY20u+xX7CGOd5aAL7hrzVEkFBY9NiQpfNj3g9TZQIhR4TW8vuxOQLz0NxeGntPcuBM/M5eNjtmYg8ctyNukoZrPXyGgmwOnMmqlqFf9Vhktz9dfSJQ5tyTm1EUZRI6ZBgJHreoD9UEpoZS6bGMw= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1572577088797597.0831881099376; Thu, 31 Oct 2019 19:58:08 -0700 (PDT) Received: from localhost ([::1]:55518 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQN8Y-0006ax-IF for importer@patchew.org; Thu, 31 Oct 2019 22:58:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:56503) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQN6R-0004vs-2V for qemu-devel@nongnu.org; Thu, 31 Oct 2019 22:55:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iQN6M-00012f-UC for qemu-devel@nongnu.org; Thu, 31 Oct 2019 22:55:53 -0400 Received: from mga09.intel.com ([134.134.136.24]:16106) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iQN6M-0000ZE-KG for qemu-devel@nongnu.org; Thu, 31 Oct 2019 22:55:50 -0400 Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 31 Oct 2019 19:55:42 -0700 Received: from unknown (HELO localhost.localdomain) ([10.239.13.19]) by fmsmga008.fm.intel.com with ESMTP; 31 Oct 2019 19:55:41 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,253,1569308400"; d="scan'208";a="199216662" From: Zhang Chen To: Jason Wang , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-dev Subject: [PATCH V2 1/4] net/awd.c: Introduce Advanced Watch Dog module framework Date: Fri, 1 Nov 2019 10:48:47 +0800 Message-Id: <20191101024850.20808-2-chen.zhang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191101024850.20808-1-chen.zhang@intel.com> References: <20191101024850.20808-1-chen.zhang@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 134.134.136.24 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: Zhang Chen , Zhang Chen Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Zhang Chen This patch introduce a new module named Advanced Watch Dog, and defined the input and output parameter. AWD use standard chardev as the way of communicationg with the outside world. If you want to use it, please add "--enable-awd" when configure qemu. Demo command: -object advanced-watchdog,id=3Dheart1,server=3Don,awd_node=3Dh1,notificatio= n_node=3Dheartbeat0,opt_script=3Dopt_script_path,iothread=3Diothread1,pulse= _interval=3D1000,timeout=3D5000 Signed-off-by: Zhang Chen --- configure | 9 ++ net/Makefile.objs | 1 + net/awd.c | 261 ++++++++++++++++++++++++++++++++++++++++++++++ qemu-options.hx | 6 ++ 4 files changed, 277 insertions(+) create mode 100644 net/awd.c diff --git a/configure b/configure index 72553f98ea..a857a8c2d7 100755 --- a/configure +++ b/configure @@ -383,6 +383,7 @@ vhost_scsi=3D"" vhost_vsock=3D"" vhost_user=3D"" vhost_user_fs=3D"" +awd=3D"no" kvm=3D"no" hax=3D"no" hvf=3D"no" @@ -1303,6 +1304,10 @@ for opt do ;; --enable-vhost-user-fs) vhost_user_fs=3D"yes" ;; + --disable-awd) awd=3D"no" + ;; + --enable-awd) awd=3D"yes" + ;; --disable-opengl) opengl=3D"no" ;; --enable-opengl) opengl=3D"yes" @@ -1779,6 +1784,7 @@ disabled with --disable-FEATURE, default is enabled i= f available: vhost-crypto vhost-user-crypto backend support vhost-kernel vhost kernel backend support vhost-user vhost-user backend support + awd Advanced Watch Dog support spice spice rbd rados block device (rbd) libiscsi iscsi support @@ -7002,6 +7008,9 @@ fi if test "$vhost_user" =3D "yes" ; then echo "CONFIG_VHOST_USER=3Dy" >> $config_host_mak fi +if test "$awd" =3D "yes" ; then + echo "CONFIG_AWD=3Dy" >> $config_host_mak +fi if test "$vhost_user_fs" =3D "yes" ; then echo "CONFIG_VHOST_USER_FS=3Dy" >> $config_host_mak fi diff --git a/net/Makefile.objs b/net/Makefile.objs index c5d076d19c..187e655443 100644 --- a/net/Makefile.objs +++ b/net/Makefile.objs @@ -19,6 +19,7 @@ common-obj-y +=3D colo-compare.o common-obj-y +=3D colo.o common-obj-y +=3D filter-rewriter.o common-obj-y +=3D filter-replay.o +common-obj-$(CONFIG_AWD) +=3D awd.o =20 tap-obj-$(CONFIG_LINUX) =3D tap-linux.o tap-obj-$(CONFIG_BSD) =3D tap-bsd.o diff --git a/net/awd.c b/net/awd.c new file mode 100644 index 0000000000..d42b4a7372 --- /dev/null +++ b/net/awd.c @@ -0,0 +1,261 @@ +/* + * Advanced Watch Dog + * + * COarse-grain LOck-stepping Virtual Machines for Non-stop Service (COLO) + * (a.k.a. Fault Tolerance or Continuous Replication) + * + * Copyright (c) 2019 Intel Corporation + * + * Author: Zhang Chen + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * later. See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "trace.h" +#include "qemu-common.h" +#include "qapi/error.h" +#include "net/net.h" +#include "qom/object_interfaces.h" +#include "qom/object.h" +#include "chardev/char-fe.h" +#include "qemu/sockets.h" +#include "sysemu/iothread.h" + +#define TYPE_AWD "advanced-watchdog" +#define AWD(obj) OBJECT_CHECK(AwdState, (obj), TYPE_AWD) + +#define AWD_READ_LEN_MAX NET_BUFSIZE +/* Default advanced watchdog pulse interval */ +#define AWD_PULSE_INTERVAL_DEFAULT 5000 +/* Default advanced watchdog timeout */ +#define AWD_TIMEOUT_DEFAULT 2000 + +typedef struct AwdState { + Object parent; + + bool server; + char *awd_node; + char *notification_node; + char *opt_script; + uint32_t pulse_interval; + uint32_t timeout; + IOThread *iothread; +} AwdState; + +typedef struct AwdClass { + ObjectClass parent_class; +} AwdClass; + +static char *awd_get_node(Object *obj, Error **errp) +{ + AwdState *s =3D AWD(obj); + + return g_strdup(s->awd_node); +} + +static void awd_set_node(Object *obj, const char *value, Error **errp) +{ + AwdState *s =3D AWD(obj); + + g_free(s->awd_node); + s->awd_node =3D g_strdup(value); +} + +static char *noti_get_node(Object *obj, Error **errp) +{ + AwdState *s =3D AWD(obj); + + return g_strdup(s->notification_node); +} + +static void noti_set_node(Object *obj, const char *value, Error **errp) +{ + AwdState *s =3D AWD(obj); + + g_free(s->notification_node); + s->notification_node =3D g_strdup(value); +} + +static char *opt_script_get_node(Object *obj, Error **errp) +{ + AwdState *s =3D AWD(obj); + + return g_strdup(s->opt_script); +} + +static void opt_script_set_node(Object *obj, const char *value, Error **er= rp) +{ + AwdState *s =3D AWD(obj); + + g_free(s->opt_script); + s->opt_script =3D g_strdup(value); +} + +static bool awd_get_server(Object *obj, Error **errp) +{ + AwdState *s =3D AWD(obj); + + return s->server; +} + +static void awd_set_server(Object *obj, bool value, Error **errp) +{ + AwdState *s =3D AWD(obj); + + s->server =3D value; +} + +static void awd_get_interval(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + AwdState *s =3D AWD(obj); + uint32_t value =3D s->pulse_interval; + + visit_type_uint32(v, name, &value, errp); +} + +static void awd_set_interval(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + AwdState *s =3D AWD(obj); + Error *local_err =3D NULL; + uint32_t value; + + visit_type_uint32(v, name, &value, &local_err); + if (local_err) { + goto out; + } + if (!value) { + error_setg(&local_err, "Property '%s.%s' requires a positive value= ", + object_get_typename(obj), name); + goto out; + } + s->pulse_interval =3D value; + +out: + error_propagate(errp, local_err); +} + +static void awd_get_timeout(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + AwdState *s =3D AWD(obj); + uint32_t value =3D s->timeout; + + visit_type_uint32(v, name, &value, errp); +} + +static void awd_set_timeout(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + AwdState *s =3D AWD(obj); + Error *local_err =3D NULL; + uint32_t value; + + visit_type_uint32(v, name, &value, &local_err); + if (local_err) { + goto out; + } + + if (!value) { + error_setg(&local_err, "Property '%s.%s' requires a positive value= ", + object_get_typename(obj), name); + goto out; + } + s->timeout =3D value; + +out: + error_propagate(errp, local_err); +} + +static void awd_complete(UserCreatable *uc, Error **errp) +{ + AwdState *s =3D AWD(uc); + + if (!s->awd_node || !s->iothread || + !s->notification_node || !s->opt_script) { + error_setg(errp, "advanced-watchdog needs 'awd_node', " + "'notification_node', 'opt_script' " + "and 'server' property set"); + return; + } + + return; +} + +static void awd_class_init(ObjectClass *oc, void *data) +{ + UserCreatableClass *ucc =3D USER_CREATABLE_CLASS(oc); + + ucc->complete =3D awd_complete; +} + +static void awd_init(Object *obj) +{ + AwdState *s =3D AWD(obj); + + object_property_add_str(obj, "awd_node", + awd_get_node, awd_set_node, + NULL); + + object_property_add_str(obj, "notification_node", + noti_get_node, noti_set_node, + NULL); + + object_property_add_str(obj, "opt_script", + opt_script_get_node, opt_script_set_node, + NULL); + + object_property_add_bool(obj, "server", + awd_get_server, + awd_set_server, NULL); + + object_property_add(obj, "pulse_interval", "uint32", + awd_get_interval, + awd_set_interval, NULL, NULL, NULL); + + object_property_add(obj, "timeout", "uint32", + awd_get_timeout, + awd_set_timeout, NULL, NULL, NULL); + + object_property_add_link(obj, "iothread", TYPE_IOTHREAD, + (Object **)&s->iothread, + object_property_allow_set_link, + OBJ_PROP_LINK_STRONG, NULL); +} + +static void awd_finalize(Object *obj) +{ + AwdState *s =3D AWD(obj); + + g_free(s->awd_node); + g_free(s->notification_node); +} + +static const TypeInfo awd_info =3D { + .name =3D TYPE_AWD, + .parent =3D TYPE_OBJECT, + .instance_size =3D sizeof(AwdState), + .instance_init =3D awd_init, + .instance_finalize =3D awd_finalize, + .class_size =3D sizeof(AwdClass), + .class_init =3D awd_class_init, + .interfaces =3D (InterfaceInfo[]) { + { TYPE_USER_CREATABLE }, + { } + } +}; + +static void register_types(void) +{ + type_register_static(&awd_info); +} + +type_init(register_types); diff --git a/qemu-options.hx b/qemu-options.hx index 1fc2470e2f..032be8372d 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -4572,6 +4572,12 @@ Dump the network traffic on netdev @var{dev} to the = file specified by The file format is libpcap, so it can be analyzed with tools such as tcpdu= mp or Wireshark. =20 +@item -object advanced-watchdog,id=3D@var{id},awd_node=3D@var{chardevid},n= otification_node=3D@var{chardevid},server=3D@var{server},iothread=3D@var{id= }[,pulse_interval=3D@var{time_ms},timeout=3D@var{time_ms}] + +Advanced Watch Dog is an universal monitoring module on VMM side, it can b= e used to detect network down(VMM to guest, VMM to VMM, VMM to another remo= te server) and do previously set operation. +for example: send message to admin, notify another VMM, send qmp command t= o qemu do some operation like restart the VM, build VMM heartbeat system, e= tc. +It make user have basic VM/Host network monitoring tools and basic false t= olerance and recovery solution. + @item -object colo-compare,id=3D@var{id},primary_in=3D@var{chardevid},seco= ndary_in=3D@var{chardevid},outdev=3D@var{chardevid},iothread=3D@var{id}[,vn= et_hdr_support][,notify_dev=3D@var{id}] =20 Colo-compare gets packet from primary_in@var{chardevid} and secondary_in@v= ar{chardevid}, than compare primary packet with --=20 2.17.1 From nobody Mon Apr 29 14:49:19 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1572577086; cv=none; d=zoho.com; s=zohoarc; b=Bcp2v1IaCTlBklT3/SNOtJLK3XQMG3h2DrRZ4rczlPqI/NvgMRnaN/Kdrl9kcYIYBeZ7VvU+w+VbzUs9p+3tYs3QCKCZYzTzK8Y7GG7ieyBOAw57IH4J9CPFm/mx0a3uPJ7OEuzTKrDTmCkUb4eKLwziv+xG/RnaO1gKCNjsTO8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1572577086; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=IeLX1OvBrenBmPp2PbsEh+TVa+eDXY976VojxizdQWk=; b=U4gW/BUgvTFhCOksrEuwJChzcpDHIuXEi1LdOuabRKuAqGfRGff/5HabpLVptiPh1fk/NDV9Q4M7+FSMxEQYRhMMYAN5/9mbxVmUIoEzhbuWlcdGvCyORA332cokmapodsrH5sKifBFE+80dQsuRkSuA1HgswHtzL7/7eBjG9fI= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1572577086585933.6736275142216; Thu, 31 Oct 2019 19:58:06 -0700 (PDT) Received: from localhost ([::1]:55520 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQN8U-0006iH-DM for importer@patchew.org; Thu, 31 Oct 2019 22:58:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:56478) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQN6O-0004uS-Os for qemu-devel@nongnu.org; Thu, 31 Oct 2019 22:55:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iQN6M-00012Z-Tw for qemu-devel@nongnu.org; Thu, 31 Oct 2019 22:55:51 -0400 Received: from mga09.intel.com ([134.134.136.24]:16107) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iQN6M-0000gd-KE for qemu-devel@nongnu.org; Thu, 31 Oct 2019 22:55:50 -0400 Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 31 Oct 2019 19:55:44 -0700 Received: from unknown (HELO localhost.localdomain) ([10.239.13.19]) by fmsmga008.fm.intel.com with ESMTP; 31 Oct 2019 19:55:43 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,253,1569308400"; d="scan'208";a="199216665" From: Zhang Chen To: Jason Wang , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-dev Subject: [PATCH V2 2/4] net/awd.c: Initailize input/output chardev Date: Fri, 1 Nov 2019 10:48:48 +0800 Message-Id: <20191101024850.20808-3-chen.zhang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191101024850.20808-1-chen.zhang@intel.com> References: <20191101024850.20808-1-chen.zhang@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 134.134.136.24 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: Zhang Chen , Zhang Chen Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Zhang Chen Find and check the chardev awd_node and notification_node, The awd_node used for keep connect with outside(like VM client/other host/Remote server), and the notification_node used for do some operation when disconnect event occur. Signed-off-by: Zhang Chen --- net/awd.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/net/awd.c b/net/awd.c index d42b4a7372..ad3d39c982 100644 --- a/net/awd.c +++ b/net/awd.c @@ -42,6 +42,8 @@ typedef struct AwdState { char *opt_script; uint32_t pulse_interval; uint32_t timeout; + CharBackend chr_awd_node; + CharBackend chr_notification_node; IOThread *iothread; } AwdState; =20 @@ -175,9 +177,30 @@ out: error_propagate(errp, local_err); } =20 +static int find_and_check_chardev(Chardev **chr, + char *chr_name, + Error **errp) +{ + *chr =3D qemu_chr_find(chr_name); + if (*chr =3D=3D NULL) { + error_setg(errp, "Device '%s' not found", + chr_name); + return 1; + } + + if (!qemu_chr_has_feature(*chr, QEMU_CHAR_FEATURE_RECONNECTABLE)) { + error_setg(errp, "chardev \"%s\" is not reconnectable", + chr_name); + return 1; + } + + return 0; +} + static void awd_complete(UserCreatable *uc, Error **errp) { AwdState *s =3D AWD(uc); + Chardev *chr; =20 if (!s->awd_node || !s->iothread || !s->notification_node || !s->opt_script) { @@ -187,6 +210,20 @@ static void awd_complete(UserCreatable *uc, Error **er= rp) return; } =20 + if (find_and_check_chardev(&chr, s->awd_node, errp) || + !qemu_chr_fe_init(&s->chr_awd_node, chr, errp)) { + error_setg(errp, "advanced-watchdog can't find chardev awd_node: %= s", + s->awd_node); + return; + } + + if (find_and_check_chardev(&chr, s->notification_node, errp) || + !qemu_chr_fe_init(&s->chr_notification_node, chr, errp)) { + error_setg(errp, "advanced-watchdog can't find " + "chardev notification_node: %s", s->notification_node); + return; + } + return; } =20 --=20 2.17.1 From nobody Mon Apr 29 14:49:19 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1572577207; cv=none; d=zoho.com; s=zohoarc; b=hnqsLKoloH+YLYBmwfnRnio36aVpfFS/2P0a5xJczWk60nAs/xxFxQobO+PiHCC+jSh9lubtBpsypGmwbmjSTfr1REc+nG1jK2WmZ564iXSG6rV4263N7EYQBxLOIMrK5g6zPmfLOn7wFiRL4qecawkil8umNxPQ5dYdH63I3HM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1572577207; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=6m2o4C740CqQ1sS5Rlqj24nnFN8WZGUSXw5LbKRYFP4=; b=anDtyKlq5bozRIPrmY6mR9MmM8wHzsniAme4tTSWxTNlyINuoRU04TS9LN31PJViUQevwEZrT5eugQoRQL4vsUMWjZXz3tIP7K/yGYxKpayrk4RhHDwJsQihT4KmkLgajrjg5nc7hENTkcOZlTdQaWMvC98UwluZEJ0Z+NZb2BY= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1572577207007930.8773992607258; Thu, 31 Oct 2019 20:00:07 -0700 (PDT) Received: from localhost ([::1]:55536 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQNAS-0000oK-SG for importer@patchew.org; Thu, 31 Oct 2019 23:00:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:56504) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQN6Q-0004vx-Ub for qemu-devel@nongnu.org; Thu, 31 Oct 2019 22:55:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iQN6O-00019e-EN for qemu-devel@nongnu.org; Thu, 31 Oct 2019 22:55:53 -0400 Received: from mga09.intel.com ([134.134.136.24]:16100) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iQN6O-0000Mm-6U for qemu-devel@nongnu.org; Thu, 31 Oct 2019 22:55:52 -0400 Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 31 Oct 2019 19:55:45 -0700 Received: from unknown (HELO localhost.localdomain) ([10.239.13.19]) by fmsmga008.fm.intel.com with ESMTP; 31 Oct 2019 19:55:44 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,253,1569308400"; d="scan'208";a="199216673" From: Zhang Chen To: Jason Wang , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-dev Subject: [PATCH V2 3/4] net/awd.c: Load advanced watch dog worker thread job Date: Fri, 1 Nov 2019 10:48:49 +0800 Message-Id: <20191101024850.20808-4-chen.zhang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191101024850.20808-1-chen.zhang@intel.com> References: <20191101024850.20808-1-chen.zhang@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 134.134.136.24 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: Zhang Chen , Zhang Chen Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Zhang Chen This patch load pulse_timer and timeout_timer in the new iothread. The pulse timer will send pulse info to awd_node, and the timeout timer will check the reply pulse from awd_node. If timeout occur, it will send opt_script's data to the notification_node. Signed-off-by: Zhang Chen --- net/awd.c | 193 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) diff --git a/net/awd.c b/net/awd.c index ad3d39c982..04f40e7cc8 100644 --- a/net/awd.c +++ b/net/awd.c @@ -40,17 +40,137 @@ typedef struct AwdState { char *awd_node; char *notification_node; char *opt_script; + char *opt_script_data; uint32_t pulse_interval; uint32_t timeout; CharBackend chr_awd_node; CharBackend chr_notification_node; + SocketReadState awd_rs; + + QEMUTimer *pulse_timer; + QEMUTimer *timeout_timer; IOThread *iothread; + GMainContext *worker_context; } AwdState; =20 typedef struct AwdClass { ObjectClass parent_class; } AwdClass; =20 +static int awd_chr_send(AwdState *s, + const uint8_t *buf, + uint32_t size) +{ + int ret =3D 0; + uint32_t len =3D htonl(size); + + if (!size) { + return 0; + } + + ret =3D qemu_chr_fe_write_all(&s->chr_awd_node, (uint8_t *)&len, + sizeof(len)); + if (ret !=3D sizeof(len)) { + goto err; + } + + ret =3D qemu_chr_fe_write_all(&s->chr_awd_node, (uint8_t *)buf, + size); + if (ret !=3D size) { + goto err; + } + + return 0; + +err: + return ret < 0 ? ret : -EIO; +} + +static int awd_chr_can_read(void *opaque) +{ + return AWD_READ_LEN_MAX; +} + +static void awd_node_in(void *opaque, const uint8_t *buf, int size) +{ + AwdState *s =3D AWD(opaque); + int ret; + + ret =3D net_fill_rstate(&s->awd_rs, buf, size); + if (ret =3D=3D -1) { + qemu_chr_fe_set_handlers(&s->chr_awd_node, NULL, NULL, NULL, NULL, + NULL, NULL, true); + error_report("advanced-watchdog get pulse error"); + } +} + +static void awd_send_pulse(void *opaque) +{ + AwdState *s =3D opaque; + char buf[] =3D "advanced-watchdog pulse"; + + awd_chr_send(s, (uint8_t *)buf, sizeof(buf)); +} + +static void awd_regular_pulse(void *opaque) +{ + AwdState *s =3D opaque; + + awd_send_pulse(s); + timer_mod(s->pulse_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + + s->pulse_interval); +} + +static void awd_timeout(void *opaque) +{ + AwdState *s =3D opaque; + int ret =3D 0; + + ret =3D qemu_chr_fe_write_all(&s->chr_notification_node, + (uint8_t *)s->opt_script_data, + strlen(s->opt_script_data)); + if (ret) { + error_report("advanced-watchdog notification failure"); + } +} + +static void awd_timer_init(AwdState *s) +{ + AioContext *ctx =3D iothread_get_aio_context(s->iothread); + + s->timeout_timer =3D aio_timer_new(ctx, QEMU_CLOCK_VIRTUAL, SCALE_MS, + awd_timeout, s); + + s->pulse_timer =3D aio_timer_new(ctx, QEMU_CLOCK_VIRTUAL, SCALE_MS, + awd_regular_pulse, s); + + if (!s->pulse_interval) { + s->pulse_interval =3D AWD_PULSE_INTERVAL_DEFAULT; + } + + if (!s->timeout) { + s->timeout =3D AWD_TIMEOUT_DEFAULT; + } + + timer_mod(s->pulse_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + + s->pulse_interval); +} + +static void awd_timer_del(AwdState *s) +{ + if (s->pulse_timer) { + timer_del(s->pulse_timer); + timer_free(s->pulse_timer); + s->pulse_timer =3D NULL; + } + + if (s->timeout_timer) { + timer_del(s->timeout_timer); + timer_free(s->timeout_timer); + s->timeout_timer =3D NULL; + } + } + static char *awd_get_node(Object *obj, Error **errp) { AwdState *s =3D AWD(obj); @@ -177,6 +297,22 @@ out: error_propagate(errp, local_err); } =20 +static void awd_rs_finalize(SocketReadState *awd_rs) +{ + AwdState *s =3D container_of(awd_rs, AwdState, awd_rs); + + if (!s->server) { + char buf[] =3D "advanced-watchdog reply pulse"; + + awd_chr_send(s, (uint8_t *)buf, sizeof(buf)); + } + + timer_mod(s->timeout_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + + s->timeout); + + error_report("advanced-watchdog got message : %s", awd_rs->buf); +} + static int find_and_check_chardev(Chardev **chr, char *chr_name, Error **errp) @@ -197,6 +333,46 @@ static int find_and_check_chardev(Chardev **chr, return 0; } =20 +static void awd_iothread(AwdState *s) +{ + object_ref(OBJECT(s->iothread)); + s->worker_context =3D iothread_get_g_main_context(s->iothread); + + qemu_chr_fe_set_handlers(&s->chr_awd_node, awd_chr_can_read, + awd_node_in, NULL, NULL, + s, s->worker_context, true); + + awd_timer_init(s); +} + +static int get_opt_script_data(AwdState *s) +{ + FILE *opt_fd; + long fsize; + + opt_fd =3D fopen(s->opt_script, "r"); + if (opt_fd =3D=3D NULL) { + error_report("advanced-watchdog can't open " + "opt_script: %s", s->opt_script); + return -1; + } + + fseek(opt_fd, 0, SEEK_END); + fsize =3D ftell(opt_fd); + fseek(opt_fd, 0, SEEK_SET); + s->opt_script_data =3D malloc(fsize + 1); + + if (!fread(s->opt_script_data, 1, fsize, opt_fd)) { + error_report("advanced-watchdog can't read " + "opt_script: %s", s->opt_script); + return -1; + } + + fclose(opt_fd); + + return 0; +} + static void awd_complete(UserCreatable *uc, Error **errp) { AwdState *s =3D AWD(uc); @@ -224,6 +400,16 @@ static void awd_complete(UserCreatable *uc, Error **er= rp) return; } =20 + if (get_opt_script_data(s)) { + error_setg(errp, "advanced-watchdog can't get " + "opt script data: %s", s->opt_script); + return; + } + + net_socket_rs_init(&s->awd_rs, awd_rs_finalize, false); + + awd_iothread(s); + return; } =20 @@ -272,6 +458,13 @@ static void awd_finalize(Object *obj) { AwdState *s =3D AWD(obj); =20 + qemu_chr_fe_deinit(&s->chr_awd_node, false); + qemu_chr_fe_deinit(&s->chr_notification_node, false); + + if (s->iothread) { + awd_timer_del(s); + } + g_free(s->awd_node); g_free(s->notification_node); } --=20 2.17.1 From nobody Mon Apr 29 14:49:19 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1572577103; cv=none; d=zoho.com; s=zohoarc; b=HFpfWpdMjL1UAzfyfKAdM6DT02e2wqkBJq4X7zdaQRVqnNhjxv5QgnxHHIOqrAnOqqGHKjiwZzMqh1b75819mD1XVK/YQg2vdbXIRn3h0sOy0n7dSRK3ePxU8Rhtc/kGbp2VZtmVXirLAwcU5h60EW8RHSLYCazVQZV/DluVk2I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1572577103; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=BTOzP9ERm61diNiJjEQOENJZvqkCq5zX+RXYTN2m3jQ=; b=akwNM1gJAwecOO/XKyObY5+z/ujaYDUz1od8WfreqpV/swdl5SCNkM+jjy6SMwMAm+pvT1Q+TtdPADz0Btf298b4vkwiXP18jdr17nTEF11PQUFLERm5K4zO7UO4a2xGmUU+gMIi0+98FKfyQlRGQ+6oE2UbQ+30cYo4GsL4T+k= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1572577103272246.48044125773026; Thu, 31 Oct 2019 19:58:23 -0700 (PDT) Received: from localhost ([::1]:55522 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQN8m-0006uN-U7 for importer@patchew.org; Thu, 31 Oct 2019 22:58:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:56482) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQN6Q-0004uT-Lj for qemu-devel@nongnu.org; Thu, 31 Oct 2019 22:55:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iQN6N-00015i-C4 for qemu-devel@nongnu.org; Thu, 31 Oct 2019 22:55:52 -0400 Received: from mga09.intel.com ([134.134.136.24]:16107) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iQN6N-0000gd-4G for qemu-devel@nongnu.org; Thu, 31 Oct 2019 22:55:51 -0400 Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 31 Oct 2019 19:55:47 -0700 Received: from unknown (HELO localhost.localdomain) ([10.239.13.19]) by fmsmga008.fm.intel.com with ESMTP; 31 Oct 2019 19:55:46 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,253,1569308400"; d="scan'208";a="199216680" From: Zhang Chen To: Jason Wang , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-dev Subject: [PATCH V2 4/4] vl.c: Make Advanced Watch Dog delayed initialization Date: Fri, 1 Nov 2019 10:48:50 +0800 Message-Id: <20191101024850.20808-5-chen.zhang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191101024850.20808-1-chen.zhang@intel.com> References: <20191101024850.20808-1-chen.zhang@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 134.134.136.24 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: Zhang Chen , Zhang Chen Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Zhang Chen Because Advanced Watch Dog module needs chardev socket to initialize properly before. Signed-off-by: Zhang Chen --- vl.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/vl.c b/vl.c index 6a65a64bfd..048fe458b9 100644 --- a/vl.c +++ b/vl.c @@ -2689,6 +2689,13 @@ static bool object_create_initial(const char *type, = QemuOpts *opts) return false; } =20 + /* + * Reason: Advanced Watch Dog property "chardev". + */ + if (g_str_equal(type, "advanced-watchdog")) { + return false; + } + /* Memory allocation by backends needs to be done * after configure_accelerator() (due to the tcg_enabled() * checks at memory_region_init_*()). --=20 2.17.1