From: Wen Congyang <wency@cn.fujitsu.com>
To: Gleb Natapov <gleb@redhat.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>,
Jan Kiszka <jan.kiszka@siemens.com>,
Amit Shah <amit.shah@redhat.com>
Subject: Re: [PATCH 0/2 v3] kvm: notify host when guest panicked
Date: Tue, 17 Apr 2012 11:14:46 +0800 [thread overview]
Message-ID: <4F8CE026.1050205@cn.fujitsu.com> (raw)
In-Reply-To: <20120320154517.GG27928@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 2254 bytes --]
At 03/20/2012 11:45 PM, Gleb Natapov Wrote:
> On Tue, Mar 20, 2012 at 05:59:16PM +0800, Wen Congyang wrote:
>> At 03/19/2012 03:33 PM, Wen Congyang Wrote:
>>> At 03/08/2012 03:57 PM, Wen Congyang Wrote:
>>>> We can know the guest is paniced when the guest runs on xen.
>>>> But we do not have such feature on kvm.
>>>>
>>>> Another purpose of this feature is: management app(for example:
>>>> libvirt) can do auto dump when the guest is crashed. If management
>>>> app does not do auto dump, the guest's user can do dump by hand if
>>>> he sees the guest is paniced.
>>>>
>>>> I touch the hypervisor instead of using virtio-serial, because
>>>> 1. it is simple
>>>> 2. the virtio-serial is an optional device, and the guest may
>>>> not have such device.
>>>>
>>>> Changes from v2 to v3:
>>>> 1. correct spelling
>>>>
>>>> Changes from v1 to v2:
>>>> 1. split up host and guest-side changes
>>>> 2. introduce new request flag to avoid changing return values.
>>>> --
>>>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>>>> the body of a message to majordomo@vger.kernel.org
>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>> Please read the FAQ at http://www.tux.org/lkml/
>>>>
>>>
>>>
>>> Hi all:
>>>
>>> we neet this feature, but we don't decide how to implement it.
>>> We have two solution:
>>> 1. use vmcall
>>> 2. use virtio-serial.
>>>
>>> I will not change this patch set before we decide how to do it.
>>> Can we make a decision recent days?
>>
>> Anybody can decide which solution to use?
>>
> To make an informed decision we need to have at least raw idea how
> virtio-serial variant will look.
We have three solutions now:
1. use vmcall
2. use I/O port
3. use virtio-serial
I write a sample patch of solution 2 and 3:
patch 1: solution 2
patch 2: solution 3
Note, ther are only sample patches, and it can work. I send them, so we
can decide which solution will be used.
Thanks
Wen Congyang
>
> --
> Gleb.
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
[-- Attachment #2: 0001-kvm-notify-host-when-guest-panicked.patch --]
[-- Type: text/x-patch, Size: 4036 bytes --]
>From 2c819655982a0b3043892e994fb87fd44fdca686 Mon Sep 17 00:00:00 2001
From: Wen Congyang <wency@cn.fujitsu.com>
Date: Tue, 17 Apr 2012 10:44:40 +0800
Subject: [PATCH] kvm: notify host when guest panicked
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
---
arch/ia64/include/asm/kvm_para.h | 5 +++++
arch/powerpc/include/asm/kvm_para.h | 5 +++++
arch/s390/include/asm/kvm_para.h | 5 +++++
arch/x86/include/asm/kvm_para.h | 7 +++++++
arch/x86/kernel/kvm.c | 14 ++++++++++++++
include/linux/kvm_para.h | 13 +++++++++++++
6 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/arch/ia64/include/asm/kvm_para.h b/arch/ia64/include/asm/kvm_para.h
index 1588aee..a890096 100644
--- a/arch/ia64/include/asm/kvm_para.h
+++ b/arch/ia64/include/asm/kvm_para.h
@@ -26,6 +26,11 @@ static inline unsigned int kvm_arch_para_features(void)
return 0;
}
+static inline unsigned int kvm_arch_pv_features(void)
+{
+ return 0;
+}
+
#endif
#endif
diff --git a/arch/powerpc/include/asm/kvm_para.h b/arch/powerpc/include/asm/kvm_para.h
index 7b754e7..b5f7c35 100644
--- a/arch/powerpc/include/asm/kvm_para.h
+++ b/arch/powerpc/include/asm/kvm_para.h
@@ -206,6 +206,11 @@ static inline unsigned int kvm_arch_para_features(void)
return r;
}
+static inline unsigned int kvm_arch_pv_features(void)
+{
+ return 0;
+}
+
#endif /* __KERNEL__ */
#endif /* __POWERPC_KVM_PARA_H__ */
diff --git a/arch/s390/include/asm/kvm_para.h b/arch/s390/include/asm/kvm_para.h
index 6964db2..21a8d18 100644
--- a/arch/s390/include/asm/kvm_para.h
+++ b/arch/s390/include/asm/kvm_para.h
@@ -149,6 +149,11 @@ static inline unsigned int kvm_arch_para_features(void)
return 0;
}
+static inline unsigned int kvm_arch_pv_features(void)
+{
+ return 0;
+}
+
#endif
#endif /* __S390_KVM_PARA_H */
diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h
index 734c376..02e214a 100644
--- a/arch/x86/include/asm/kvm_para.h
+++ b/arch/x86/include/asm/kvm_para.h
@@ -208,6 +208,13 @@ static inline void kvm_disable_steal_time(void)
}
#endif
+#define KVM_PV_PORT (0x505UL)
+
+static inline unsigned int kvm_arch_pv_features(void)
+{
+ return inl(KVM_PV_PORT);
+}
+
#endif /* __KERNEL__ */
#endif /* _ASM_X86_KVM_PARA_H */
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index b8ba6e4..adfde45 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -335,6 +335,17 @@ static struct notifier_block kvm_pv_reboot_nb = {
.notifier_call = kvm_pv_reboot_notify,
};
+static int
+kvm_pv_panic_notify(struct notifier_block *nb, unsigned long code, void *unused)
+{
+ outl(KVM_PV_PANICKED, KVM_PV_PORT);
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block kvm_pv_panic_nb = {
+ .notifier_call = kvm_pv_panic_notify,
+};
+
static u64 kvm_steal_clock(int cpu)
{
u64 steal;
@@ -421,6 +432,9 @@ void __init kvm_guest_init(void)
paravirt_ops_setup();
register_reboot_notifier(&kvm_pv_reboot_nb);
+ if (kvm_pv_has_feature(KVM_PV_FEATURE_PANICKED))
+ atomic_notifier_chain_register(&panic_notifier_list,
+ &kvm_pv_panic_nb);
for (i = 0; i < KVM_TASK_SLEEP_HASHSIZE; i++)
spin_lock_init(&async_pf_sleepers[i].lock);
if (kvm_para_has_feature(KVM_FEATURE_ASYNC_PF))
diff --git a/include/linux/kvm_para.h b/include/linux/kvm_para.h
index ff476dd..e73efcf 100644
--- a/include/linux/kvm_para.h
+++ b/include/linux/kvm_para.h
@@ -20,6 +20,12 @@
#define KVM_HC_FEATURES 3
#define KVM_HC_PPC_MAP_MAGIC_PAGE 4
+/* The bit of the value read from KVM_PV_PORT */
+#define KVM_PV_FEATURE_PANICKED 0
+
+/* The value writen to KVM_PV_PORT */
+#define KVM_PV_PANICKED 1
+
/*
* hypercalls use architecture specific
*/
@@ -33,5 +39,12 @@ static inline int kvm_para_has_feature(unsigned int feature)
return 1;
return 0;
}
+
+static inline int kvm_pv_has_feature(unsigned int feature)
+{
+ if (kvm_arch_pv_features() & (1UL << feature))
+ return 1;
+ return 0;
+}
#endif /* __KERNEL__ */
#endif /* __LINUX_KVM_PARA_H */
--
1.7.1
[-- Attachment #3: 0002-kvm-notify-host-when-guest-panicked.patch --]
[-- Type: text/x-patch, Size: 3039 bytes --]
>From cb39cb1f36d4c37b3dc7942413550bb4b7c79a84 Mon Sep 17 00:00:00 2001
From: Wen Congyang <wency@cn.fujitsu.com>
Date: Tue, 17 Apr 2012 11:01:01 +0800
Subject: [PATCH] kvm: nofity thost when guest is panicked
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
---
drivers/char/virtio_console.c | 49 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index ddf86b6..ecccd30 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -225,8 +225,14 @@ struct port {
/* We should allow only one process to open a port */
bool guest_connected;
+
+ /* We use this port to tell the host that the guest is panicked */
+ bool panicked_port;
+ char *panicked_buf;
};
+static struct port *panicked_port;
+
/* This is the very early arch-specified put chars function. */
static int (*early_put_chars)(u32, const char *, int);
@@ -806,6 +812,15 @@ static int port_fops_open(struct inode *inode, struct file *filp)
goto out;
}
+ /*
+ * Don't allow opening of panicked port devices -- that's reserved
+ * for kernel space
+ */
+ if (port->panicked_port) {
+ ret = -ENXIO;
+ goto out;
+ }
+
/* Allow only one process to open a particular port at a time */
spin_lock_irq(&port->inbuf_lock);
if (port->guest_connected) {
@@ -1126,6 +1141,20 @@ static void send_sigio_to_port(struct port *port)
kill_fasync(&port->async_queue, SIGIO, POLL_OUT);
}
+static int
+kvm_pv_panic_notify(struct notifier_block *nb, unsigned long code, void *unused)
+{
+ send_control_msg(panicked_port, VIRTIO_CONSOLE_PORT_OPEN, 1);
+ memcpy(panicked_port->panicked_buf, "Kernel panicked\n", 16);
+ send_buf(panicked_port, panicked_port->panicked_buf, 16, true);
+ send_control_msg(panicked_port, VIRTIO_CONSOLE_CONSOLE_PORT, 0);
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block kvm_pv_panic_nb = {
+ .notifier_call = kvm_pv_panic_notify,
+};
+
static int add_port(struct ports_device *portdev, u32 id)
{
char debugfs_name[16];
@@ -1262,6 +1291,10 @@ static void remove_port(struct kref *kref)
debugfs_remove(port->debugfs_file);
+ if (port->panicked_port)
+ atomic_notifier_chain_unregister(&panic_notifier_list,
+ &kvm_pv_panic_nb);
+
kfree(port);
}
@@ -1433,6 +1466,22 @@ static void handle_control_message(struct ports_device *portdev,
name_size - 1);
port->name[name_size - 1] = 0;
+ if (!panicked_port && !strcmp(port->name, "status")) {
+ port->panicked_buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
+ if (!port->panicked_buf) {
+ dev_warn(port->dev,
+ "Not enough space to store panicked"
+ " message");
+ goto skip;
+ }
+ send_sigio_to_port(port);
+ port->panicked_port = true;
+ panicked_port = port;
+ atomic_notifier_chain_register(&panic_notifier_list,
+ &kvm_pv_panic_nb);
+ }
+
+skip:
/*
* Since we only have one sysfs attribute, 'name',
* create it only if we have a name for the port.
--
1.7.1
next prev parent reply other threads:[~2012-04-17 3:14 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-08 7:57 [PATCH 0/2 v3] kvm: notify host when guest panicked Wen Congyang
2012-03-08 8:02 ` [PATCH 1/2 " Wen Congyang
2012-03-08 8:04 ` [PATCH 2/2 v3] kvm: set exit_reason to KVM_EXIT_GUEST_PANICKED " Wen Congyang
2012-03-08 8:06 ` [PATCH 1/2 v3] update linux-headers Wen Congyang
2012-03-08 8:07 ` [PATCH 2/2 v3] deal with guest panicked event Wen Congyang
2012-03-08 10:08 ` Jan Kiszka
2012-03-08 10:11 ` Wen Congyang
2012-03-08 10:15 ` [RESEND][PATCH " Wen Congyang
2012-03-08 11:28 ` Avi Kivity
2012-03-08 11:36 ` Daniel P. Berrange
2012-03-08 11:52 ` Avi Kivity
2012-03-08 11:56 ` Daniel P. Berrange
2012-03-09 22:22 ` Marcelo Tosatti
2012-03-21 19:01 ` [Qemu-devel] " Anthony Liguori
2012-03-12 1:46 ` Wen Congyang
2012-03-08 11:13 ` [PATCH 0/2 v3] kvm: notify host when guest panicked Avi Kivity
2012-03-09 1:21 ` Wen Congyang
2012-03-12 9:04 ` Wen Congyang
2012-03-12 10:33 ` Avi Kivity
2012-03-13 6:44 ` Wen Congyang
2012-03-13 8:54 ` Avi Kivity
2012-03-13 9:18 ` Daniel P. Berrange
2012-03-13 10:47 ` Avi Kivity
2012-03-14 8:29 ` Wen Congyang
2012-03-14 9:24 ` Avi Kivity
2012-03-14 9:53 ` Wen Congyang
2012-03-14 10:07 ` Avi Kivity
2012-03-14 10:26 ` Wen Congyang
2012-03-14 10:29 ` Avi Kivity
2012-03-14 10:46 ` Gleb Natapov
2012-03-14 10:48 ` Avi Kivity
2012-03-14 11:11 ` Wen Congyang
2012-03-14 13:07 ` Avi Kivity
2012-03-14 13:13 ` Avi Kivity
2012-03-14 13:14 ` Gleb Natapov
2012-03-14 13:16 ` Avi Kivity
2012-03-14 13:25 ` Gleb Natapov
2012-03-14 18:46 ` Eric Northup
2012-03-15 7:01 ` Wen Congyang
2012-03-15 10:39 ` Gleb Natapov
2012-03-15 11:25 ` Jan Kiszka
2012-03-15 11:46 ` Avi Kivity
2012-03-16 8:05 ` Wen Congyang
2012-03-21 19:12 ` [Qemu-devel] " Anthony Liguori
2012-03-22 8:34 ` Wen Congyang
2012-03-14 18:47 ` Eric Northup
2012-03-14 10:37 ` Amit Shah
2012-03-14 10:52 ` Wen Congyang
2012-03-14 10:52 ` Gleb Natapov
2012-03-14 10:57 ` Wen Congyang
2012-03-14 10:58 ` Gleb Natapov
2012-03-14 11:13 ` Wen Congyang
2012-03-14 10:52 ` Avi Kivity
2012-03-14 10:58 ` Wen Congyang
2012-03-14 10:59 ` Daniel P. Berrange
2012-03-14 11:06 ` Wen Congyang
2012-03-14 11:11 ` Gleb Natapov
2012-03-14 11:17 ` Daniel P. Berrange
2012-03-14 10:59 ` Gleb Natapov
2012-03-14 10:57 ` Amit Shah
2012-03-14 9:51 ` Amit Shah
2012-03-14 10:04 ` Wen Congyang
2012-03-14 10:08 ` Avi Kivity
2012-03-14 10:40 ` Amit Shah
2012-03-14 10:42 ` Gleb Natapov
2012-03-14 10:57 ` Daniel P. Berrange
2012-03-14 11:01 ` Wen Congyang
2012-03-21 19:04 ` [Qemu-devel] " Anthony Liguori
2012-03-22 7:33 ` Gleb Natapov
2012-03-12 10:31 ` Avi Kivity
2012-03-19 7:33 ` Wen Congyang
2012-03-20 9:59 ` Wen Congyang
2012-03-20 15:45 ` Gleb Natapov
2012-03-21 0:56 ` Wen Congyang
2012-03-21 9:11 ` Gleb Natapov
2012-03-21 9:35 ` Wen Congyang
2012-03-21 9:42 ` Gleb Natapov
2012-03-21 16:18 ` Corey Minyard
2012-03-21 16:24 ` Gleb Natapov
2012-03-21 16:25 ` Avi Kivity
2012-03-21 17:04 ` Daniel P. Berrange
2012-03-21 17:34 ` Avi Kivity
2012-03-21 18:17 ` Jan Kiszka
2012-03-21 19:19 ` [Qemu-devel] " Anthony Liguori
2012-03-22 1:05 ` Wen Congyang
2012-03-22 7:31 ` [Qemu-devel] " Gleb Natapov
2012-03-22 7:44 ` Wen Congyang
2012-03-22 8:36 ` Gleb Natapov
2012-03-22 7:28 ` Gleb Natapov
2012-03-22 7:40 ` [Qemu-devel] " Wen Congyang
2012-04-17 3:14 ` Wen Congyang [this message]
2012-04-02 10:05 ` Wen Congyang
2012-04-02 10:54 ` Amit Shah
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=4F8CE026.1050205@cn.fujitsu.com \
--to=wency@cn.fujitsu.com \
--cc=amit.shah@redhat.com \
--cc=avi@redhat.com \
--cc=berrange@redhat.com \
--cc=gleb@redhat.com \
--cc=jan.kiszka@siemens.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).