summaryrefslogtreecommitdiffstats
path: root/ipc
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1997-06-01 03:16:17 +0000
committerRalf Baechle <ralf@linux-mips.org>1997-06-01 03:16:17 +0000
commitd8d9b8f76f22b7a16a83e261e64f89ee611f49df (patch)
tree3067bc130b80d52808e6390c9fc7fc087ec1e33c /ipc
parent19c9bba94152148523ba0f7ef7cffe3d45656b11 (diff)
Initial revision
Diffstat (limited to 'ipc')
-rw-r--r--ipc/msg.c3
-rw-r--r--ipc/sem.c3
-rw-r--r--ipc/shm.c48
-rw-r--r--ipc/util.c3
4 files changed, 20 insertions, 37 deletions
diff --git a/ipc/msg.c b/ipc/msg.c
index fcef8357f..49d8f043f 100644
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -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;
diff --git a/ipc/sem.c b/ipc/sem.c
index 8aecbfb48..f63f2a7a9 100644
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -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;
diff --git a/ipc/shm.c b/ipc/shm.c
index ab5974fed..d2afb7d2f 100644
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -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();