[lkml]   [2008]   [Jul]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[patch 38/47] fbdev: bugfix for multiprocess defio
    2.6.25-stable review patch.  If anyone has any objections, please let us

    From: Jaya Kumar <>

    commit f31ad92f34913043cf008d6e479e92dfbaf02df1 upstream

    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.

    Signed-off-by: Jaya Kumar <>
    Cc: Bernard Blackham <>
    Signed-off-by: Andrew Morton <>
    Signed-off-by: Linus Torvalds <>
    Signed-off-by: Greg Kroah-Hartman <>

    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
    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

    /* protect against the workqueue changing the page list */
    - 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);

    /* come back after delay to process the deferred IO */

     \ /
      Last update: 2008-07-23 01:33    [W:0.026 / U:2.772 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site