diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1997-06-01 03:16:17 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1997-06-01 03:16:17 +0000 |
commit | d8d9b8f76f22b7a16a83e261e64f89ee611f49df (patch) | |
tree | 3067bc130b80d52808e6390c9fc7fc087ec1e33c /ipc | |
parent | 19c9bba94152148523ba0f7ef7cffe3d45656b11 (diff) |
Initial revision
Diffstat (limited to 'ipc')
-rw-r--r-- | ipc/msg.c | 3 | ||||
-rw-r--r-- | ipc/sem.c | 3 | ||||
-rw-r--r-- | ipc/shm.c | 48 | ||||
-rw-r--r-- | ipc/util.c | 3 |
4 files changed, 20 insertions, 37 deletions
@@ -17,6 +17,7 @@ #include <linux/interrupt.h> #include <linux/smp.h> #include <linux/smp_lock.h> +#include <linux/init.h> #include <asm/uaccess.h> @@ -39,7 +40,7 @@ static int kerneld_msqid = -1; static int kerneld_arr[MAX_KERNELDS]; static int n_kernelds = 0; -void msg_init (void) +__initfunc(void msg_init (void)) { int id; @@ -40,6 +40,7 @@ #include <linux/malloc.h> #include <linux/smp.h> #include <linux/smp_lock.h> +#include <linux/init.h> #include <asm/uaccess.h> @@ -55,7 +56,7 @@ static int max_semid = 0; static unsigned short sem_seq = 0; -void sem_init (void) +__initfunc(void sem_init (void)) { int i; @@ -16,6 +16,7 @@ #include <linux/swap.h> #include <linux/smp.h> #include <linux/smp_lock.h> +#include <linux/init.h> #include <asm/uaccess.h> #include <asm/pgtable.h> @@ -44,7 +45,7 @@ static ulong swap_attempts = 0; static ulong swap_successes = 0; static ulong used_segs = 0; -void shm_init (void) +__initfunc(void shm_init (void)) { int id; @@ -402,42 +403,21 @@ static struct vm_operations_struct shm_vm_ops = { shm_swap_in /* swapin */ }; -/* Insert shmd into the circular list shp->attaches */ +/* Insert shmd into the list shp->attaches */ static inline void insert_attach (struct shmid_ds * shp, struct vm_area_struct * shmd) { - struct vm_area_struct * attaches; - - if ((attaches = shp->attaches)) { - shmd->vm_next_share = attaches; - shmd->vm_prev_share = attaches->vm_prev_share; - shmd->vm_prev_share->vm_next_share = shmd; - attaches->vm_prev_share = shmd; - } else - shp->attaches = shmd->vm_next_share = shmd->vm_prev_share = shmd; + if((shmd->vm_next_share = shp->attaches) != NULL) + shp->attaches->vm_pprev_share = &shmd->vm_next_share; + shp->attaches = shmd; + shmd->vm_pprev_share = &shp->attaches; } -/* Remove shmd from circular list shp->attaches */ +/* Remove shmd from list shp->attaches */ static inline void remove_attach (struct shmid_ds * shp, struct vm_area_struct * shmd) { - if (shmd->vm_next_share == shmd) { - if (shp->attaches != shmd) { - printk("shm_close: shm segment (id=%ld) attach list inconsistent\n", - SWP_OFFSET(shmd->vm_pte) & SHM_ID_MASK); - printk("shm_close: %08lx-%08lx %c%c%c%c %08lx %08lx\n", - shmd->vm_start, shmd->vm_end, - shmd->vm_flags & VM_READ ? 'r' : '-', - shmd->vm_flags & VM_WRITE ? 'w' : '-', - shmd->vm_flags & VM_EXEC ? 'x' : '-', - shmd->vm_flags & VM_MAYSHARE ? 's' : 'p', - shmd->vm_offset, shmd->vm_pte); - } - shp->attaches = NULL; - } else { - if (shp->attaches == shmd) - shp->attaches = shmd->vm_next_share; - shmd->vm_prev_share->vm_next_share = shmd->vm_next_share; - shmd->vm_next_share->vm_prev_share = shmd->vm_prev_share; - } + if(shmd->vm_next_share) + shmd->vm_next_share->vm_pprev_share = shmd->vm_pprev_share; + *shmd->vm_pprev_share = shmd->vm_next_share; } /* @@ -575,7 +555,6 @@ asmlinkage int sys_shmat (int shmid, char *shmaddr, int shmflg, ulong *raddr) shmd->vm_flags = VM_SHM | VM_MAYSHARE | VM_SHARED | VM_MAYREAD | VM_MAYEXEC | VM_READ | VM_EXEC | ((shmflg & SHM_RDONLY) ? 0 : VM_MAYWRITE | VM_WRITE); - shmd->vm_next_share = shmd->vm_prev_share = NULL; shmd->vm_inode = NULL; shmd->vm_offset = 0; shmd->vm_ops = &shm_vm_ops; @@ -825,9 +804,10 @@ int shm_swap (int prio, int dma) if (shmd->vm_mm->rss > 0) shmd->vm_mm->rss--; flush_tlb_page(shmd, tmp); - /* continue looping through circular list */ + /* continue looping through the linked list */ } while (0); - if ((shmd = shmd->vm_next_share) == shp->attaches) + shmd = shmd->vm_next_share; + if (!shmd) break; } diff --git a/ipc/util.c b/ipc/util.c index e81afc36f..88e63c6fc 100644 --- a/ipc/util.c +++ b/ipc/util.c @@ -11,6 +11,7 @@ #include <linux/msg.h> #include <linux/shm.h> #include <linux/stat.h> +#include <linux/init.h> #include <asm/uaccess.h> @@ -18,7 +19,7 @@ extern void sem_init (void), msg_init (void), shm_init (void); -void ipc_init (void) +__initfunc(void ipc_init (void)) { sem_init(); msg_init(); |