The patch titled NOMMU: Set BDI capabilities for /dev/mem and /dev/kmem has been added to the -mm tree. Its filename is nommu-set-bdi-capabilities-for-dev-mem-and-dev-kmem.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: NOMMU: Set BDI capabilities for /dev/mem and /dev/kmem From: David Howells <dhowells@xxxxxxxxxx> Set the backing device info capabilities for /dev/mem and /dev/kmem to permit direct sharing under no-MMU conditions and full mapping capabilities under MMU conditions. Make the BDI used by these available to all directly mappable character devices. Also comment the capabilities for /dev/zero. Signed-off-by: David Howells <dhowells@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- drivers/char/mem.c | 33 +++++++++++++++++++++++++++++++++ fs/char_dev.c | 20 ++++++++++++++++++++ include/linux/cdev.h | 2 ++ 3 files changed, 55 insertions(+) diff -puN drivers/char/mem.c~nommu-set-bdi-capabilities-for-dev-mem-and-dev-kmem drivers/char/mem.c --- a/drivers/char/mem.c~nommu-set-bdi-capabilities-for-dev-mem-and-dev-kmem +++ a/drivers/char/mem.c @@ -238,6 +238,19 @@ static pgprot_t phys_mem_access_prot(str } #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,6 +840,10 @@ 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, }; @@ -862,9 +891,13 @@ static int memory_open(struct inode * in switch (iminor(inode)) { case 1: filp->f_op = &mem_fops; + filp->f_mapping->backing_dev_info = + &directly_mappable_cdev_bdi; break; case 2: filp->f_op = &kmem_fops; + filp->f_mapping->backing_dev_info = + &directly_mappable_cdev_bdi; break; case 3: filp->f_op = &null_fops; diff -puN fs/char_dev.c~nommu-set-bdi-capabilities-for-dev-mem-and-dev-kmem fs/char_dev.c --- a/fs/char_dev.c~nommu-set-bdi-capabilities-for-dev-mem-and-dev-kmem +++ a/fs/char_dev.c @@ -19,11 +19,30 @@ #include <linux/kobj_map.h> #include <linux/cdev.h> #include <linux/mutex.h> +#include <linux/backing-dev.h> #ifdef CONFIG_KMOD #include <linux/kmod.h> #endif +/* + * capabilities for /dev/mem, /dev/kmem and similar directly mappable character + * devices + * - permits shared-mmap for read, write and/or exec + * - does not permit private mmap in NOMMU mode (can't do COW) + * - no readahead or I/O queue unplugging required + */ +struct backing_dev_info directly_mappable_cdev_bdi = { + .capabilities = ( +#ifdef CONFIG_MMU + /* permit private copies of the data to be taken */ + BDI_CAP_MAP_COPY | +#endif + /* permit direct mmap, for read, write or exec */ + BDI_CAP_MAP_DIRECT | + BDI_CAP_READ_MAP | BDI_CAP_WRITE_MAP | BDI_CAP_EXEC_MAP), +}; + static struct kobj_map *cdev_map; static DEFINE_MUTEX(chrdevs_lock); @@ -538,3 +557,4 @@ EXPORT_SYMBOL(cdev_del); EXPORT_SYMBOL(cdev_add); EXPORT_SYMBOL(register_chrdev); EXPORT_SYMBOL(unregister_chrdev); +EXPORT_SYMBOL(directly_mappable_cdev_bdi); diff -puN include/linux/cdev.h~nommu-set-bdi-capabilities-for-dev-mem-and-dev-kmem include/linux/cdev.h --- a/include/linux/cdev.h~nommu-set-bdi-capabilities-for-dev-mem-and-dev-kmem +++ a/include/linux/cdev.h @@ -23,5 +23,7 @@ void cdev_del(struct cdev *); void cd_forget(struct inode *); +extern struct backing_dev_info directly_mappable_cdev_bdi; + #endif #endif _ Patches currently in -mm which might be from dhowells@xxxxxxxxxx are git-gfs2.patch git-nfs.patch nfs-replace-null-dentries-that-appear-in-readdirs-list-2.patch binfmt_elf-consistently-use-loff_t.patch afs-add-lock-annotations-to-afs_proc_cell_servers_startstop.patch elf_fdpic_core_dump-dont-take-tasklist_lock.patch simplify-update_times-avoid-jiffies-jiffies_64-aliasing-problem-2.patch lib-rwsemc-un-inline-rwsem_down_failed_common.patch nommu-check-that-access_process_vm-has-a-valid-target.patch nommu-set-bdi-capabilities-for-dev-mem-and-dev-kmem.patch nommu-set-bdi-capabilities-for-dev-mem-and-dev-kmem-tidy.patch reiserfs-make-sure-all-dentries-refs-are-released-before-calling-kill_block_super-try-2.patch fs-cache-provide-a-filesystem-specific-syncable-page-bit.patch fs-cache-generic-filesystem-caching-facility.patch fs-cache-release-page-private-in-failed-readahead.patch fs-cache-release-page-private-after-failed-readahead-12.patch fs-cache-make-kafs-use-fs-cache.patch fs-cache-make-kafs-use-fs-cache-fix.patch fs-cache-make-kafs-use-fs-cache-12.patch fs-cache-make-kafs-use-fs-cache-12-fix.patch fs-cache-make-kafs-use-fs-cache-vs-streamline-generic_file_-interfaces-and-filemap.patch nfs-use-local-caching.patch nfs-use-local-caching-12.patch nfs-use-local-caching-12-fix.patch fs-cache-cachefiles-ia64-missing-copy_page-export.patch fs-cache-cachefiles-a-cache-that-backs-onto-a-mounted-filesystem.patch fs-cache-cachefiles-a-cache-that-backs-onto-a-mounted-filesystem-cachefiles-printk-format-warning.patch fs-cache-cachefiles-a-cache-that-backs-onto-a-mounted-filesystem-warning-fixes.patch autofs-make-sure-all-dentries-refs-are-released-before-calling-kill_anon_super.patch vfs-destroy-the-dentries-contributed-by-a-superblock-on-unmounting.patch vfs-make-filldir_t-and-struct-kstat-deal-in-64-bit-inode-numbers.patch vfs-make-filldir_t-and-struct-kstat-deal-in-64-bit-inode-numbers-alpha-fix.patch nfs-represent-64-bit-fileids-as-64-bit-inode-numbers-on-32-bit-systems.patch ecryptfs-get_sb_dev-fix.patch block-move-functions-out-of-buffer-code.patch block-remove-duplicate-declaration-of-exit_io_context.patch block-stop-fallback_migrate_page-from-using-page_has_buffers.patch block-separate-the-bounce-buffering-code-from-the-highmem-code.patch block-dont-call-block_sync_page-from-afs.patch block-move-extern-declarations-out-of-fs-c-into-header-files.patch block-move-extern-declarations-out-of-fs-c-into-header-files-tidy.patch block-remove-dependence-on-existence-of-blockdev_superblock.patch block-remove-dependence-on-existence-of-blockdev_superblock-tidy.patch block-dissociate-generic_writepages-from-mpage-stuff.patch block-move-__invalidate_device-to-block_devc.patch block-move-the-loop-device-ioctl-compat-stuff-to-the-loop-driver.patch block-move-common-fs-specific-ioctls-to-linux-fsh.patch block-move-the-reiserfs-device-ioctl-compat-stuff-to-the-reiserfs-driver.patch block-move-the-ext2-device-ioctl-compat-stuff-to-the-ext2-driver.patch block-move-the-ext3-device-ioctl-compat-stuff-to-the-ext3-driver.patch block-move-the-msdos-device-ioctl-compat-stuff-to-the-msdos-driver.patch block-remove-no-longer-necessary-linux-mpageh-inclusions.patch block-remove-no-longer-necessary-linux-buffer_headh-inclusions.patch block-make-usb-storage-depend-on-scsi-rather-than-selecting-it.patch block-make-it-possible-to-disable-the-block-layer.patch block-make-it-possible-to-disable-the-block-layer-tidy.patch block-make-it-possible-to-disable-the-block-layer-tidy-fix.patch reiser4-get_sb_dev-fix.patch mutex-subsystem-synchro-test-module.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html