All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@siemens.com>
To: Wen Congyang <wency@cn.fujitsu.com>
Cc: Gleb Natapov <gleb@redhat.com>, kvm list <kvm@vger.kernel.org>,
	qemu-devel <qemu-devel@nongnu.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Avi Kivity <avi@redhat.com>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Subject: Re: [PATCH 5/6 v5] deal with guest panicked event accoring to -onpanic parameter
Date: Thu, 28 Jun 2012 10:26:35 +0200	[thread overview]
Message-ID: <4FEC153B.6040300@siemens.com> (raw)
In-Reply-To: <4FEBB044.1000306@cn.fujitsu.com>

On 2012-06-28 03:15, Wen Congyang wrote:
> At 06/27/2012 10:39 PM, Jan Kiszka Wrote:
>> On 2012-06-27 09:02, Wen Congyang wrote:
>>> When the guest is panicked, it will write 0x1 to the port KVM_PV_PORT.
>>> So if qemu reads 0x1 from this port, we can do the folloing three
>>> things according to the parameter -onpanic:
>>> 1. emit QEVENT_GUEST_PANICKED only
>>> 2. emit QEVENT_GUEST_PANICKED and pause the guest
>>> 3. emit QEVENT_GUEST_PANICKED and poweroff the guest
>>> 4. emit QEVENT_GUEST_PANICKED and reset the guest
>>>
>>> Note: if we emit QEVENT_GUEST_PANICKED only, and the management
>>> application does not receive this event(the management may not
>>> run when the event is emitted), the management won't know the
>>> guest is panicked.
>>>
>>> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
>>> ---
>>>  kvm-all.c       |  101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>  kvm-stub.c      |    9 +++++
>>>  kvm.h           |    3 ++
>>>  qemu-options.hx |   15 ++++++++
>>>  vl.c            |   10 +++++
>>>  5 files changed, 138 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/kvm-all.c b/kvm-all.c
>>> index f8e4328..9494dd2 100644
>>> --- a/kvm-all.c
>>> +++ b/kvm-all.c
>>> @@ -19,6 +19,8 @@
>>>  #include <stdarg.h>
>>>  
>>>  #include <linux/kvm.h>
>>> +#include <linux/kvm_para.h>
>>> +#include <asm/kvm_para.h>
>>>  
>>>  #include "qemu-common.h"
>>>  #include "qemu-barrier.h"
>>> @@ -32,6 +34,9 @@
>>>  #include "bswap.h"
>>>  #include "memory.h"
>>>  #include "exec-memory.h"
>>> +#include "iorange.h"
>>> +#include "qemu-objects.h"
>>> +#include "monitor.h"
>>>  
>>>  /* This check must be after config-host.h is included */
>>>  #ifdef CONFIG_EVENTFD
>>> @@ -1931,3 +1936,99 @@ int kvm_on_sigbus(int code, void *addr)
>>>  {
>>>      return kvm_arch_on_sigbus(code, addr);
>>>  }
>>> +
>>> +/* Possible values for action parameter. */
>>> +#define PANICKED_REPORT     1   /* emit QEVENT_GUEST_PANICKED only */
>>> +#define PANICKED_PAUSE      2   /* emit QEVENT_GUEST_PANICKED and pause VM */
>>> +#define PANICKED_POWEROFF   3   /* emit QEVENT_GUEST_PANICKED and quit VM */
>>> +#define PANICKED_RESET      4   /* emit QEVENT_GUEST_PANICKED and reset VM */
>>> +
>>> +static int panicked_action = PANICKED_REPORT;
>>> +
>>> +static void kvm_pv_port_read(IORange *iorange, uint64_t offset, unsigned width,
>>> +                             uint64_t *data)
>>> +{
>>> +    *data = (1 << KVM_PV_FEATURE_PANICKED);
>>> +}
>>> +
>>> +static void panicked_mon_event(const char *action)
>>> +{
>>> +    QObject *data;
>>> +
>>> +    data = qobject_from_jsonf("{ 'action': %s }", action);
>>> +    monitor_protocol_event(QEVENT_GUEST_PANICKED, data);
>>> +    qobject_decref(data);
>>> +}
>>> +
>>> +static void panicked_perform_action(void)
>>> +{
>>> +    switch (panicked_action) {
>>> +    case PANICKED_REPORT:
>>> +        panicked_mon_event("report");
>>> +        break;
>>> +
>>> +    case PANICKED_PAUSE:
>>> +        panicked_mon_event("pause");
>>> +        vm_stop(RUN_STATE_GUEST_PANICKED);
>>> +        break;
>>> +
>>> +    case PANICKED_POWEROFF:
>>> +        panicked_mon_event("poweroff");
>>> +        exit(0);
>>> +        break;
>>> +    case PANICKED_RESET:
>>> +        panicked_mon_event("reset");
>>> +        qemu_system_reset_request();
>>> +        break;
>>> +    }
>>> +}
>>> +
>>> +static void kvm_pv_port_write(IORange *iorange, uint64_t offset, unsigned width,
>>> +                              uint64_t data)
>>> +{
>>> +    if (data == KVM_PV_PANICKED) {
>>> +        panicked_perform_action();
>>> +    }
>>> +}
>>> +
>>> +static void kvm_pv_port_destructor(IORange *iorange)
>>> +{
>>> +    g_free(iorange);
>>> +}
>>> +
>>> +static IORangeOps pv_io_range_ops = {
>>> +    .read = kvm_pv_port_read,
>>> +    .write = kvm_pv_port_write,
>>> +    .destructor = kvm_pv_port_destructor,
>>> +};
>>> +
>>> +#if defined(KVM_PV_PORT)
>>> +void kvm_pv_port_init(void)
>>> +{
>>> +    IORange *pv_io_range = g_malloc(sizeof(IORange));
>>> +
>>> +    iorange_init(pv_io_range, &pv_io_range_ops, KVM_PV_PORT, 1);
>>> +    ioport_register(pv_io_range);
>>
>> This modeling is still not ok. We don't open-code ports anymore, we
>> introduce devices. And this doesn't belong inro generic code as it is
> 
> Do you mean introducing a new device instead of I/O port?

I mean encapsulating the I/O registration (PIO or MMIO) in a QOM device
and building that device only for target archs that supports it. Already
pointed you to examples in hw/kvm/.

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux

WARNING: multiple messages have this Message-ID (diff)
From: Jan Kiszka <jan.kiszka@siemens.com>
To: Wen Congyang <wency@cn.fujitsu.com>
Cc: kvm list <kvm@vger.kernel.org>,
	qemu-devel <qemu-devel@nongnu.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Avi Kivity <avi@redhat.com>,
	"Daniel P. Berrange" <berrange@redhat.com>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	Gleb Natapov <gleb@redhat.com>
Subject: Re: [PATCH 5/6 v5] deal with guest panicked event accoring to -onpanic parameter
Date: Thu, 28 Jun 2012 10:26:35 +0200	[thread overview]
Message-ID: <4FEC153B.6040300@siemens.com> (raw)
In-Reply-To: <4FEBB044.1000306@cn.fujitsu.com>

On 2012-06-28 03:15, Wen Congyang wrote:
> At 06/27/2012 10:39 PM, Jan Kiszka Wrote:
>> On 2012-06-27 09:02, Wen Congyang wrote:
>>> When the guest is panicked, it will write 0x1 to the port KVM_PV_PORT.
>>> So if qemu reads 0x1 from this port, we can do the folloing three
>>> things according to the parameter -onpanic:
>>> 1. emit QEVENT_GUEST_PANICKED only
>>> 2. emit QEVENT_GUEST_PANICKED and pause the guest
>>> 3. emit QEVENT_GUEST_PANICKED and poweroff the guest
>>> 4. emit QEVENT_GUEST_PANICKED and reset the guest
>>>
>>> Note: if we emit QEVENT_GUEST_PANICKED only, and the management
>>> application does not receive this event(the management may not
>>> run when the event is emitted), the management won't know the
>>> guest is panicked.
>>>
>>> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
>>> ---
>>>  kvm-all.c       |  101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>  kvm-stub.c      |    9 +++++
>>>  kvm.h           |    3 ++
>>>  qemu-options.hx |   15 ++++++++
>>>  vl.c            |   10 +++++
>>>  5 files changed, 138 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/kvm-all.c b/kvm-all.c
>>> index f8e4328..9494dd2 100644
>>> --- a/kvm-all.c
>>> +++ b/kvm-all.c
>>> @@ -19,6 +19,8 @@
>>>  #include <stdarg.h>
>>>  
>>>  #include <linux/kvm.h>
>>> +#include <linux/kvm_para.h>
>>> +#include <asm/kvm_para.h>
>>>  
>>>  #include "qemu-common.h"
>>>  #include "qemu-barrier.h"
>>> @@ -32,6 +34,9 @@
>>>  #include "bswap.h"
>>>  #include "memory.h"
>>>  #include "exec-memory.h"
>>> +#include "iorange.h"
>>> +#include "qemu-objects.h"
>>> +#include "monitor.h"
>>>  
>>>  /* This check must be after config-host.h is included */
>>>  #ifdef CONFIG_EVENTFD
>>> @@ -1931,3 +1936,99 @@ int kvm_on_sigbus(int code, void *addr)
>>>  {
>>>      return kvm_arch_on_sigbus(code, addr);
>>>  }
>>> +
>>> +/* Possible values for action parameter. */
>>> +#define PANICKED_REPORT     1   /* emit QEVENT_GUEST_PANICKED only */
>>> +#define PANICKED_PAUSE      2   /* emit QEVENT_GUEST_PANICKED and pause VM */
>>> +#define PANICKED_POWEROFF   3   /* emit QEVENT_GUEST_PANICKED and quit VM */
>>> +#define PANICKED_RESET      4   /* emit QEVENT_GUEST_PANICKED and reset VM */
>>> +
>>> +static int panicked_action = PANICKED_REPORT;
>>> +
>>> +static void kvm_pv_port_read(IORange *iorange, uint64_t offset, unsigned width,
>>> +                             uint64_t *data)
>>> +{
>>> +    *data = (1 << KVM_PV_FEATURE_PANICKED);
>>> +}
>>> +
>>> +static void panicked_mon_event(const char *action)
>>> +{
>>> +    QObject *data;
>>> +
>>> +    data = qobject_from_jsonf("{ 'action': %s }", action);
>>> +    monitor_protocol_event(QEVENT_GUEST_PANICKED, data);
>>> +    qobject_decref(data);
>>> +}
>>> +
>>> +static void panicked_perform_action(void)
>>> +{
>>> +    switch (panicked_action) {
>>> +    case PANICKED_REPORT:
>>> +        panicked_mon_event("report");
>>> +        break;
>>> +
>>> +    case PANICKED_PAUSE:
>>> +        panicked_mon_event("pause");
>>> +        vm_stop(RUN_STATE_GUEST_PANICKED);
>>> +        break;
>>> +
>>> +    case PANICKED_POWEROFF:
>>> +        panicked_mon_event("poweroff");
>>> +        exit(0);
>>> +        break;
>>> +    case PANICKED_RESET:
>>> +        panicked_mon_event("reset");
>>> +        qemu_system_reset_request();
>>> +        break;
>>> +    }
>>> +}
>>> +
>>> +static void kvm_pv_port_write(IORange *iorange, uint64_t offset, unsigned width,
>>> +                              uint64_t data)
>>> +{
>>> +    if (data == KVM_PV_PANICKED) {
>>> +        panicked_perform_action();
>>> +    }
>>> +}
>>> +
>>> +static void kvm_pv_port_destructor(IORange *iorange)
>>> +{
>>> +    g_free(iorange);
>>> +}
>>> +
>>> +static IORangeOps pv_io_range_ops = {
>>> +    .read = kvm_pv_port_read,
>>> +    .write = kvm_pv_port_write,
>>> +    .destructor = kvm_pv_port_destructor,
>>> +};
>>> +
>>> +#if defined(KVM_PV_PORT)
>>> +void kvm_pv_port_init(void)
>>> +{
>>> +    IORange *pv_io_range = g_malloc(sizeof(IORange));
>>> +
>>> +    iorange_init(pv_io_range, &pv_io_range_ops, KVM_PV_PORT, 1);
>>> +    ioport_register(pv_io_range);
>>
>> This modeling is still not ok. We don't open-code ports anymore, we
>> introduce devices. And this doesn't belong inro generic code as it is
> 
> Do you mean introducing a new device instead of I/O port?

I mean encapsulating the I/O registration (PIO or MMIO) in a QOM device
and building that device only for target archs that supports it. Already
pointed you to examples in hw/kvm/.

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux

  reply	other threads:[~2012-06-28  8:26 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-27  6:55 [PATCH v5] kvm: notify host when the guest is panicked Wen Congyang
2012-06-27  6:57 ` [PATCH 1/6 v5] start vm after reseting it Wen Congyang
2012-06-27  6:58 ` [PATCH 2/6 v5] update linux headers Wen Congyang
2012-06-27  7:00 ` [PATCH 3/6 v5] add a new runstate: RUN_STATE_GUEST_PANICKED Wen Congyang
2012-06-27  7:01 ` [PATCH 4/6 v5] add a new qevent: QEVENT_GUEST_PANICKED Wen Congyang
2012-06-27  7:02 ` [PATCH 5/6 v5] deal with guest panicked event accoring to -onpanic parameter Wen Congyang
2012-06-27 14:39   ` Jan Kiszka
2012-06-28  1:15     ` Wen Congyang
2012-06-28  8:26       ` Jan Kiszka [this message]
2012-06-28  8:26         ` Jan Kiszka
2012-07-03  6:07         ` Wen Congyang
2012-07-03  6:07           ` [Qemu-devel] " Wen Congyang
2012-07-03  6:36           ` Jan Kiszka
2012-07-03  6:36             ` [Qemu-devel] " Jan Kiszka
2012-07-03  6:36             ` Jan Kiszka
2012-07-03  6:43             ` Wen Congyang
2012-07-03  6:43               ` [Qemu-devel] " Wen Congyang
2012-07-03  6:45               ` Jan Kiszka
2012-07-03  6:45                 ` [Qemu-devel] " Jan Kiszka
2012-06-27 14:52   ` Cornelia Huck
2012-06-27 14:57     ` Daniel P. Berrange
2012-06-27  7:04 ` [PATCH 6/6 v5] deal with panicked event accoring to '-machine panic_action=action' Wen Congyang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4FEC153B.6040300@siemens.com \
    --to=jan.kiszka@siemens.com \
    --cc=avi@redhat.com \
    --cc=gleb@redhat.com \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=qemu-devel@nongnu.org \
    --cc=wency@cn.fujitsu.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.