Hi,
When I tested pvfb, I got the following warnings.
It seems to be caused by checking/setting info->dirty without dirty_lock.
We need to check/set info->dirty safely.
xenfb_update_screen bogus rect 2147483647 0 2147483647 0
BUG: warning at
/root/linux-2.6.18-xen.hg/drivers/xen/fbfront/xenfb.c:240/xenfb_update_screen()
Call Trace:
[<ffffffff8036920e>] xenfb_thread+0x19b/0x2be
[<ffffffff8022730a>] try_to_wake_up+0x33b/0x34c
[<ffffffff80225c3d>] __wake_up_common+0x3e/0x68
[<ffffffff80241e20>] autoremove_wake_function+0x0/0x2e
[<ffffffff80241a75>] keventd_create_kthread+0x0/0x61
[<ffffffff80369073>] xenfb_thread+0x0/0x2be
[<ffffffff80241a75>] keventd_create_kthread+0x0/0x61
[<ffffffff80241ceb>] kthread+0xd4/0x109
[<ffffffff8020afe0>] child_rip+0xa/0x12
[<ffffffff80241a75>] keventd_create_kthread+0x0/0x61
[<ffffffff8021477f>] xen_send_IPI_mask+0x0/0xf5
[<ffffffff80241c17>] kthread+0x0/0x109
[<ffffffff8020afd6>] child_rip+0x0/0x12
FYI, when I tested it, I used the following shell scripts on PV guest.
The above warnings occurred in /var/log/messages.
=======================
#!/bin/bash
while true
do
date
done
=======================
The attached patch fixed this warnings.
How about it?
Signed-off-by: Akio Takebe <takebe_akio@xxxxxxxxxxxxxx>
Best Regards,
Akio Takebe
diff -r 83b71f4b5cb2 drivers/xen/fbfront/xenfb.c
--- a/drivers/xen/fbfront/xenfb.c Tue Jan 20 13:28:35 2009 +0000
+++ b/drivers/xen/fbfront/xenfb.c Tue Jan 27 20:09:58 2009 +0900
@@ -255,19 +255,36 @@
}
spin_unlock_irqrestore(&info->resize_lock, flags);
}
+static int check_is_dirty(struct xenfb_info *info)
+{
+ int is_dirty;
+ unsigned long flags;
+ spin_lock_irqsave(&info->dirty_lock, flags);
+ is_dirty = info->dirty;
+ spin_unlock_irqrestore(&info->dirty_lock, flags);
+
+ return is_dirty;
+}
static int xenfb_thread(void *data)
{
struct xenfb_info *info = data;
+ unsigned long flags;
+ int is_dirty;
while (!kthread_should_stop()) {
xenfb_handle_resize_dpy(info);
- if (info->dirty) {
+ spin_lock_irqsave(&info->dirty_lock, flags);
+ is_dirty = info->dirty;
+ if (is_dirty) {
info->dirty = 0;
+ spin_unlock_irqrestore(&info->dirty_lock, flags);
xenfb_update_screen(info);
+ } else {
+ spin_unlock_irqrestore(&info->dirty_lock, flags);
}
wait_event_interruptible(info->wq,
- kthread_should_stop() || info->dirty);
+ kthread_should_stop() || check_is_dirty(info));
try_to_freeze();
}
return 0;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|