lkml.org 
[lkml]   [2006]   [Aug]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] NOMMU: Set BDI capabilities for /dev/mem and /dev/kmem
    Date
    From: David Howells <dhowells@redhat.com>

    Set the backing device info capabilities for /dev/mem and /dev/kmem to permit
    direct sharing under no-MMU conditions.

    Also comment the capabilities for /dev/zero.

    Signed-Off-By: David Howells <dhowells@redhat.com>
    ---

    drivers/char/mem.c | 42 ++++++++++++++++++++++++++++++++++++++++++
    1 files changed, 42 insertions(+), 0 deletions(-)

    diff --git a/drivers/char/mem.c b/drivers/char/mem.c
    index 917b204..4c29619 100644
    --- a/drivers/char/mem.c
    +++ b/drivers/char/mem.c
    @@ -238,6 +238,19 @@ #endif
    }
    #endif

    +#ifndef CONFIG_MMU
    +static unsigned long get_unmapped_area_mem(struct file *file,
    + unsigned long addr,
    + unsigned long len,
    + unsigned long pgoff,
    + unsigned long flags)
    +{
    + if (!valid_mmap_phys_addr_range(pgoff, len))
    + return (unsigned long) -EINVAL;
    + return pgoff;
    +}
    +#endif
    +
    static int mmap_mem(struct file * file, struct vm_area_struct * vma)
    {
    size_t size = vma->vm_end - vma->vm_start;
    @@ -245,6 +258,12 @@ static int mmap_mem(struct file * file,
    if (!valid_mmap_phys_addr_range(vma->vm_pgoff, size))
    return -EINVAL;

    +#ifndef CONFIG_MMU
    + /* can't do an in-place private mapping if there's no MMU */
    + if (!(vma->vm_flags & VM_MAYSHARE))
    + return -ENOSYS;
    +#endif
    +
    vma->vm_page_prot = phys_mem_access_prot(file, vma->vm_pgoff,
    size,
    vma->vm_page_prot);
    @@ -782,6 +801,9 @@ static const struct file_operations mem_
    .write = write_mem,
    .mmap = mmap_mem,
    .open = open_mem,
    +#ifndef CONFIG_MMU
    + .get_unmapped_area = get_unmapped_area_mem,
    +#endif
    };

    static const struct file_operations kmem_fops = {
    @@ -790,6 +812,9 @@ static const struct file_operations kmem
    .write = write_kmem,
    .mmap = mmap_kmem,
    .open = open_kmem,
    +#ifndef CONFIG_MMU
    + .get_unmapped_area = get_unmapped_area_mem,
    +#endif
    };

    static const struct file_operations null_fops = {
    @@ -815,10 +840,25 @@ static const struct file_operations zero
    .mmap = mmap_zero,
    };

    +/*
    + * capabilities for /dev/zero
    + * - permits private mappings, "copies" are taken of the source of zeros
    + */
    static struct backing_dev_info zero_bdi = {
    .capabilities = BDI_CAP_MAP_COPY,
    };

    +/*
    + * capabilities for /dev/mem and /dev/kmem
    + * - permits shared mmap for read, write and/or exec
    + * - does not permit private mmap (add BDI_CAP_MAP_COPY to permit this)
    + */
    +static struct backing_dev_info mem_bdi = {
    + .capabilities = (BDI_CAP_MAP_DIRECT |
    + BDI_CAP_READ_MAP | BDI_CAP_WRITE_MAP |
    + BDI_CAP_EXEC_MAP),
    +};
    +
    static const struct file_operations full_fops = {
    .llseek = full_lseek,
    .read = read_full,
    @@ -861,9 +901,11 @@ static int memory_open(struct inode * in
    {
    switch (iminor(inode)) {
    case 1:
    + filp->f_mapping->backing_dev_info = &mem_bdi;
    filp->f_op = &mem_fops;
    break;
    case 2:
    + filp->f_mapping->backing_dev_info = &mem_bdi;
    filp->f_op = &kmem_fops;
    break;
    case 3:
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2006-08-29 20:03    [W:0.052 / U:30.148 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site