projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
c1f5db1
)
xen/fb: fix xenfb suspend/resume race.
author
Joe Jin
<
[email protected]
>
Fri, 7 Jan 2011 10:17:17 +0000
(18:17 +0800)
committer
Konrad Rzeszutek Wilk
<
[email protected]
>
Mon, 10 Jan 2011 15:46:30 +0000
(10:46 -0500)
When migrating guests over a long period we hit this:
<1>BUG: unable to handle kernel paging request at
0000000b819fdb98
<1>IP: [<
ffffffff812a588f
>] notify_remote_via_irq+0x13/0x34
<4>PGD
94b10067
PUD 0
<0>Oops: 0000 [#1] SMP
.. snip..
Call Trace:
[<
ffffffff812712c9
>] xenfb_send_event+0x5c/0x5e
[<
ffffffff8100ea5f
>] ? xen_restore_fl_direct_end+0x0/0x1
[<
ffffffff81438d80
>] ? _spin_unlock_irqrestore+0x16/0x18
[<
ffffffff812714ee
>] xenfb_refresh+0x1b1/0x1d7
[<
ffffffff81270568
>] ? sys_imageblit+0x1ac/0x458
[<
ffffffff81271786
>] xenfb_imageblit+0x2f/0x34
[<
ffffffff8126a3e5
>] soft_cursor+0x1b5/0x1c8
[<
ffffffff8126a137
>] bit_cursor+0x4b6/0x4d7
[<
ffffffff8100ea5f
>] ? xen_restore_fl_direct_end+0x0/0x1
[<
ffffffff81438d80
>] ? _spin_unlock_irqrestore+0x16/0x18
[<
ffffffff81269c81
>] ? bit_cursor+0x0/0x4d7
[<
ffffffff812656b7
>] fb_flashcursor+0xff/0x111
[<
ffffffff812655b8
>] ? fb_flashcursor+0x0/0x111
[<
ffffffff81071812
>] worker_thread+0x14d/0x1ed
[<
ffffffff81075a8c
>] ? autoremove_wake_function+0x0/0x3d
[<
ffffffff81438d80
>] ? _spin_unlock_irqrestore+0x16/0x18
[<
ffffffff810716c5
>] ? worker_thread+0x0/0x1ed
[<
ffffffff810756e3
>] kthread+0x6e/0x76
[<
ffffffff81012dea
>] child_rip+0xa/0x20
[<
ffffffff81011fd1
>] ? int_ret_from_sys_call+0x7/0x1b
[<
ffffffff8101275d
>] ? retint_restore_args+0x5/0x6
[<
ffffffff81012de0
>] ? child_rip+0x0/0x20
Code: 6b ff 0c 8b 87 a4 db 9f 81 66 85 c0 74 08 0f b7 f8 e8 3b ff ff ff c9
c3 55 48 89 e5 48 83 ec 10 0f 1f 44 00 00 89 ff 48 6b ff 0c <8b> 87 a4 db 9f
81 66 85 c0 74 14 48 8d 75 f0 0f b7 c0 bf 04 00
RIP [<
ffffffff812a588f
>] notify_remote_via_irq+0x13/0x34
RSP <
ffff8800e7bf7bd0
>
CR2:
0000000b819fdb98
---[ end trace
098b4b74827595d0
]---
The root cause of the panic is the race between the resume and reconnect to the backend.
Clearing the 'update_wanted' flag of xenfb before disconnecting from the
backend fixes this issue.
Signed-off-by: Joe Jin <
[email protected]
>
Signed-off-by: Konrad Rzeszutek Wilk <
[email protected]
>
Tested-by: Gurudas Pai <
[email protected]
>
Acked-by: Ian Campbell <
[email protected]
>
Cc: Jeremy Fitzhardinge <
[email protected]
>
Cc: Andrew Morton <
[email protected]
>
drivers/video/xen-fbfront.c
patch
|
blob
|
history
diff --git
a/drivers/video/xen-fbfront.c
b/drivers/video/xen-fbfront.c
index 428d273be72799e1ae6e90409584efced58dc871..f92313d33e27a0990e54fd68a8b3951234c1ab99 100644
(file)
--- a/
drivers/video/xen-fbfront.c
+++ b/
drivers/video/xen-fbfront.c
@@
-617,6
+617,8
@@
static int xenfb_connect_backend(struct xenbus_device *dev,
static void xenfb_disconnect_backend(struct xenfb_info *info)
{
+ /* Prevent xenfb refresh */
+ info->update_wanted = 0;
if (info->irq >= 0)
unbind_from_irqhandler(info->irq, info);
info->irq = -1;