From mboxrd@z Thu Jan 1 00:00:00 1970 From: Uri Lublin Subject: Re: frozen winXP on kvm after savevm Date: Sun, 19 Aug 2007 13:55:59 +0300 Message-ID: <46C821BF.3030906@qumranet.com> References: <46C7E3EC.3010406@codefidence.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------090304010807050705050202" Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org To: Shahar Livne Return-path: In-Reply-To: <46C7E3EC.3010406-f4XOiQkOAtcdH0auuBZGHA@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Errors-To: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: kvm.vger.kernel.org This is a multi-part message in MIME format. --------------090304010807050705050202 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit The attached patch should help. Shahar Livne wrote: > Hello list, > > I am running winXP English on the kvm, and sometimes after savevm when > starting with loadvm - it starts frozen (the process takes 100% CPU and > the target OS is not responsive). > > The command line to run qemu (while kvm-intel is loaded) that I use is: > > /usr/local/kvm/bin/qemu-system-x86_64 -hda winxp.qcow2 -L > /usr/local/kvm/share/qemu/ -usbdevice tablet -no-rtc -m 256 -localtime > -net none -vnc :0 -serial /dev/null -parallel /dev/null -monitor > unix:/tmp/monitor-qemu.sock,server,nowait -S > > Then I send commands to the monitor, the moment it is available: > loadvm 1 > cont > > And after few mouse moves and clicks (using vncviewer) I save the vm: > stop > delvm 1 > savevm 1 > quit > > After 1-3 iterations of the above procedure, the system starts frozen. > > > > Remarks: > > 1. I currently use kvm-35 > > 2. The symptom is the same when I start already with -loadvm 1 and > without -S > > 3. I have tried to run it with -no-kvm and it seems _not_ to freeze (few > tens of experiments). > > 4. I have tried with kvm, but without -usbdevice tablet and it seems > _not_ to freeze. > > 5. The presence of this problem has been verified on kvm-28,32,33,35. > > 6. Once a qcow2 image gets frozen, running it again and again doesn't > 'fix' the problem. > > 7. I had a workaround, that often worked - run loadvm 1 again. Then the > system gets again operational. This method does not always work though. > > 8. Same problem happened with other windows OS (2000, and other > languages) as well. > > 9. Nothing relevant in dmesg > > > While frozen, I ran 'info cpus' few times on the monitor: > info cpus > (qemu) info cpus > * CPU #0: pc=0x00000000806d5cbc > * CPU #0: pc=0x00000000806d5cec > * CPU #0: pc=0x00000000806d563c > * CPU #0: pc=0x00000000806d57f9 > * CPU #0: pc=0x00000000806d5cec > * CPU #0: pc=0x00000000f9c89f55 > * CPU #0: pc=0x00000000806d57f4 > * CPU #0: pc=0x0000000081719a54 > * CPU #0: pc=0x00000000806d57f4 > * CPU #0: pc=0x00000000806d5caa > * CPU #0: pc=0x00000000806d5caa > * CPU #0: pc=0x00000000806d5cf0 > * CPU #0: pc=0x00000000806d5cec > * CPU #0: pc=0x00000000806d5caa > * CPU #0: pc=0x00000000806d563c > * CPU #0: pc=0x00000000806d563c > * CPU #0: pc=0x00000000806d57f4 > > I can see that some addresses repeat and it is kind of a loop, but I > have no idea what part of winXP is running then. I could only guess that > it has to do with usb, since the presence of -usbdevice tablet makes a > difference. > The whole problem is probably some race condition caused during savevm > (qcow2) while kvm and usb devices are present. > > Running 'info registers' on the monitor few times gives a constant result: > > info registers > EAX=00000062 EBX=00002002 ECX=00000012 EDX=80548dd8 > ESI=80551920 EDI=81719a18 EBP=80548de0 ESP=80548dc8 > EIP=806d5cf0 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0 > ES =0023 00000000 ffffffff 00c0f300 > CS =0008 00000000 ffffffff 00c09b00 > SS =0010 00000000 ffffffff 00c09300 > DS =0023 00000000 ffffffff 00c0f300 > FS =0030 ffdff000 00001fff 00c09300 > GS =0000 00000000 ffffffff 00000000 > LDT=0000 00000000 ffffffff 00000000 > TR =0028 80042000 000020ab 00008b00 > GDT= 8003f000 000003ff > IDT= 8003f400 000007ff > CR0=e001003b CR2=e10e8000 CR3=007db000 CR4=000006f8 > FCW=027f FSW=0120 [ST=0] FTW=00 MXCSR=00000000 > FPR0=0007502c00000000 0000 FPR1=00003d640000050b a3ae > FPR2=00004ea90006c4ff c1a0 FPR3=0000000000005c11 519a > FPR4=0007f86c00000ebe 0000 FPR5=0000000000000000 0000 > FPR6=ff7d000000000000 400e FPR7=ccc999999999a000 4019 > XMM00=607a604000000000000000007c9106eb > XMM01=000000000000010f0000087100000f31 > XMM02=000000000000000000000000000003ad > XMM03=00000000000000000000000000000000 > XMM04=00000c0a000002ff0000000000003911 > XMM05=0000012f00000000000001a400000000 > XMM06=000001620000000c000005180000000d > XMM07=00000000000000000000000000000000 > > > Hardware: > Intel(R) Xeon(R) CPU E5310 @ 1.60GHz (2*quad) > > Software: > RedHat Enterprise 5 > Linux 2.6.18-8.1.6.el5 #1 SMP Fri Jun 1 18:52:13 EDT 2007 x86_64 x86_64 > x86_64 GNU/Linux > > Any idea of why it happens or how to avoid it? > > Regards, > > Shahar Livne > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Splunk Inc. > Still grepping through log files to find problems? Stop. > Now Search log events and configuration files using AJAX and a browser. > Download your FREE copy of Splunk now >> http://get.splunk.com/ > _______________________________________________ > kvm-devel mailing list > kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org > https://lists.sourceforge.net/lists/listinfo/kvm-devel > --------------090304010807050705050202 Content-Type: text/x-patch; name="usb_save_load.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="usb_save_load.diff" commit 93f590514fa96dedc02274183fd1c57fcbba6fdc Author: Uri Lublin Date: Mon Jul 23 11:57:33 2007 +0300 migration: save/load usb devices (specifically mouse/tablet) Taken (slightly modified) from xen (hg 14366:2955b0677310 Tim Deegan) Signed-off-by: Uri Lublin diff --git a/qemu/hw/usb-hid.c b/qemu/hw/usb-hid.c index bde3a7c..d24a959 100644 --- a/qemu/hw/usb-hid.c +++ b/qemu/hw/usb-hid.c @@ -510,6 +510,45 @@ static void usb_mouse_handle_destroy(USBDevice *dev) qemu_free(s); } +void usb_mouse_save(QEMUFile *f, void *opaque) +{ + USBMouseState *s = (USBMouseState*)opaque; + + qemu_put_be32s(f, &s->dx); + qemu_put_be32s(f, &s->dy); + qemu_put_be32s(f, &s->dz); + qemu_put_be32s(f, &s->buttons_state); + qemu_put_be32s(f, &s->x); + qemu_put_be32s(f, &s->y); + qemu_put_be32s(f, &s->kind); + qemu_put_be32s(f, &s->mouse_grabbed); + +} + +int usb_mouse_load(QEMUFile *f, void *opaque, int version_id) +{ + USBMouseState *s = (USBMouseState*)opaque; + + if (version_id != 1) + return -EINVAL; + + qemu_get_be32s(f, &s->dx); + qemu_get_be32s(f, &s->dy); + qemu_get_be32s(f, &s->dz); + qemu_get_be32s(f, &s->buttons_state); + qemu_get_be32s(f, &s->x); + qemu_get_be32s(f, &s->y); + qemu_get_be32s(f, &s->kind); + qemu_get_be32s(f, &s->mouse_grabbed); + + if ( s->kind == USB_TABLET) + qemu_add_mouse_event_handler(usb_tablet_event, s, 1, "QEMU USB Tablet"); + else if ( s->kind == USB_MOUSE) + qemu_add_mouse_event_handler(usb_mouse_event, s, 0, "QEMU USB Mouse"); + return 0; +} + + USBDevice *usb_tablet_init(void) { USBMouseState *s; @@ -528,6 +567,8 @@ USBDevice *usb_tablet_init(void) pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Tablet"); + register_savevm("USB tablet dev", 0, 1, usb_mouse_save, usb_mouse_load, s); + return (USBDevice *)s; } @@ -549,5 +590,7 @@ USBDevice *usb_mouse_init(void) pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Mouse"); + register_savevm("USB mouse dev", 0, 1, usb_mouse_save, usb_mouse_load, s); + return (USBDevice *)s; } diff --git a/qemu/hw/usb.c b/qemu/hw/usb.c index efbc6db..04d9233 100644 --- a/qemu/hw/usb.c +++ b/qemu/hw/usb.c @@ -201,3 +201,43 @@ void usb_send_msg(USBDevice *dev, int msg) dev->handle_packet(dev, &p); } +void generic_usb_save(QEMUFile* f, void *opaque) +{ + USBDevice *s = (USBDevice*)opaque; + + qemu_put_be32s(f, &s->speed); + qemu_put_8s(f, &s->addr); + qemu_put_be32s(f, &s->state); + + qemu_put_buffer(f, s->setup_buf, 8); + qemu_put_buffer(f, s->data_buf, 1024); + + qemu_put_be32s(f, &s->remote_wakeup); + qemu_put_be32s(f, &s->setup_state); + qemu_put_be32s(f, &s->setup_len); + qemu_put_be32s(f, &s->setup_index); + +} + +int generic_usb_load(QEMUFile* f, void *opaque, int version_id) +{ + USBDevice *s = (USBDevice*)opaque; + + if (version_id != 1) + return -EINVAL; + + qemu_get_be32s(f, &s->speed); + qemu_get_8s(f, &s->addr); + qemu_get_be32s(f, &s->state); + + qemu_get_buffer(f, s->setup_buf, 8); + qemu_get_buffer(f, s->data_buf, 1024); + + qemu_get_be32s(f, &s->remote_wakeup); + qemu_get_be32s(f, &s->setup_state); + qemu_get_be32s(f, &s->setup_len); + qemu_get_be32s(f, &s->setup_index); + + return 0; +} + diff --git a/qemu/hw/usb.h b/qemu/hw/usb.h index ed8890e..f2e6d3f 100644 --- a/qemu/hw/usb.h +++ b/qemu/hw/usb.h @@ -218,3 +218,8 @@ USBDevice *usb_tablet_init(void); /* usb-msd.c */ USBDevice *usb_msd_init(const char *filename); + +/* usb.c */ +void generic_usb_save(QEMUFile* f, void *opaque); +int generic_usb_load(QEMUFile* f, void *opaque, int version_id); + diff --git a/qemu/vl.c b/qemu/vl.c index c795af2..f166b92 100644 --- a/qemu/vl.c +++ b/qemu/vl.c @@ -4023,6 +4023,7 @@ static int usb_device_add(const char *devname) const char *p; USBDevice *dev; USBPort *port; + char usb_name[256] = "USB "; if (!free_usb_ports) return -1; @@ -4059,6 +4060,12 @@ static int usb_device_add(const char *devname) free_usb_ports = port->next; port->next = used_usb_ports; used_usb_ports = port; + + pstrcpy(usb_name + strlen(usb_name), + sizeof(usb_name) - strlen(usb_name), + devname); + register_savevm(usb_name, 0, 1, generic_usb_save, generic_usb_load, dev); + usb_attach(port, dev); return 0; } --------------090304010807050705050202 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ --------------090304010807050705050202 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/kvm-devel --------------090304010807050705050202--