All of lore.kernel.org
 help / color / mirror / Atom feed
* [Patch] fix xenfb_update_screen bogus rect
@ 2009-01-27  2:58 Akio Takebe
  2009-01-27  8:16 ` Jan Beulich
  0 siblings, 1 reply; 14+ messages in thread
From: Akio Takebe @ 2009-01-27  2:58 UTC (permalink / raw)
  To: xen-devel

[-- Attachment #1: Type: text/plain, Size: 1324 bytes --]

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@jp.fujitsu.com>

Best Regards,

Akio Takebe

[-- Attachment #2: fix_pvfb_dirty_lock.patch --]
[-- Type: text/x-diff, Size: 1152 bytes --]

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;

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Patch] fix xenfb_update_screen bogus rect
  2009-01-27  2:58 [Patch] fix xenfb_update_screen bogus rect Akio Takebe
@ 2009-01-27  8:16 ` Jan Beulich
  2009-01-28  7:31   ` Akio Takebe
  0 siblings, 1 reply; 14+ messages in thread
From: Jan Beulich @ 2009-01-27  8:16 UTC (permalink / raw)
  To: Akio Takebe; +Cc: xen-devel

This looks bogus to me. check_is_dirty() definitely isn't needed - if at all, a
memory read barrier may need to be added, but since kthread_should_stop()
is a function call even that ought to be unnecessary.

I also think the other change is more involved than it needs to be - it'd be
much simpler to let xenfb_update_screen() check-and-clear the dirty flag
along with reading the other fields, and bail if the flag was clear.

Jan

>>> Akio Takebe <takebe_akio@jp.fujitsu.com> 27.01.09 03:58 >>>
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@jp.fujitsu.com>

Best Regards,

Akio Takebe

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Patch] fix xenfb_update_screen bogus rect
  2009-01-27  8:16 ` Jan Beulich
@ 2009-01-28  7:31   ` Akio Takebe
  2009-01-28  9:06     ` Jan Beulich
                       ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Akio Takebe @ 2009-01-28  7:31 UTC (permalink / raw)
  To: Jan Beulich; +Cc: xen-devel

