Skip to content

Commit

Permalink
[PATCH] NOMMU: Make SYSV IPC SHM use ramfs facilities on NOMMU
Browse files Browse the repository at this point in the history
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: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
dhowells authored and Linus Torvalds committed Jan 6, 2006
1 parent 642fb4d commit b0e1519
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 8 deletions.
9 changes: 9 additions & 0 deletions include/linux/mm.h
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
1 change: 0 additions & 1 deletion init/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 13 additions & 5 deletions ipc/shm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
vma->vm_ops = &shm_vm_ops;
shm_inc(file->f_dentry->d_inode->i_ino);
return 0;
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 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 = {
Expand Down
7 changes: 7 additions & 0 deletions mm/nommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
2 changes: 1 addition & 1 deletion mm/shmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -1270,7 +1270,7 @@ int shmem_lock(struct file *file, int lock, struct user_struct *user)
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;
Expand Down
29 changes: 28 additions & 1 deletion mm/tiny-shmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,19 @@ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags)
goto close_file;

d_instantiate(dentry, inode);
inode->i_size = size;
inode->i_nlink = 0; /* It is unlinked */

file->f_vfsmnt = mntget(shm_mnt);
file->f_dentry = dentry;
file->f_mapping = inode->i_mapping;
file->f_op = &ramfs_file_operations;
file->f_mode = FMODE_WRITE | FMODE_READ;

/* notify everyone as to the change of file size */
error = do_truncate(dentry, size, file);
if (error < 0)
goto close_file;

return file;

close_file:
Expand Down Expand Up @@ -123,3 +129,24 @@ int shmem_unuse(swp_entry_t entry, struct page *page)
{
return 0;
}

int shmem_mmap(struct file *file, struct vm_area_struct *vma)
{
file_accessed(file);
#ifndef CONFIG_MMU
return ramfs_nommu_mmap(file, vma);
#else
return 0;
#endif
}

#ifndef CONFIG_MMU
unsigned long shmem_get_unmapped_area(struct file *file,
unsigned long addr,
unsigned long len,
unsigned long pgoff,
unsigned long flags)
{
return ramfs_nommu_get_unmapped_area(file, addr, len, pgoff, flags);
}
#endif

0 comments on commit b0e1519

Please sign in to comment.