Commit b0e15190 authored by David Howells's avatar David Howells Committed by Linus Torvalds
Browse files

[PATCH] NOMMU: Make SYSV IPC SHM use ramfs facilities on NOMMU



The attached patch makes the SYSV IPC shared memory facilities use the new
ramfs facilities on a no-MMU kernel.

The following changes are made:

 (1) There are now shmem_mmap() and shmem_get_unmapped_area() functions to
     allow the IPC SHM facilities to commune with the tiny-shmem and shmem
     code.

 (2) ramfs files now need resizing using do_truncate() rather than by modifying
     the inode size directly (see shmem_file_setup()). This causes ramfs to
     attempt to bind a block of pages of sufficient size to the inode.

 (3) CONFIG_SYSVIPC is no longer contingent on CONFIG_MMU.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 642fb4d1
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -654,9 +654,18 @@ static inline struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,
}
#endif
struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags);
extern int shmem_mmap(struct file *file, struct vm_area_struct *vma);

int shmem_zero_setup(struct vm_area_struct *);

#ifndef CONFIG_MMU
extern unsigned long shmem_get_unmapped_area(struct file *file,
					     unsigned long addr,
					     unsigned long len,
					     unsigned long pgoff,
					     unsigned long flags);
#endif

static inline int can_do_mlock(void)
{
	if (capable(CAP_IPC_LOCK))
+0 −1
Original line number Diff line number Diff line
@@ -105,7 +105,6 @@ config SWAP

config SYSVIPC
	bool "System V IPC"
	depends on MMU
	---help---
	  Inter Process Communication is a suite of library functions and
	  system calls which let processes (running programs) synchronize and
+13 −5
Original line number Diff line number Diff line
@@ -157,14 +157,22 @@ static void shm_close (struct vm_area_struct *shmd)

static int shm_mmap(struct file * file, struct vm_area_struct * vma)
{
	file_accessed(file);
	int ret;

	ret = shmem_mmap(file, vma);
	if (ret == 0) {
		vma->vm_ops = &shm_vm_ops;
		shm_inc(file->f_dentry->d_inode->i_ino);
	return 0;
	}

	return ret;
}

static struct file_operations shm_file_operations = {
	.mmap	= shm_mmap
	.mmap	= shm_mmap,
#ifndef CONFIG_MMU
	.get_unmapped_area = shmem_get_unmapped_area,
#endif
};

static struct vm_operations_struct shm_vm_ops = {
+7 −0
Original line number Diff line number Diff line
@@ -1177,3 +1177,10 @@ int in_gate_area_no_task(unsigned long addr)
{
	return 0;
}

struct page *filemap_nopage(struct vm_area_struct *area,
			unsigned long address, int *type)
{
	BUG();
	return NULL;
}
+1 −1
Original line number Diff line number Diff line
@@ -1270,7 +1270,7 @@ out_nomem:
	return retval;
}

static int shmem_mmap(struct file *file, struct vm_area_struct *vma)
int shmem_mmap(struct file *file, struct vm_area_struct *vma)
{
	file_accessed(file);
	vma->vm_ops = &shmem_vm_ops;
Loading