* "fb-defio: fix page list with concurrent processes"
@ 2008-06-16 22:05 Jeremy Fitzhardinge
2008-06-17 1:11 ` Jaya Kumar
0 siblings, 1 reply; 9+ messages in thread
From: Jeremy Fitzhardinge @ 2008-06-16 22:05 UTC (permalink / raw)
To: Jaya Kumar; +Cc: Markus Armbruster, Linux Kernel Mailing List
Your patch "fb-defio: fix page list with concurrent processes"
definitely seems to help with the suspend/resume problem I had with the
Xen pvfb device. Is it queued up anywhere? It seems to be a real
bugfix, and should probably be queued for 2.6.26...
J
fb-defio: fix page list with concurrent processes
From: Jaya Kumar <jayakumar.lkml@gmail.com>
Hi Tony, Geert, Andrew, fbdev,
This patch is a bugfix for how defio handles multiple processes manipulating
the same framebuffer. Thanks to Bernard Blackham for identifying this bug.
It occurs when two applications mmap the same framebuffer and concurrently
write to the same page. Normally, this doesn't occur since only a single
process mmaps the framebuffer. The symptom of the bug is that the mapping
applications will hang. The cause is that defio incorrectly tries to add the
same page twice to the pagelist. The solution I have is to walk the pagelist
and check for a duplicate before adding. Since I needed to walk the
pagelist, I now also keep the pagelist in sorted order.
Thanks,
jaya
Signed-off-by: Jaya Kumar <jayakumar.lkml@gmail.com>
---
drivers/video/fb_defio.c | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
===================================================================
--- a/drivers/video/fb_defio.c
+++ b/drivers/video/fb_defio.c
@@ -74,6 +74,7 @@ static int fb_deferred_io_mkwrite(struct vm_area_struct *vma,
{
struct fb_info *info = vma->vm_private_data;
struct fb_deferred_io *fbdefio = info->fbdefio;
+ struct page *cur;
/* this is a callback we get when userspace first tries to
write to the page. we schedule a workqueue. that workqueue
@@ -83,7 +84,24 @@ static int fb_deferred_io_mkwrite(struct vm_area_struct *vma,
/* protect against the workqueue changing the page list */
mutex_lock(&fbdefio->lock);
- list_add(&page->lru, &fbdefio->pagelist);
+
+ /* we loop through the pagelist before adding in order
+ to keep the pagelist sorted */
+ list_for_each_entry(cur, &fbdefio->pagelist, lru) {
+ /* this check is to catch the case where a new
+ process could start writing to the same page
+ through a new pte. this new access can cause the
+ mkwrite even when the original ps's pte is marked
+ writable */
+ if (unlikely(cur == page))
+ goto page_already_added;
+ else if (cur->index > page->index)
+ break;
+ }
+
+ list_add_tail(&page->lru, &cur->lru);
+
+page_already_added:
mutex_unlock(&fbdefio->lock);
/* come back after delay to process the deferred IO */
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: "fb-defio: fix page list with concurrent processes"
2008-06-16 22:05 "fb-defio: fix page list with concurrent processes" Jeremy Fitzhardinge
@ 2008-06-17 1:11 ` Jaya Kumar
2008-06-17 7:34 ` Markus Armbruster
2008-07-03 21:10 ` Markus Armbruster
0 siblings, 2 replies; 9+ messages in thread
From: Jaya Kumar @ 2008-06-17 1:11 UTC (permalink / raw)
To: Jeremy Fitzhardinge; +Cc: Markus Armbruster, Linux Kernel Mailing List
On Mon, Jun 16, 2008 at 3:05 PM, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
> Your patch "fb-defio: fix page list with concurrent processes" definitely
> seems to help with the suspend/resume problem I had with the Xen pvfb
> device. Is it queued up anywhere? It seems to be a real bugfix, and should
> probably be queued for 2.6.26...
It isn't currently queued. I had intended to improve its performance
by taking advantage of Andrew's suggestion of using !list_empty on the
page->lru to avoid walking the page list to find the duplicate page,
but I ran into trouble since the page starts off being on the lru
list. I'll try to take a look at doing this next weekend.
Thanks,
jaya
>
> J
>
> fb-defio: fix page list with concurrent processes
>
> From: Jaya Kumar <jayakumar.lkml@gmail.com>
>
> Hi Tony, Geert, Andrew, fbdev,
>
> This patch is a bugfix for how defio handles multiple processes manipulating
> the same framebuffer. Thanks to Bernard Blackham for identifying this bug.
> It occurs when two applications mmap the same framebuffer and concurrently
> write to the same page. Normally, this doesn't occur since only a single
> process mmaps the framebuffer. The symptom of the bug is that the mapping
> applications will hang. The cause is that defio incorrectly tries to add the
> same page twice to the pagelist. The solution I have is to walk the pagelist
> and check for a duplicate before adding. Since I needed to walk the
> pagelist, I now also keep the pagelist in sorted order.
>
> Thanks,
> jaya
>
> Signed-off-by: Jaya Kumar <jayakumar.lkml@gmail.com>
>
> ---
> drivers/video/fb_defio.c | 20 +++++++++++++++++++-
> 1 file changed, 19 insertions(+), 1 deletion(-)
>
> ===================================================================
> --- a/drivers/video/fb_defio.c
> +++ b/drivers/video/fb_defio.c
> @@ -74,6 +74,7 @@ static int fb_deferred_io_mkwrite(struct vm_area_struct
> *vma,
> {
> struct fb_info *info = vma->vm_private_data;
> struct fb_deferred_io *fbdefio = info->fbdefio;
> + struct page *cur;
>
> /* this is a callback we get when userspace first tries to
> write to the page. we schedule a workqueue. that workqueue
> @@ -83,7 +84,24 @@ static int fb_deferred_io_mkwrite(struct vm_area_struct
> *vma,
>
> /* protect against the workqueue changing the page list */
> mutex_lock(&fbdefio->lock);
> - list_add(&page->lru, &fbdefio->pagelist);
> +
> + /* we loop through the pagelist before adding in order
> + to keep the pagelist sorted */
> + list_for_each_entry(cur, &fbdefio->pagelist, lru) {
> + /* this check is to catch the case where a new
> + process could start writing to the same page
> + through a new pte. this new access can cause the
> + mkwrite even when the original ps's pte is marked
> + writable */
> + if (unlikely(cur == page))
> + goto page_already_added;
> + else if (cur->index > page->index)
> + break;
> + }
> +
> + list_add_tail(&page->lru, &cur->lru);
> +
> +page_already_added:
> mutex_unlock(&fbdefio->lock);
>
> /* come back after delay to process the deferred IO */
>
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: "fb-defio: fix page list with concurrent processes"
2008-06-17 1:11 ` Jaya Kumar
@ 2008-06-17 7:34 ` Markus Armbruster
2008-06-17 8:21 ` Jaya Kumar
2008-07-03 21:10 ` Markus Armbruster
1 sibling, 1 reply; 9+ messages in thread
From: Markus Armbruster @ 2008-06-17 7:34 UTC (permalink / raw)
To: Jaya Kumar; +Cc: Jeremy Fitzhardinge, Linux Kernel Mailing List
"Jaya Kumar" <jayakumar.lkml@gmail.com> writes:
> On Mon, Jun 16, 2008 at 3:05 PM, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>> Your patch "fb-defio: fix page list with concurrent processes" definitely
>> seems to help with the suspend/resume problem I had with the Xen pvfb
>> device. Is it queued up anywhere? It seems to be a real bugfix, and should
>> probably be queued for 2.6.26...
>
> It isn't currently queued. I had intended to improve its performance
> by taking advantage of Andrew's suggestion of using !list_empty on the
> page->lru to avoid walking the page list to find the duplicate page,
> but I ran into trouble since the page starts off being on the lru
> list. I'll try to take a look at doing this next weekend.
>
> Thanks,
> jaya
Well, we got a bug that makes the code useless in practice for us, and
a fix for it that's not quite as fast as it could be. Which is
better, somewhat slow code, or somewhat useless code? I'd like to see
the fix merged as soon as possible. You can always improve its
performance later.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: "fb-defio: fix page list with concurrent processes"
2008-06-17 7:34 ` Markus Armbruster
@ 2008-06-17 8:21 ` Jaya Kumar
2008-06-17 9:31 ` Markus Armbruster
0 siblings, 1 reply; 9+ messages in thread
From: Jaya Kumar @ 2008-06-17 8:21 UTC (permalink / raw)
To: Markus Armbruster; +Cc: Jeremy Fitzhardinge, Linux Kernel Mailing List
On Tue, Jun 17, 2008 at 12:34 AM, Markus Armbruster <armbru@redhat.com> wrote:
> "Jaya Kumar" <jayakumar.lkml@gmail.com> writes:
>
>> On Mon, Jun 16, 2008 at 3:05 PM, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>>> Your patch "fb-defio: fix page list with concurrent processes" definitely
>>> seems to help with the suspend/resume problem I had with the Xen pvfb
>>> device. Is it queued up anywhere? It seems to be a real bugfix, and should
>>> probably be queued for 2.6.26...
>>
>> It isn't currently queued. I had intended to improve its performance
>> by taking advantage of Andrew's suggestion of using !list_empty on the
>> page->lru to avoid walking the page list to find the duplicate page,
>> but I ran into trouble since the page starts off being on the lru
>> list. I'll try to take a look at doing this next weekend.
>>
>> Thanks,
>> jaya
>
> Well, we got a bug that makes the code useless in practice for us, and
> a fix for it that's not quite as fast as it could be. Which is
> better, somewhat slow code, or somewhat useless code? I'd like to see
> the fix merged as soon as possible. You can always improve its
> performance later.
>
Ok, I didn't realize there was any time pressure. Keep in mind, I'm
just a person doing this stuff for fun on weekends not someone under
commercial pressures. Yup, I've got no problem if the old patch is
requeued and merged.
Thanks,
jaya
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: "fb-defio: fix page list with concurrent processes"
2008-06-17 8:21 ` Jaya Kumar
@ 2008-06-17 9:31 ` Markus Armbruster
0 siblings, 0 replies; 9+ messages in thread
From: Markus Armbruster @ 2008-06-17 9:31 UTC (permalink / raw)
To: Jaya Kumar; +Cc: Jeremy Fitzhardinge, Linux Kernel Mailing List
"Jaya Kumar" <jayakumar.lkml@gmail.com> writes:
> On Tue, Jun 17, 2008 at 12:34 AM, Markus Armbruster <armbru@redhat.com> wrote:
>> "Jaya Kumar" <jayakumar.lkml@gmail.com> writes:
>>
>>> On Mon, Jun 16, 2008 at 3:05 PM, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>>>> Your patch "fb-defio: fix page list with concurrent processes" definitely
>>>> seems to help with the suspend/resume problem I had with the Xen pvfb
>>>> device. Is it queued up anywhere? It seems to be a real bugfix, and should
>>>> probably be queued for 2.6.26...
>>>
>>> It isn't currently queued. I had intended to improve its performance
>>> by taking advantage of Andrew's suggestion of using !list_empty on the
>>> page->lru to avoid walking the page list to find the duplicate page,
>>> but I ran into trouble since the page starts off being on the lru
>>> list. I'll try to take a look at doing this next weekend.
>>>
>>> Thanks,
>>> jaya
>>
>> Well, we got a bug that makes the code useless in practice for us, and
>> a fix for it that's not quite as fast as it could be. Which is
>> better, somewhat slow code, or somewhat useless code? I'd like to see
>> the fix merged as soon as possible. You can always improve its
>> performance later.
>>
>
> Ok, I didn't realize there was any time pressure. Keep in mind, I'm
> just a person doing this stuff for fun on weekends not someone under
> commercial pressures. Yup, I've got no problem if the old patch is
> requeued and merged.
>
> Thanks,
> jaya
Hey, it's your own fault! If you wrote useless code in your spare
time, we wouldn't bother you ;->
Seriously, I appreciate your contributions, and I didn't mean to
pressure you. Just to explain why I think it makes sense to merge
your fix now, and performance improvements later.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: "fb-defio: fix page list with concurrent processes"
2008-06-17 1:11 ` Jaya Kumar
2008-06-17 7:34 ` Markus Armbruster
@ 2008-07-03 21:10 ` Markus Armbruster
2008-07-03 23:44 ` Jaya Kumar
1 sibling, 1 reply; 9+ messages in thread
From: Markus Armbruster @ 2008-07-03 21:10 UTC (permalink / raw)
To: Jaya Kumar; +Cc: Jeremy Fitzhardinge, Linux Kernel Mailing List
"Jaya Kumar" <jayakumar.lkml@gmail.com> writes:
> On Mon, Jun 16, 2008 at 3:05 PM, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>> Your patch "fb-defio: fix page list with concurrent processes" definitely
>> seems to help with the suspend/resume problem I had with the Xen pvfb
>> device. Is it queued up anywhere? It seems to be a real bugfix, and should
>> probably be queued for 2.6.26...
>
> It isn't currently queued. I had intended to improve its performance
> by taking advantage of Andrew's suggestion of using !list_empty on the
> page->lru to avoid walking the page list to find the duplicate page,
> but I ran into trouble since the page starts off being on the lru
> list. I'll try to take a look at doing this next weekend.
>
> Thanks,
> jaya
Jaya, any news?
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: "fb-defio: fix page list with concurrent processes"
2008-07-03 21:10 ` Markus Armbruster
@ 2008-07-03 23:44 ` Jaya Kumar
2008-07-07 20:43 ` Markus Armbruster
0 siblings, 1 reply; 9+ messages in thread
From: Jaya Kumar @ 2008-07-03 23:44 UTC (permalink / raw)
To: Markus Armbruster; +Cc: Jeremy Fitzhardinge, Linux Kernel Mailing List
On Fri, Jul 4, 2008 at 5:10 AM, Markus Armbruster <armbru@redhat.com> wrote:
>
> Jaya, any news?
>
Hi Markus,
In the thread, as per your point:
> better, somewhat slow code, or somewhat useless code? I'd like to see
> the fix merged as soon as possible. You can always improve its
> performance later.
I responded:
> Yup, I've got no problem if the old patch is requeued and merged.
I'd assumed that you would requeue that patch.
Thanks,
jaya
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: "fb-defio: fix page list with concurrent processes"
2008-07-03 23:44 ` Jaya Kumar
@ 2008-07-07 20:43 ` Markus Armbruster
2008-07-08 0:54 ` Jaya Kumar
0 siblings, 1 reply; 9+ messages in thread
From: Markus Armbruster @ 2008-07-07 20:43 UTC (permalink / raw)
To: Jaya Kumar; +Cc: Jeremy Fitzhardinge, Linux Kernel Mailing List
"Jaya Kumar" <jayakumar.lkml@gmail.com> writes:
> On Fri, Jul 4, 2008 at 5:10 AM, Markus Armbruster <armbru@redhat.com> wrote:
>>
>> Jaya, any news?
>>
>
> Hi Markus,
>
> In the thread, as per your point:
>
>> better, somewhat slow code, or somewhat useless code? I'd like to see
>> the fix merged as soon as possible. You can always improve its
>> performance later.
>
> I responded:
>
>> Yup, I've got no problem if the old patch is requeued and merged.
>
> I'd assumed that you would requeue that patch.
>
> Thanks,
> jaya
Unfortunately, I missed that assumption of yours %-}
Still want me to post it for you?
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: "fb-defio: fix page list with concurrent processes"
2008-07-07 20:43 ` Markus Armbruster
@ 2008-07-08 0:54 ` Jaya Kumar
0 siblings, 0 replies; 9+ messages in thread
From: Jaya Kumar @ 2008-07-08 0:54 UTC (permalink / raw)
To: Markus Armbruster; +Cc: Jeremy Fitzhardinge, Linux Kernel Mailing List
On Mon, Jul 7, 2008 at 4:43 PM, Markus Armbruster <armbru@redhat.com> wrote:
> Unfortunately, I missed that assumption of yours %-}
>
> Still want me to post it for you?
>
No worries, will post shortly. Sorry for the confusion.
Thanks,
jaya
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-07-08 0:54 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-06-16 22:05 "fb-defio: fix page list with concurrent processes" Jeremy Fitzhardinge
2008-06-17 1:11 ` Jaya Kumar
2008-06-17 7:34 ` Markus Armbruster
2008-06-17 8:21 ` Jaya Kumar
2008-06-17 9:31 ` Markus Armbruster
2008-07-03 21:10 ` Markus Armbruster
2008-07-03 23:44 ` Jaya Kumar
2008-07-07 20:43 ` Markus Armbruster
2008-07-08 0:54 ` Jaya Kumar
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.