mirror of
https://github.com/clearlinux/kvmtool.git
synced 2026-06-16 02:15:47 +00:00
kvm tools: Guest kernel compatability
The problem of users running kernel which wasn't built for kvm tools is somewhat common. Usualy the result is a panic during boot and a user whos' stuck and doesn't know what to do next. Compatability checks try to solve this issue by giving the user a meaningfull error message which can explain whats going on and how he can fix it. The idea is to register the device during device init and unregister the device when the device has been 'used'. In case the kernel didn't access the device before the guest is shut down, the host will notify the user that something is wrong. Signed-off-by: Sasha Levin <levinsasha928@gmail.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
This commit is contained in:
@@ -33,6 +33,7 @@ OBJS += builtin-version.o
|
||||
OBJS += cpuid.o
|
||||
OBJS += disk/core.o
|
||||
OBJS += framebuffer.o
|
||||
OBJS += guest_compat.o
|
||||
OBJS += hw/rtc.o
|
||||
OBJS += hw/serial.o
|
||||
OBJS += interrupt.o
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "kvm/rtc.h"
|
||||
#include "kvm/sdl.h"
|
||||
#include "kvm/vnc.h"
|
||||
#include "kvm/guest_compat.h"
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
@@ -729,6 +730,8 @@ int kvm_cmd_run(int argc, const char **argv, const char *prefix)
|
||||
exit_code = 1;
|
||||
}
|
||||
|
||||
compat__print_all_messages();
|
||||
|
||||
fb__stop();
|
||||
|
||||
virtio_blk__delete_all(kvm);
|
||||
|
||||
+104
@@ -0,0 +1,104 @@
|
||||
#include "kvm/guest_compat.h"
|
||||
|
||||
#include "kvm/mutex.h"
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
struct compat_message {
|
||||
int id;
|
||||
char *title;
|
||||
char *desc;
|
||||
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
static int id;
|
||||
static DEFINE_MUTEX(compat_mtx);
|
||||
static LIST_HEAD(messages);
|
||||
|
||||
int compat__add_message(const char *title, const char *desc)
|
||||
{
|
||||
struct compat_message *msg;
|
||||
|
||||
mutex_lock(&compat_mtx);
|
||||
msg = malloc(sizeof(*msg));
|
||||
if (msg == NULL)
|
||||
goto cleanup;
|
||||
|
||||
*msg = (struct compat_message) {
|
||||
.id = id,
|
||||
.title = strdup(title),
|
||||
.desc = strdup(desc),
|
||||
};
|
||||
|
||||
if (msg->title == NULL || msg->desc == NULL)
|
||||
goto cleanup;
|
||||
|
||||
list_add_tail(&msg->list, &messages);
|
||||
|
||||
mutex_unlock(&compat_mtx);
|
||||
|
||||
return id++;
|
||||
|
||||
cleanup:
|
||||
if (msg) {
|
||||
free(msg->title);
|
||||
free(msg->desc);
|
||||
free(msg);
|
||||
}
|
||||
|
||||
mutex_unlock(&compat_mtx);
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void compat__free(struct compat_message *msg)
|
||||
{
|
||||
free(msg->title);
|
||||
free(msg->desc);
|
||||
free(msg);
|
||||
}
|
||||
|
||||
int compat__remove_message(int id)
|
||||
{
|
||||
struct compat_message *pos, *n;
|
||||
|
||||
mutex_lock(&compat_mtx);
|
||||
|
||||
list_for_each_entry_safe(pos, n, &messages, list) {
|
||||
if (pos->id == id) {
|
||||
list_del(&pos->list);
|
||||
compat__free(pos);
|
||||
|
||||
mutex_unlock(&compat_mtx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&compat_mtx);
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int compat__print_all_messages(void)
|
||||
{
|
||||
mutex_lock(&compat_mtx);
|
||||
|
||||
while (!list_empty(&messages)) {
|
||||
struct compat_message *msg;
|
||||
|
||||
msg = list_first_entry(&messages, struct compat_message, list);
|
||||
|
||||
printf("\n\n*** Compatability Warning ***\n\n\t%s\n\n%s\n",
|
||||
msg->title, msg->desc);
|
||||
|
||||
list_del(&msg->list);
|
||||
compat__free(msg);
|
||||
}
|
||||
|
||||
mutex_unlock(&compat_mtx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef KVM__GUEST_COMPAT_H
|
||||
#define KVM__GUEST_COMPAT_H
|
||||
|
||||
int compat__print_all_messages(void);
|
||||
int compat__remove_message(int id);
|
||||
int compat__add_message(const char *title, const char *description);
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user