lkml.org 
[lkml]   [2008]   [Jul]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Date
Subject[PATCH 06/06] uio: Support multiple UIO_MEM_LOGICAL/VIRTUAL pages
From: Magnus Damm <damm@igel.co.jp>

This patch improves the UIO_MEM_LOGICAL and UIO_MEM_VIRTUAL page
fault code to support more than one page of data. Memory allocated
from the slab is however not supported, so a check for that is added
and the documentation gets a little update.

Signed-off-by: Magnus Damm <damm@igel.co.jp>
---

Documentation/DocBook/uio-howto.tmpl | 2 +-
drivers/uio/uio.c | 10 ++++++++--
2 files changed, 9 insertions(+), 3 deletions(-)

--- 0001/Documentation/DocBook/uio-howto.tmpl
+++ work/Documentation/DocBook/uio-howto.tmpl 2008-07-18 12:45:22.000000000 +0900
@@ -376,7 +376,7 @@ Here's a description of the fields of <v
<varname>int memtype</varname>: Required if the mapping is used. Set this to
<varname>UIO_MEM_PHYS</varname> if you you have physical memory on your
card to be mapped. Use <varname>UIO_MEM_LOGICAL</varname> for logical
-memory (e.g. allocated with <function>kmalloc()</function>). There's also
+memory (e.g. allocated with <function>alloc_pages()</function>). There's also
<varname>UIO_MEM_VIRTUAL</varname> for virtual memory.
</para></listitem>

--- 0006/drivers/uio/uio.c
+++ work/drivers/uio/uio.c 2008-07-18 12:49:38.000000000 +0900
@@ -455,12 +455,15 @@ static void uio_vma_close(struct vm_area
static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
struct uio_mem *imem = vma->vm_private_data;
+ unsigned long vaddr = imem->addr;
struct page *page;

+ vaddr += (vmf->pgoff - vma->vm_pgoff) << PAGE_SHIFT;
+
if (imem->memtype == UIO_MEM_LOGICAL)
- page = virt_to_page(imem->addr);
+ page = virt_to_page(vaddr);
else
- page = vmalloc_to_page((void *)imem->addr);
+ page = vmalloc_to_page((void *)vaddr);
get_page(page);
vmf->page = page;
return 0;
@@ -521,6 +524,9 @@ static int uio_mmap(struct file *filep,
case UIO_MEM_PHYS:
return uio_mmap_physical(vma, imem);
case UIO_MEM_LOGICAL:
+ if (virt_to_page(imem->addr)->flags & (1 << PG_slab))
+ return -EINVAL; /* kmalloc() not supported */
+ /* fall-through */
case UIO_MEM_VIRTUAL:
return uio_mmap_logical(vma, imem);
default:

\
 
 \ /
  Last update: 2008-07-18 07:07    [W:0.084 / U:0.464 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site