All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
Cc: jayakumar.lkml@gmail.com, bernard@largestprime.net,
	linux-fbdev-devel@lists.sourceforge.net
Subject: Re: [PATCH 1/1 2.6.25] fbdev: bugfix for multiprocess defio
Date: Wed, 30 Apr 2008 13:37:59 -0700	[thread overview]
Message-ID: <20080430133759.e39bf34c.akpm@linux-foundation.org> (raw)
In-Reply-To: <20080428020140.8662.66707.sendpatchset@hit-nxdomain.opendns.com>

On Sun, 27 Apr 2008 22:01:40 -0400
Jaya Kumar <jayakumar.lkml@gmail.com> wrote:

> 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>
> 
> diff --git a/drivers/video/fb_defio.c b/drivers/video/fb_defio.c
> index 24843fd..59df132 100644
> --- 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);
>  

Did you consider using !list_empty(&page->lru) to avoid the linear search?

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

  reply	other threads:[~2008-04-30 20:38 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-28  2:01 [PATCH 1/1 2.6.25] fbdev: bugfix for multiprocess defio Jaya Kumar
2008-04-30 20:37 ` Andrew Morton [this message]
2008-05-05  7:23   ` Jaya Kumar
2008-07-08 12:50     ` Jaya Kumar
2008-07-08 21:40       ` Andrew Morton
  -- strict thread matches above, loose matches on Subject: below --
2008-07-09 13:43 Jaya Kumar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080430133759.e39bf34c.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=bernard@largestprime.net \
    --cc=jayakumar.lkml@gmail.com \
    --cc=linux-fbdev-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.