[-- Attachment #1: Type: text/plain, Size: 2320 bytes --]

Hi, Jan

Thank you for your review.
I remade it simpler.
But Just moving check-and-clear dirty flag to xenfb_update_screen(),
a guest with vcpu=1 could not boot.
It is caused by info->update_wanted = 0.
So I moved kthread_run() into XenbusStateConnected handling.
How about it?

Signed-off-by: Akio Takebe <takebe_akio@jp.fujitsu.com>

Best Regards,

Akio Takebe

Jan Beulich wrote:
> This looks bogus to me. check_is_dirty() definitely isn't needed - if at all, a
> memory read barrier may need to be added, but since kthread_should_stop()
> is a function call even that ought to be unnecessary.
> 
> I also think the other change is more involved than it needs to be - it'd be
> much simpler to let xenfb_update_screen() check-and-clear the dirty flag
> along with reading the other fields, and bail if the flag was clear.
> 
> Jan
> 
>>>> Akio Takebe <takebe_akio@jp.fujitsu.com> 27.01.09 03:58 >>>
> 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@jp.fujitsu.com>
> 
> Best Regards,
> 
> Akio Takebe
> 
> 

[-- Attachment #2: fix_pvfb_dirty_lock.patch --]
[-- Type: text/x-diff, Size: 1926 bytes --]

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	Thu Jan 29 01:24:06 2009 +0900
@@ -213,17 +213,23 @@
 	if (xenfb_queue_full(info))
 		return;
 
-	mutex_lock(&info->mm_lock);
-
 	spin_lock_irqsave(&info->dirty_lock, flags);
-	y1 = info->y1;
-	y2 = info->y2;
-	x1 = info->x1;
-	x2 = info->x2;
-	info->x1 = info->y1 = INT_MAX;
-	info->x2 = info->y2 = 0;
+	if (info->dirty){
+		info->dirty = 0;
+		y1 = info->y1;
+		y2 = info->y2;
+		x1 = info->x1;
+		x2 = info->x2;
+		info->x1 = info->y1 = INT_MAX;
+		info->x2 = info->y2 = 0;
+	} else {
+		spin_unlock_irqrestore(&info->dirty_lock, flags);
+		return;
+	}
 	spin_unlock_irqrestore(&info->dirty_lock, flags);
 
+	mutex_lock(&info->mm_lock);
+	
 	list_for_each_entry(map, &info->mappings, link) {
 		if (!map->faults)
 			continue;
@@ -262,10 +268,7 @@
 
 	while (!kthread_should_stop()) {
 		xenfb_handle_resize_dpy(info);
-		if (info->dirty) {
-			info->dirty = 0;
-			xenfb_update_screen(info);
-		}
+		xenfb_update_screen(info);
 		wait_event_interruptible(info->wq,
 			kthread_should_stop() || info->dirty);
 		try_to_freeze();
@@ -666,15 +669,6 @@
 	if (ret < 0)
 		goto error;
 
-	/* FIXME should this be delayed until backend XenbusStateConnected? */
-	info->kthread = kthread_run(xenfb_thread, info, "xenfb thread");
-	if (IS_ERR(info->kthread)) {
-		ret = PTR_ERR(info->kthread);
-		info->kthread = NULL;
-		xenbus_dev_fatal(dev, ret, "register_framebuffer");
-		goto error;
-	}
-
 	return 0;
 
  error_nomem:
@@ -839,6 +833,13 @@
 					"feature-resize", "%d", &val) < 0)
 			val = 0;
 		info->feature_resize = val;
+
+		info->kthread = kthread_run(xenfb_thread, info, "xenfb thread");
+		if (IS_ERR(info->kthread)) {
+			info->kthread = NULL;
+			xenbus_dev_fatal(dev, PTR_ERR(info->kthread),
+					"register_framebuffer");
+		}
 		break;
 
 	case XenbusStateClosing:

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Patch] fix xenfb_update_screen bogus rect
  2009-01-28  7:31   ` Akio Takebe
@ 2009-01-28  9:06     ` Jan Beulich
  2009-01-28 14:33       ` Markus Armbruster
  2009-01-28 14:31     ` Markus Armbruster
  2009-02-02  9:17     ` [PATCH] fbfront: Improve diagnostics when kthread_run() fails Markus Armbruster
  2 siblings, 1 reply; 14+ messages in thread
From: Jan Beulich @ 2009-01-28  9:06 UTC (permalink / raw)
  To: Akio Takebe; +Cc: xen-devel

Generally this looks okay (assuming it works), but couldn't the update_wanted
field then go away altogether?

Jan

>>> Akio Takebe <takebe_akio@jp.fujitsu.com> 28.01.09 08:31 >>>
Hi, Jan

Thank you for your review.
I remade it simpler.
But Just moving check-and-clear dirty flag to xenfb_update_screen(),
a guest with vcpu=1 could not boot.
It is caused by info->update_wanted = 0.
So I moved kthread_run() into XenbusStateConnected handling.
How about it?

Signed-off-by: Akio Takebe <takebe_akio@jp.fujitsu.com>

Best Regards,

Akio Takebe

Jan Beulich wrote:
> This looks bogus to me. check_is_dirty() definitely isn't needed - if at all, a
> memory read barrier may need to be added, but since kthread_should_stop()
> is a function call even that ought to be unnecessary.
> 
> I also think the other change is more involved than it needs to be - it'd be
> much simpler to let xenfb_update_screen() check-and-clear the dirty flag
> along with reading the other fields, and bail if the flag was clear.
> 
> Jan
> 
>>>> Akio Takebe <takebe_akio@jp.fujitsu.com> 27.01.09 03:58 >>>
> 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@jp.fujitsu.com>
> 
> Best Regards,
> 
> Akio Takebe
> 
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Patch] fix xenfb_update_screen bogus rect
  2009-01-28  7:31   ` Akio Takebe
  2009-01-28  9:06     ` Jan Beulich
@ 2009-01-28 14:31     ` Markus Armbruster
  2009-01-29 12:54       ` Akio Takebe
  2009-02-02  9:17     ` [PATCH] fbfront: Improve diagnostics when kthread_run() fails Markus Armbruster
  2 siblings, 1 reply; 14+ messages in thread
From: Markus Armbruster @ 2009-01-28 14:31 UTC (permalink / raw)
  To: Akio Takebe; +Cc: xen-devel

Akio Takebe <takebe_akio@jp.fujitsu.com> writes:

> Hi, Jan
>
> Thank you for your review.
> I remade it simpler.
> But Just moving check-and-clear dirty flag to xenfb_update_screen(),
> a guest with vcpu=1 could not boot.
> It is caused by info->update_wanted = 0.

Thanks for debugging this!

> So I moved kthread_run() into XenbusStateConnected handling.
> How about it?
>
> Signed-off-by: Akio Takebe <takebe_akio@jp.fujitsu.com>
>
> 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	Thu Jan 29 01:24:06 2009 +0900
> @@ -213,17 +213,23 @@

Please use -p with diff.

>  	if (xenfb_queue_full(info))
>  		return;
>  
> -	mutex_lock(&info->mm_lock);
> -
>  	spin_lock_irqsave(&info->dirty_lock, flags);
> -	y1 = info->y1;
> -	y2 = info->y2;
> -	x1 = info->x1;
> -	x2 = info->x2;
> -	info->x1 = info->y1 = INT_MAX;
> -	info->x2 = info->y2 = 0;
> +	if (info->dirty){
> +		info->dirty = 0;
> +		y1 = info->y1;
> +		y2 = info->y2;
> +		x1 = info->x1;
> +		x2 = info->x2;
> +		info->x1 = info->y1 = INT_MAX;
> +		info->x2 = info->y2 = 0;
> +	} else {
> +		spin_unlock_irqrestore(&info->dirty_lock, flags);
> +		return;
> +	}
>  	spin_unlock_irqrestore(&info->dirty_lock, flags);
>  
> +	mutex_lock(&info->mm_lock);
> +	
>  	list_for_each_entry(map, &info->mappings, link) {
>  		if (!map->faults)
>  			continue;

Careful, locking is rather delicate here.  Please read the big comment
"There are three locks:", then explain why moving the locking of
mm_lock is safe.

[...]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Patch] fix xenfb_update_screen bogus rect
  2009-01-28  9:06     ` Jan Beulich
@ 2009-01-28 14:33       ` Markus Armbruster
  2009-01-29  9:12         ` Akio Takebe
  0 siblings, 1 reply; 14+ messages in thread
From: Markus Armbruster @ 2009-01-28 14:33 UTC (permalink / raw)
  To: Jan Beulich; +Cc: xen-devel, Akio Takebe

"Jan Beulich" <jbeulich@novell.com> writes:

> Generally this looks okay (assuming it works), but couldn't the update_wanted
> field then go away altogether?
>
> Jan

I think so, yes.  Start the kthread only when request-update.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Patch] fix xenfb_update_screen bogus rect
  2009-01-28 14:33       ` Markus Armbruster
@ 2009-01-29  9:12         ` Akio Takebe
  2009-01-29 14:29           ` Markus Armbruster
  0 siblings, 1 reply; 14+ messages in thread
From: Akio Takebe @ 2009-01-29  9:12 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: xen-devel

[-- Attachment #1: Type: text/plain, Size: 504 bytes --]

Hi, Markus and Jan

Markus Armbruster wrote:
> "Jan Beulich" <jbeulich@novell.com> writes:
> 
>> Generally this looks okay (assuming it works), but couldn't the update_wanted
>> field then go away altogether?
>>
>> Jan
> 
> I think so, yes.  Start the kthread only when request-update.
> 
Thank you for your review.
The patch was commited already.
So I made an additional patch which eliminate the update_wanted field.

Signed-off-by: Akio Takebe <takebe_akio@jp.fujitsu.com>

Best Regards,

Akio Takebe

[-- Attachment #2: eliminate_update_wanted.patch --]
[-- Type: text/x-diff, Size: 1655 bytes --]

diff -r 51decc39e5e7 drivers/xen/fbfront/xenfb.c
--- a/drivers/xen/fbfront/xenfb.c	Wed Jan 28 13:42:09 2009 +0000
+++ b/drivers/xen/fbfront/xenfb.c	Thu Jan 29 18:04:36 2009 +0900
@@ -61,7 +61,6 @@ struct xenfb_info
 	int			irq;
 	struct xenfb_page	*page;
 	unsigned long 		*mfns;
-	int			update_wanted; /* XENFB_TYPE_UPDATE wanted */
 	int			feature_resize; /* Backend has resize feature */
 	struct xenfb_resize	resize;
 	int			resize_dpy;
@@ -208,8 +207,6 @@ static void xenfb_update_screen(struct x
 	int y1, y2, x1, x2;
 	struct xenfb_mapping *map;
 
-	if (!info->update_wanted)
-		return;
 	if (xenfb_queue_full(info))
 		return;
 
@@ -823,22 +820,24 @@ static void xenfb_backend_changed(struct
 		if (dev->state != XenbusStateConnected)
 			goto InitWait; /* no InitWait seen yet, fudge it */
 
-		if (xenbus_scanf(XBT_NIL, info->xbdev->otherend,
-				 "request-update", "%d", &val) < 0)
-			val = 0;
-		if (val)
-			info->update_wanted = 1;
 
 		if (xenbus_scanf(XBT_NIL, dev->otherend,
 					"feature-resize", "%d", &val) < 0)
 			val = 0;
 		info->feature_resize = val;
 
-		info->kthread = kthread_run(xenfb_thread, info, "xenfb thread");
-		if (IS_ERR(info->kthread)) {
-			info->kthread = NULL;
-			xenbus_dev_fatal(dev, PTR_ERR(info->kthread),
-					"register_framebuffer");
+		if (xenbus_scanf(XBT_NIL, info->xbdev->otherend,
+				 "request-update", "%d", &val) < 0)
+			val = 0;
+
+		if (val){
+			info->kthread = kthread_run(xenfb_thread, info,
+						    "xenfb thread");
+			if (IS_ERR(info->kthread)) {
+				info->kthread = NULL;
+				xenbus_dev_fatal(dev, PTR_ERR(info->kthread),
+						"register_framebuffer");
+			}
 		}
 		break;
 

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Patch] fix xenfb_update_screen bogus rect
  2009-01-28 14:31     ` Markus Armbruster
@ 2009-01-29 12:54       ` Akio Takebe
  2009-01-29 14:44         ` Markus Armbruster
  0 siblings, 1 reply; 14+ messages in thread
From: Akio Takebe @ 2009-01-29 12:54 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: xen-devel

Hi, Markus

Markus Armbruster wrote:
> Akio Takebe <takebe_akio@jp.fujitsu.com> writes:
> 
>> Hi, Jan
>>
>> Thank you for your review.
>> I remade it simpler.
>> But Just moving check-and-clear dirty flag to xenfb_update_screen(),
>> a guest with vcpu=1 could not boot.
>> It is caused by info->update_wanted = 0.
> 
> Thanks for debugging this!
> 
>> So I moved kthread_run() into XenbusStateConnected handling.
>> How about it?
>>
>> Signed-off-by: Akio Takebe <takebe_akio@jp.fujitsu.com>
>>
>> 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	Thu Jan 29 01:24:06 2009 +0900
>> @@ -213,17 +213,23 @@
> 
> Please use -p with diff.
> 
>>  	if (xenfb_queue_full(info))
>>  		return;
>>  
>> -	mutex_lock(&info->mm_lock);
>> -
>>  	spin_lock_irqsave(&info->dirty_lock, flags);
>> -	y1 = info->y1;
>> -	y2 = info->y2;
>> -	x1 = info->x1;
>> -	x2 = info->x2;
>> -	info->x1 = info->y1 = INT_MAX;
>> -	info->x2 = info->y2 = 0;
>> +	if (info->dirty){
>> +		info->dirty = 0;
>> +		y1 = info->y1;
>> +		y2 = info->y2;
>> +		x1 = info->x1;
>> +		x2 = info->x2;
>> +		info->x1 = info->y1 = INT_MAX;
>> +		info->x2 = info->y2 = 0;
>> +	} else {
>> +		spin_unlock_irqrestore(&info->dirty_lock, flags);
>> +		return;
>> +	}
>>  	spin_unlock_irqrestore(&info->dirty_lock, flags);
>>  
>> +	mutex_lock(&info->mm_lock);
>> +	
>>  	list_for_each_entry(map, &info->mappings, link) {
>>  		if (!map->faults)
>>  			continue;
> 
> Careful, locking is rather delicate here.  Please read the big comment
> "There are three locks:", then explain why moving the locking of
> mm_lock is safe.
> 
Thank you for your review.
First, I thought mm_lock just protected the mappings,
and the dirty rectangle was protected by the dirty_lock.
So I moved the mm_lock.
Also when I tested the patch, I didn't get any problem.
Do you mean the narrow point of between unloking dirty_lock and locking mm_lock
in xenfb_update_screen() may be not safe?
Do you find any critical cases?

Best Regards,

Akio Takebe

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Patch] fix xenfb_update_screen bogus rect
  2009-01-29  9:12         ` Akio Takebe
@ 2009-01-29 14:29           ` Markus Armbruster
  0 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2009-01-29 14:29 UTC (permalink / raw)
  To: Akio Takebe; +Cc: xen-devel

Akio Takebe <takebe_akio@jp.fujitsu.com> writes:

> Hi, Markus and Jan
>
> Markus Armbruster wrote:
>> "Jan Beulich" <jbeulich@novell.com> writes:
>>
>>> Generally this looks okay (assuming it works), but couldn't the update_wanted
>>> field then go away altogether?
>>>
>>> Jan
>>
>> I think so, yes.  Start the kthread only when request-update.
>>
> Thank you for your review.
> The patch was commited already.
> So I made an additional patch which eliminate the update_wanted field.
>
> Signed-off-by: Akio Takebe <takebe_akio@jp.fujitsu.com>
>
> Best Regards,
>
> Akio Takebe

Looks good to me.

A possible reason not to take this cleanup is the fact that this
version of the driver is a dead end (the living end lives in current
upstream kernels).  Perhaps only true fixes with minimal structural
impact are desired because of that.  Not my call to make.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Patch] fix xenfb_update_screen bogus rect
  2009-01-29 12:54       ` Akio Takebe
@ 2009-01-29 14:44         ` Markus Armbruster
  2009-01-30  2:02           ` Akio Takebe
  0 siblings, 1 reply; 14+ messages in thread
From: Markus Armbruster @ 2009-01-29 14:44 UTC (permalink / raw)
  To: Akio Takebe; +Cc: xen-devel

Akio Takebe <takebe_akio@jp.fujitsu.com> writes:

> Hi, Markus
>
> Markus Armbruster wrote:
>> Akio Takebe <takebe_akio@jp.fujitsu.com> writes:
[...]
>>> 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	Thu Jan 29 01:24:06 2009 +0900
>>> @@ -213,17 +213,23 @@
>>
>> Please use -p with diff.
>>
>>>  	if (xenfb_queue_full(info))
>>>  		return;
>>>  -	mutex_lock(&info->mm_lock);
>>> -
>>>  	spin_lock_irqsave(&info->dirty_lock, flags);
>>> -	y1 = info->y1;
>>> -	y2 = info->y2;
>>> -	x1 = info->x1;
>>> -	x2 = info->x2;
>>> -	info->x1 = info->y1 = INT_MAX;
>>> -	info->x2 = info->y2 = 0;
>>> +	if (info->dirty){
>>> +		info->dirty = 0;
>>> +		y1 = info->y1;
>>> +		y2 = info->y2;
>>> +		x1 = info->x1;
>>> +		x2 = info->x2;
>>> +		info->x1 = info->y1 = INT_MAX;
>>> +		info->x2 = info->y2 = 0;
>>> +	} else {
>>> +		spin_unlock_irqrestore(&info->dirty_lock, flags);
>>> +		return;
>>> +	}
>>>  	spin_unlock_irqrestore(&info->dirty_lock, flags);
>>>  +	mutex_lock(&info->mm_lock);
>>> +	
>>>  	list_for_each_entry(map, &info->mappings, link) {
>>>  		if (!map->faults)
>>>  			continue;
>>
>> Careful, locking is rather delicate here.  Please read the big comment
>> "There are three locks:", then explain why moving the locking of
>> mm_lock is safe.
>>
> Thank you for your review.

My pleasure.  I have to thank for your fix!

> First, I thought mm_lock just protected the mappings,
> and the dirty rectangle was protected by the dirty_lock.
> So I moved the mm_lock.
> Also when I tested the patch, I didn't get any problem.

Subtle locking bugs are notoriously hard to demonstrate by testing.

> Do you mean the narrow point of between unloking dirty_lock and locking mm_lock
> in xenfb_update_screen() may be not safe?
> Do you find any critical cases?
>
> Best Regards,
>
> Akio Takebe

Your proposed change might be fine, it might be racy, I don't know.
What I do know is that it invalidates the comment I mentioned.  That's
a nasty trap for the unwary, and clearly a bug as far as I'm
concerned.

I strongly recommend to either revert the locking change, or fix the
comment to match the new code.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Patch] fix xenfb_update_screen bogus rect
  2009-01-29 14:44         ` Markus Armbruster
@ 2009-01-30  2:02           ` Akio Takebe
  2009-01-30  7:38             ` Markus Armbruster
  0 siblings, 1 reply; 14+ messages in thread
From: Akio Takebe @ 2009-01-30  2:02 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: xen-devel

[-- Attachment #1: Type: text/plain, Size: 2530 bytes --]

Hi, Markus

Markus Armbruster wrote:
> Akio Takebe <takebe_akio@jp.fujitsu.com> writes:
> 
>> Hi, Markus
>>
>> Markus Armbruster wrote:
>>> Akio Takebe <takebe_akio@jp.fujitsu.com> writes:
> [...]
>>>> 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	Thu Jan 29 01:24:06 2009 +0900
>>>> @@ -213,17 +213,23 @@
>>> Please use -p with diff.
>>>
>>>>  	if (xenfb_queue_full(info))
>>>>  		return;
>>>>  -	mutex_lock(&info->mm_lock);
>>>> -
>>>>  	spin_lock_irqsave(&info->dirty_lock, flags);
>>>> -	y1 = info->y1;
>>>> -	y2 = info->y2;
>>>> -	x1 = info->x1;
>>>> -	x2 = info->x2;
>>>> -	info->x1 = info->y1 = INT_MAX;
>>>> -	info->x2 = info->y2 = 0;
>>>> +	if (info->dirty){
>>>> +		info->dirty = 0;
>>>> +		y1 = info->y1;
>>>> +		y2 = info->y2;
>>>> +		x1 = info->x1;
>>>> +		x2 = info->x2;
>>>> +		info->x1 = info->y1 = INT_MAX;
>>>> +		info->x2 = info->y2 = 0;
>>>> +	} else {
>>>> +		spin_unlock_irqrestore(&info->dirty_lock, flags);
>>>> +		return;
>>>> +	}
>>>>  	spin_unlock_irqrestore(&info->dirty_lock, flags);
>>>>  +	mutex_lock(&info->mm_lock);
>>>> +	
>>>>  	list_for_each_entry(map, &info->mappings, link) {
>>>>  		if (!map->faults)
>>>>  			continue;
>>> Careful, locking is rather delicate here.  Please read the big comment
>>> "There are three locks:", then explain why moving the locking of
>>> mm_lock is safe.
>>>
>> Thank you for your review.
> 
> My pleasure.  I have to thank for your fix!
> 
>> First, I thought mm_lock just protected the mappings,
>> and the dirty rectangle was protected by the dirty_lock.
>> So I moved the mm_lock.
>> Also when I tested the patch, I didn't get any problem.
> 
> Subtle locking bugs are notoriously hard to demonstrate by testing.
> 
>> Do you mean the narrow point of between unloking dirty_lock and locking mm_lock
>> in xenfb_update_screen() may be not safe?
>> Do you find any critical cases?
>>
>> Best Regards,
>>
>> Akio Takebe
> 
> Your proposed change might be fine, it might be racy, I don't know.
> What I do know is that it invalidates the comment I mentioned.  That's
> a nasty trap for the unwary, and clearly a bug as far as I'm
> concerned.
> 
> I strongly recommend to either revert the locking change, or fix the
> comment to match the new code.
> 
I agree with you. I revert the mm_lock changing.
In my graphic test, I didn't get any problem with this patch.

Signed-off-by: Akio Takebe <takebe_akio@jp.fujitsu.com>

Best Regards,

Akio Takebe

[-- Attachment #2: revert_mm_lock.patch --]
[-- Type: text/x-diff, Size: 780 bytes --]

diff -r f90f02049d7e drivers/xen/fbfront/xenfb.c
--- a/drivers/xen/fbfront/xenfb.c	Thu Jan 29 18:26:47 2009 +0900
+++ b/drivers/xen/fbfront/xenfb.c	Fri Jan 30 10:54:07 2009 +0900
@@ -210,6 +210,8 @@ static void xenfb_update_screen(struct x
 	if (xenfb_queue_full(info))
 		return;
 
+	mutex_lock(&info->mm_lock);
+	
 	spin_lock_irqsave(&info->dirty_lock, flags);
 	if (info->dirty){
 		info->dirty = 0;
@@ -221,12 +223,11 @@ static void xenfb_update_screen(struct x
 		info->x2 = info->y2 = 0;
 	} else {
 		spin_unlock_irqrestore(&info->dirty_lock, flags);
+		mutex_unlock(&info->mm_lock);
 		return;
 	}
 	spin_unlock_irqrestore(&info->dirty_lock, flags);
 
-	mutex_lock(&info->mm_lock);
-	
 	list_for_each_entry(map, &info->mappings, link) {
 		if (!map->faults)
 			continue;

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Patch] fix xenfb_update_screen bogus rect
  2009-01-30  2:02           ` Akio Takebe
@ 2009-01-30  7:38             ` Markus Armbruster
  0 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2009-01-30  7:38 UTC (permalink / raw)
  To: Akio Takebe; +Cc: xen-devel

Akio Takebe <takebe_akio@jp.fujitsu.com> writes:

> Hi, Markus
>
> Markus Armbruster wrote:
[...]
>> I strongly recommend to either revert the locking change, or fix the
>> comment to match the new code.
>>
> I agree with you. I revert the mm_lock changing.
> In my graphic test, I didn't get any problem with this patch.
>
> Signed-off-by: Akio Takebe <takebe_akio@jp.fujitsu.com>
>
> Best Regards,
>
> Akio Takebe

Looks good to me.  Thanks again!

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH] fbfront: Improve diagnostics when kthread_run() fails
  2009-01-28  7:31   ` Akio Takebe
  2009-01-28  9:06     ` Jan Beulich
  2009-01-28 14:31     ` Markus Armbruster
@ 2009-02-02  9:17     ` Markus Armbruster
  2009-02-02 23:48       ` [PATCH] fbfront: Improve diagnostics when kthread_run()fails Akio Takebe
  2 siblings, 1 reply; 14+ messages in thread
From: Markus Armbruster @ 2009-02-02  9:17 UTC (permalink / raw)
  To: Akio Takebe; +Cc: xen-devel

Failure is reported with xenbus_dev_fatal(..."register_framebuffer"),
which was already suboptimal before it got moved away from
register_framebuffer(), and is outright misleading now.

Signed-off-by: Markus Armbruster <armbru@redhat.com>

diff -r 26ddc59c674d drivers/xen/fbfront/xenfb.c
--- a/drivers/xen/fbfront/xenfb.c	Fri Jan 30 10:54:10 2009 +0000
+++ b/drivers/xen/fbfront/xenfb.c	Mon Feb 02 10:12:54 2009 +0100
@@ -211,7 +211,7 @@
 		return;
 
 	mutex_lock(&info->mm_lock);
-	
+
 	spin_lock_irqsave(&info->dirty_lock, flags);
 	if (info->dirty){
 		info->dirty = 0;
@@ -837,7 +837,7 @@
 			if (IS_ERR(info->kthread)) {
 				info->kthread = NULL;
 				xenbus_dev_fatal(dev, PTR_ERR(info->kthread),
-						"register_framebuffer");
+						"xenfb_thread");
 			}
 		}
 		break;

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] fbfront: Improve diagnostics when kthread_run()fails
  2009-02-02  9:17     ` [PATCH] fbfront: Improve diagnostics when kthread_run() fails Markus Armbruster
@ 2009-02-02 23:48       ` Akio Takebe
  0 siblings, 0 replies; 14+ messages in thread
From: Akio Takebe @ 2009-02-02 23:48 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: xen-devel, Akio Takebe

Hi, Markus

Thanks. I agree with you.

Best Regards,

Akio Takebe

>Failure is reported with xenbus_dev_fatal(..."register_framebuffer"),
>which was already suboptimal before it got moved away from
>register_framebuffer(), and is outright misleading now.
>
>Signed-off-by: Markus Armbruster <armbru@redhat.com>
>
>diff -r 26ddc59c674d drivers/xen/fbfront/xenfb.c
>--- a/drivers/xen/fbfront/xenfb.c	Fri Jan 30 10:54:10 2009 +0000
>+++ b/drivers/xen/fbfront/xenfb.c	Mon Feb 02 10:12:54 2009 +0100
>@@ -211,7 +211,7 @@
> 		return;
> 
> 	mutex_lock(&info->mm_lock);
>-	
>+
> 	spin_lock_irqsave(&info->dirty_lock, flags);
> 	if (info->dirty){
> 		info->dirty = 0;
>@@ -837,7 +837,7 @@
> 			if (IS_ERR(info->kthread)) {
> 				info->kthread = NULL;
> 				xenbus_dev_fatal(dev, PTR_ERR(info->kthread),
>-						"register_framebuffer");
>+						"xenfb_thread");
> 			}
> 		}
> 		break;
>
>_______________________________________________
>Xen-devel mailing list
>Xen-devel@lists.xensource.com
>http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2009-02-02 23:48 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-27  2:58 [Patch] fix xenfb_update_screen bogus rect Akio Takebe
2009-01-27  8:16 ` Jan Beulich
2009-01-28  7:31   ` Akio Takebe
2009-01-28  9:06     ` Jan Beulich
2009-01-28 14:33       ` Markus Armbruster
2009-01-29  9:12         ` Akio Takebe
2009-01-29 14:29           ` Markus Armbruster
2009-01-28 14:31     ` Markus Armbruster
2009-01-29 12:54       ` Akio Takebe
2009-01-29 14:44         ` Markus Armbruster
2009-01-30  2:02           ` Akio Takebe
2009-01-30  7:38             ` Markus Armbruster
2009-02-02  9:17     ` [PATCH] fbfront: Improve diagnostics when kthread_run() fails Markus Armbruster
2009-02-02 23:48       ` [PATCH] fbfront: Improve diagnostics when kthread_run()fails Akio Takebe

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.