Thread (14 messages) 14 messages, 5 authors, 2009-06-26

Re: [PATCH] video: arch specific page protection support for deferred io

From: Magnus Damm <magnus.damm@gmail.com>
Date: 2009-06-25 06:06:16
Also in: linux-mm

On Thu, Jun 25, 2009 at 11:56 AM, Andrew
Morton[off-list ref] wrote:
On Wed, 24 Jun 2009 19:54:13 +0900 Magnus Damm [off-list ref] wrote:
quoted
From: Magnus Damm <redacted>

This patch adds arch specific page protection support to deferred io.

Instead of overwriting the info->fbops->mmap pointer with the
deferred io specific mmap callback, modify fb_mmap() to include
a #ifdef wrapped call to fb_deferred_io_mmap().  The function
fb_deferred_io_mmap() is extended to call fb_pgprotect() in the
case of non-vmalloc() frame buffers.

With this patch uncached deferred io can be used together with
the sh_mobile_lcdcfb driver. Without this patch arch specific
page protection code in fb_pgprotect() never gets invoked with
deferred io.

Signed-off-by: Magnus Damm <redacted>
---

 For proper runtime operation with uncached vmas make sure
 "[PATCH][RFC] mm: uncached vma support with writenotify"
 is applied. There are no merge order dependencies.
So this is dependent upon a patch which is in your tree, which is in
linux-next?
I tried to say that there were _no_ dependencies merge wise. =)

There are 3 levels of dependencies:
1: pgprot_noncached() patches from Arnd
2: mm: uncached vma support with writenotify
3: video: arch specfic page protection support for deferred io

2 depends on 1 to compile, but 3 (this one) is disconnected from 2 and
1. So this patch can be merged independently.
quoted
 drivers/video/fb_defio.c |   10 +++++++---
 drivers/video/fbmem.c    |    6 ++++++
 include/linux/fb.h       |    2 ++
 3 files changed, 15 insertions(+), 3 deletions(-)
--- 0001/drivers/video/fb_defio.c
+++ work/drivers/video/fb_defio.c     2009-06-24 19:07:11.000000000 +0900
@@ -19,6 +19,7 @@
 #include <linux/interrupt.h>
 #include <linux/fb.h>
 #include <linux/list.h>
+#include <asm/fb.h>
Microblaze doesn't have an asm/fb.h.
Right, but fbmem.c includes asm/fb.h as well (for fb_pgprotect()), so
framebuffer isn't supported on Microblaze. So I think this is a
separate issue.
quoted
 /* to support deferred IO */
 #include <linux/rmap.h>
@@ -141,11 +142,16 @@ static const struct address_space_operat
      .set_page_dirty = fb_deferred_io_set_page_dirty,
 };

-static int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma)
+int fb_deferred_io_mmap(struct file *file, struct fb_info *info,
+                     struct vm_area_struct *vma, unsigned long off)
 {
      vma->vm_ops = &fb_deferred_io_vm_ops;
      vma->vm_flags |= ( VM_IO | VM_RESERVED | VM_DONTEXPAND );
      vma->vm_private_data = info;
+
+     if (!is_vmalloc_addr(info->screen_base))
+             fb_pgprotect(file, vma, off);
Add a comment explaining what's going on here?
Good idea!
quoted
@@ -1325,6 +1325,12 @@ __releases(&info->lock)
      off = vma->vm_pgoff << PAGE_SHIFT;
      if (!fb)
              return -ENODEV;
+
+#ifdef CONFIG_FB_DEFERRED_IO
+     if (info->fbdefio)
+             return fb_deferred_io_mmap(file, info, vma, off);
+#endif
We can remove the ifdefs here...
quoted
+extern int fb_deferred_io_mmap(struct file *file, struct fb_info *info,
+                            struct vm_area_struct *vma, unsigned long off);
if we do

#else   /* CONFIG_FB_DEFERRED_IO */
static inline int fb_deferred_io_mmap(struct file *file, struct fb_info *info,
                               struct vm_area_struct *vma, unsigned long off)
{
       return 0;
}
#endif  /* CONFIG_FB_DEFERRED_IO */

here.
The code is fbmem.c is currently filled with #ifdefs today, want me
create inline versions for fb_deferred_io_open() and
fb_deferred_io_fsync() as well?

Thanks for your comments!

/ magnus

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help