All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Hansen <haveblue@us.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: serue@us.ibm.com, frankeh@watson.ibm.com, clg@fr.ibm.com,
	Herbert Poetzl <herbert@13thfloor.at>,
	Sam Vilain <sam@vilain.net>, Dave Hansen <haveblue@us.ibm.com>
Subject: [RFC][PATCH 4/6] sysvsem: containerize
Date: Mon, 06 Mar 2006 15:52:51 -0800	[thread overview]
Message-ID: <20060306235251.04FABF95@localhost.localdomain> (raw)
In-Reply-To: <20060306235248.20842700@localhost.localdomain>


Same thing as the msgs.  

Take all of the global sysv sem context and put it inside of
a special structure.  This allows future work to give different
containers completely different views into the sysv space.

Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
---

 work-dave/ipc/sem.c  |  194 ++++++++++++++++++++++++++-------------------------
 work-dave/ipc/util.c |    2 
 work-dave/ipc/util.h |   15 ++-
 3 files changed, 114 insertions(+), 97 deletions(-)

diff -puN ipc/sem.c~sysvsem-container ipc/sem.c
--- work/ipc/sem.c~sysvsem-container	2006-03-06 15:41:58.000000000 -0800
+++ work-dave/ipc/sem.c	2006-03-06 15:41:58.000000000 -0800
@@ -79,17 +79,19 @@
 #include "util.h"
 
 
-#define sem_lock(id)	((struct sem_array*)ipc_lock(&sem_ids,id))
-#define sem_unlock(sma)	ipc_unlock(&(sma)->sem_perm)
-#define sem_rmid(id)	((struct sem_array*)ipc_rmid(&sem_ids,id))
-#define sem_checkid(sma, semid)	\
-	ipc_checkid(&sem_ids,&sma->sem_perm,semid)
-#define sem_buildid(id, seq) \
-	ipc_buildid(&sem_ids, id, seq)
-static struct ipc_ids sem_ids;
+#define sem_lock(context, id)		\
+	((struct sem_array*)ipc_lock(&context->ids,id))
+#define sem_unlock(context, sma)	\
+	ipc_unlock(&(sma)->sem_perm)
+#define sem_rmid(context, id)		\
+	((struct sem_array*)ipc_rmid(&context->ids,id))
+#define sem_checkid(context, sma, semid)	\
+	ipc_checkid(&context->ids,&sma->sem_perm,semid)
+#define sem_buildid(context, id, seq) \
+	ipc_buildid(&context->ids, id, seq)
 
-static int newary (key_t, int, int);
-static void freeary (struct sem_array *sma, int id);
+static int newary (struct ipc_sem_context *, key_t, int, int);
+static void freeary (struct ipc_sem_context *, struct sem_array *, int);
 #ifdef CONFIG_PROC_FS
 static int sysvipc_sem_proc_show(struct seq_file *s, void *it);
 #endif
@@ -112,15 +114,12 @@ int sem_ctls[4] = {SEMMSL, SEMMNS, SEMOP
 #define sc_semopm	(sem_ctls[2])
 #define sc_semmni	(sem_ctls[3])
 
-static int used_sems;
-
-void __init sem_init (void)
+void __init sem_init (struct ipc_sem_context *context)
 {
-	used_sems = 0;
-	ipc_init_ids(&sem_ids,sc_semmni);
+	ipc_init_ids(&context->ids,sc_semmni);
 	ipc_init_proc_interface("sysvipc/sem",
 				"       key      semid perms      nsems   uid   gid  cuid  cgid      otime      ctime\n",
-				&sem_ids,
+				&context->ids,
 				sysvipc_sem_proc_show);
 }
 
@@ -158,7 +157,8 @@ void __init sem_init (void)
  */
 #define IN_WAKEUP	1
 
-static int newary (key_t key, int nsems, int semflg)
+static int newary (struct ipc_sem_context *context,
+		   key_t key, int nsems, int semflg)
 {
 	int id;
 	int retval;
@@ -167,7 +167,7 @@ static int newary (key_t key, int nsems,
 
 	if (!nsems)
 		return -EINVAL;
-	if (used_sems + nsems > sc_semmns)
+	if (context->nr_used + nsems > sc_semmns)
 		return -ENOSPC;
 
 	size = sizeof (*sma) + nsems * sizeof (struct sem);
@@ -187,22 +187,22 @@ static int newary (key_t key, int nsems,
 		return retval;
 	}
 
-	id = ipc_addid(&sem_ids, &sma->sem_perm, sc_semmni);
+	id = ipc_addid(&context->ids, &sma->sem_perm, sc_semmni);
 	if(id == -1) {
 		security_sem_free(sma);
 		ipc_rcu_putref(sma);
 		return -ENOSPC;
 	}
-	used_sems += nsems;
+	context->nr_used += nsems;
 
-	sma->sem_id = sem_buildid(id, sma->sem_perm.seq);
+	sma->sem_id = sem_buildid(context, id, sma->sem_perm.seq);
 	sma->sem_base = (struct sem *) &sma[1];
 	/* sma->sem_pending = NULL; */
 	sma->sem_pending_last = &sma->sem_pending;
 	/* sma->undo = NULL; */
 	sma->sem_nsems = nsems;
 	sma->sem_ctime = get_seconds();
-	sem_unlock(sma);
+	sem_unlock(context, sma);
 
 	return sma->sem_id;
 }
@@ -211,22 +211,23 @@ asmlinkage long sys_semget (key_t key, i
 {
 	int id, err = -EINVAL;
 	struct sem_array *sma;
+	struct ipc_sem_context *context = &current->ipc_context->sem;
 
 	if (nsems < 0 || nsems > sc_semmsl)
 		return -EINVAL;
-	down(&sem_ids.sem);
+	down(&context->ids.sem);
 	
 	if (key == IPC_PRIVATE) {
-		err = newary(key, nsems, semflg);
-	} else if ((id = ipc_findkey(&sem_ids, key)) == -1) {  /* key not used */
+		err = newary(context, key, nsems, semflg);
+	} else if ((id = ipc_findkey(&context->ids, key)) == -1) {  /* key not used */
 		if (!(semflg & IPC_CREAT))
 			err = -ENOENT;
 		else
-			err = newary(key, nsems, semflg);
+			err = newary(context, key, nsems, semflg);
 	} else if (semflg & IPC_CREAT && semflg & IPC_EXCL) {
 		err = -EEXIST;
 	} else {
-		sma = sem_lock(id);
+		sma = sem_lock(context, id);
 		if(sma==NULL)
 			BUG();
 		if (nsems > sma->sem_nsems)
@@ -234,15 +235,15 @@ asmlinkage long sys_semget (key_t key, i
 		else if (ipcperms(&sma->sem_perm, semflg))
 			err = -EACCES;
 		else {
-			int semid = sem_buildid(id, sma->sem_perm.seq);
+			int semid = sem_buildid(context, id, sma->sem_perm.seq);
 			err = security_sem_associate(sma, semflg);
 			if (!err)
 				err = semid;
 		}
-		sem_unlock(sma);
+		sem_unlock(context, sma);
 	}
 
-	up(&sem_ids.sem);
+	up(&context->ids.sem);
 	return err;
 }
 
@@ -437,11 +438,12 @@ static int count_semzcnt (struct sem_arr
 	return semzcnt;
 }
 
-/* Free a semaphore set. freeary() is called with sem_ids.sem down and
- * the spinlock for this semaphore set hold. sem_ids.sem remains locked
+/* Free a semaphore set. freeary() is called with context->ids.sem down and
+ * the spinlock for this semaphore set hold. context->ids.sem remains locked
  * on exit.
  */
-static void freeary (struct sem_array *sma, int id)
+static void freeary (struct ipc_sem_context *context,
+		     struct sem_array *sma, int id)
 {
 	struct sem_undo *un;
 	struct sem_queue *q;
@@ -469,10 +471,10 @@ static void freeary (struct sem_array *s
 	}
 
 	/* Remove the semaphore set from the ID array*/
-	sma = sem_rmid(id);
-	sem_unlock(sma);
+	sma = sem_rmid(context, id);
+	sem_unlock(context, sma);
 
-	used_sems -= sma->sem_nsems;
+	context->nr_used -= sma->sem_nsems;
 	size = sizeof (*sma) + sma->sem_nsems * sizeof (struct sem);
 	security_sem_free(sma);
 	ipc_rcu_putref(sma);
@@ -500,7 +502,8 @@ static unsigned long copy_semid_to_user(
 	}
 }
 
-static int semctl_nolock(int semid, int semnum, int cmd, int version, union semun arg)
+static int semctl_nolock(struct ipc_sem_context *context,
+		         int semid, int semnum, int cmd, int version, union semun arg)
 {
 	int err = -EINVAL;
 	struct sem_array *sma;
@@ -525,16 +528,16 @@ static int semctl_nolock(int semid, int 
 		seminfo.semmnu = SEMMNU;
 		seminfo.semmap = SEMMAP;
 		seminfo.semume = SEMUME;
-		down(&sem_ids.sem);
+		down(&context->ids.sem);
 		if (cmd == SEM_INFO) {
-			seminfo.semusz = sem_ids.in_use;
-			seminfo.semaem = used_sems;
+			seminfo.semusz = context->ids.in_use;
+			seminfo.semaem = context->nr_used;
 		} else {
 			seminfo.semusz = SEMUSZ;
 			seminfo.semaem = SEMAEM;
 		}
-		max_id = sem_ids.max_id;
-		up(&sem_ids.sem);
+		max_id = context->ids.max_id;
+		up(&context->ids.sem);
 		if (copy_to_user (arg.__buf, &seminfo, sizeof(struct seminfo))) 
 			return -EFAULT;
 		return (max_id < 0) ? 0: max_id;
@@ -544,12 +547,12 @@ static int semctl_nolock(int semid, int 
 		struct semid64_ds tbuf;
 		int id;
 
-		if(semid >= sem_ids.entries->size)
+		if(semid >= context->ids.entries->size)
 			return -EINVAL;
 
 		memset(&tbuf,0,sizeof(tbuf));
 
-		sma = sem_lock(semid);
+		sma = sem_lock(context, semid);
 		if(sma == NULL)
 			return -EINVAL;
 
@@ -561,13 +564,13 @@ static int semctl_nolock(int semid, int 
 		if (err)
 			goto out_unlock;
 
-		id = sem_buildid(semid, sma->sem_perm.seq);
+		id = sem_buildid(context, semid, sma->sem_perm.seq);
 
 		kernel_to_ipc64_perm(&sma->sem_perm, &tbuf.sem_perm);
 		tbuf.sem_otime  = sma->sem_otime;
 		tbuf.sem_ctime  = sma->sem_ctime;
 		tbuf.sem_nsems  = sma->sem_nsems;
-		sem_unlock(sma);
+		sem_unlock(context, sma);
 		if (copy_semid_to_user (arg.buf, &tbuf, version))
 			return -EFAULT;
 		return id;
@@ -577,11 +580,13 @@ static int semctl_nolock(int semid, int 
 	}
 	return err;
 out_unlock:
-	sem_unlock(sma);
+	sem_unlock(context, sma);
 	return err;
 }
 
-static int semctl_main(int semid, int semnum, int cmd, int version, union semun arg)
+static int semctl_main(struct ipc_sem_context *context,
+		       int semid, int semnum, int cmd,
+		       int version, union semun arg)
 {
 	struct sem_array *sma;
 	struct sem* curr;
@@ -590,14 +595,14 @@ static int semctl_main(int semid, int se
 	ushort* sem_io = fast_sem_io;
 	int nsems;
 
-	sma = sem_lock(semid);
+	sma = sem_lock(context, semid);
 	if(sma==NULL)
 		return -EINVAL;
 
 	nsems = sma->sem_nsems;
 
 	err=-EIDRM;
-	if (sem_checkid(sma,semid))
+	if (sem_checkid(context, sma,semid))
 		goto out_unlock;
 
 	err = -EACCES;
@@ -617,20 +622,20 @@ static int semctl_main(int semid, int se
 
 		if(nsems > SEMMSL_FAST) {
 			ipc_rcu_getref(sma);
-			sem_unlock(sma);			
+			sem_unlock(context, sma);
 
 			sem_io = ipc_alloc(sizeof(ushort)*nsems);
 			if(sem_io == NULL) {
 				ipc_lock_by_ptr(&sma->sem_perm);
 				ipc_rcu_putref(sma);
-				sem_unlock(sma);
+				sem_unlock(context, sma);
 				return -ENOMEM;
 			}
 
 			ipc_lock_by_ptr(&sma->sem_perm);
 			ipc_rcu_putref(sma);
 			if (sma->sem_perm.deleted) {
-				sem_unlock(sma);
+				sem_unlock(context, sma);
 				err = -EIDRM;
 				goto out_free;
 			}
@@ -638,7 +643,7 @@ static int semctl_main(int semid, int se
 
 		for (i = 0; i < sma->sem_nsems; i++)
 			sem_io[i] = sma->sem_base[i].semval;
-		sem_unlock(sma);
+		sem_unlock(context, sma);
 		err = 0;
 		if(copy_to_user(array, sem_io, nsems*sizeof(ushort)))
 			err = -EFAULT;
@@ -650,14 +655,14 @@ static int semctl_main(int semid, int se
 		struct sem_undo *un;
 
 		ipc_rcu_getref(sma);
-		sem_unlock(sma);
+		sem_unlock(context, sma);
 
 		if(nsems > SEMMSL_FAST) {
 			sem_io = ipc_alloc(sizeof(ushort)*nsems);
 			if(sem_io == NULL) {
 				ipc_lock_by_ptr(&sma->sem_perm);
 				ipc_rcu_putref(sma);
-				sem_unlock(sma);
+				sem_unlock(context, sma);
 				return -ENOMEM;
 			}
 		}
@@ -665,7 +670,7 @@ static int semctl_main(int semid, int se
 		if (copy_from_user (sem_io, arg.array, nsems*sizeof(ushort))) {
 			ipc_lock_by_ptr(&sma->sem_perm);
 			ipc_rcu_putref(sma);
-			sem_unlock(sma);
+			sem_unlock(context, sma);
 			err = -EFAULT;
 			goto out_free;
 		}
@@ -674,7 +679,7 @@ static int semctl_main(int semid, int se
 			if (sem_io[i] > SEMVMX) {
 				ipc_lock_by_ptr(&sma->sem_perm);
 				ipc_rcu_putref(sma);
-				sem_unlock(sma);
+				sem_unlock(context, sma);
 				err = -ERANGE;
 				goto out_free;
 			}
@@ -682,7 +687,7 @@ static int semctl_main(int semid, int se
 		ipc_lock_by_ptr(&sma->sem_perm);
 		ipc_rcu_putref(sma);
 		if (sma->sem_perm.deleted) {
-			sem_unlock(sma);
+			sem_unlock(context, sma);
 			err = -EIDRM;
 			goto out_free;
 		}
@@ -706,7 +711,7 @@ static int semctl_main(int semid, int se
 		tbuf.sem_otime  = sma->sem_otime;
 		tbuf.sem_ctime  = sma->sem_ctime;
 		tbuf.sem_nsems  = sma->sem_nsems;
-		sem_unlock(sma);
+		sem_unlock(context, sma);
 		if (copy_semid_to_user (arg.buf, &tbuf, version))
 			return -EFAULT;
 		return 0;
@@ -752,7 +757,7 @@ static int semctl_main(int semid, int se
 	}
 	}
 out_unlock:
-	sem_unlock(sma);
+	sem_unlock(context, sma);
 out_free:
 	if(sem_io != fast_sem_io)
 		ipc_free(sem_io, sizeof(ushort)*nsems);
@@ -799,7 +804,9 @@ static inline unsigned long copy_semid_f
 	}
 }
 
-static int semctl_down(int semid, int semnum, int cmd, int version, union semun arg)
+static int semctl_down(struct ipc_sem_context *context,
+		       int semid, int semnum, int cmd,
+		       int version, union semun arg)
 {
 	struct sem_array *sma;
 	int err;
@@ -812,11 +819,11 @@ static int semctl_down(int semid, int se
 		if ((err = audit_ipc_perms(0, setbuf.uid, setbuf.gid, setbuf.mode)))
 			return err;
 	}
-	sma = sem_lock(semid);
+	sma = sem_lock(context, semid);
 	if(sma==NULL)
 		return -EINVAL;
 
-	if (sem_checkid(sma,semid)) {
+	if (sem_checkid(context, sma,semid)) {
 		err=-EIDRM;
 		goto out_unlock;
 	}	
@@ -834,7 +841,7 @@ static int semctl_down(int semid, int se
 
 	switch(cmd){
 	case IPC_RMID:
-		freeary(sma, semid);
+		freeary(context, sma, semid);
 		err = 0;
 		break;
 	case IPC_SET:
@@ -843,18 +850,18 @@ static int semctl_down(int semid, int se
 		ipcp->mode = (ipcp->mode & ~S_IRWXUGO)
 				| (setbuf.mode & S_IRWXUGO);
 		sma->sem_ctime = get_seconds();
-		sem_unlock(sma);
+		sem_unlock(context, sma);
 		err = 0;
 		break;
 	default:
-		sem_unlock(sma);
+		sem_unlock(context, sma);
 		err = -EINVAL;
 		break;
 	}
 	return err;
 
 out_unlock:
-	sem_unlock(sma);
+	sem_unlock(context, sma);
 	return err;
 }
 
@@ -862,6 +869,7 @@ asmlinkage long sys_semctl (int semid, i
 {
 	int err = -EINVAL;
 	int version;
+	struct ipc_sem_context *context = &current->ipc_context->sem;
 
 	if (semid < 0)
 		return -EINVAL;
@@ -872,7 +880,7 @@ asmlinkage long sys_semctl (int semid, i
 	case IPC_INFO:
 	case SEM_INFO:
 	case SEM_STAT:
-		err = semctl_nolock(semid,semnum,cmd,version,arg);
+		err = semctl_nolock(context, semid,semnum,cmd,version,arg);
 		return err;
 	case GETALL:
 	case GETVAL:
@@ -882,13 +890,13 @@ asmlinkage long sys_semctl (int semid, i
 	case IPC_STAT:
 	case SETVAL:
 	case SETALL:
-		err = semctl_main(semid,semnum,cmd,version,arg);
+		err = semctl_main(context, semid,semnum,cmd,version,arg);
 		return err;
 	case IPC_RMID:
 	case IPC_SET:
-		down(&sem_ids.sem);
-		err = semctl_down(semid,semnum,cmd,version,arg);
-		up(&sem_ids.sem);
+		down(&context->ids.sem);
+		err = semctl_down(context, semid,semnum,cmd,version,arg);
+		up(&context->ids.sem);
 		return err;
 	default:
 		return -EINVAL;
@@ -976,7 +984,7 @@ static struct sem_undo *lookup_undo(stru
 	return un;
 }
 
-static struct sem_undo *find_undo(int semid)
+static struct sem_undo *find_undo(struct ipc_sem_context *context, int semid)
 {
 	struct sem_array *sma;
 	struct sem_undo_list *ulp;
@@ -995,24 +1003,24 @@ static struct sem_undo *find_undo(int se
 		goto out;
 
 	/* no undo structure around - allocate one. */
-	sma = sem_lock(semid);
+	sma = sem_lock(context, semid);
 	un = ERR_PTR(-EINVAL);
 	if(sma==NULL)
 		goto out;
 	un = ERR_PTR(-EIDRM);
-	if (sem_checkid(sma,semid)) {
-		sem_unlock(sma);
+	if (sem_checkid(context, sma,semid)) {
+		sem_unlock(context, sma);
 		goto out;
 	}
 	nsems = sma->sem_nsems;
 	ipc_rcu_getref(sma);
-	sem_unlock(sma);
+	sem_unlock(context, sma);
 
 	new = (struct sem_undo *) kmalloc(sizeof(struct sem_undo) + sizeof(short)*nsems, GFP_KERNEL);
 	if (!new) {
 		ipc_lock_by_ptr(&sma->sem_perm);
 		ipc_rcu_putref(sma);
-		sem_unlock(sma);
+		sem_unlock(context, sma);
 		return ERR_PTR(-ENOMEM);
 	}
 	memset(new, 0, sizeof(struct sem_undo) + sizeof(short)*nsems);
@@ -1026,13 +1034,13 @@ static struct sem_undo *find_undo(int se
 		kfree(new);
 		ipc_lock_by_ptr(&sma->sem_perm);
 		ipc_rcu_putref(sma);
-		sem_unlock(sma);
+		sem_unlock(context, sma);
 		goto out;
 	}
 	ipc_lock_by_ptr(&sma->sem_perm);
 	ipc_rcu_putref(sma);
 	if (sma->sem_perm.deleted) {
-		sem_unlock(sma);
+		sem_unlock(context, sma);
 		unlock_semundo();
 		kfree(new);
 		un = ERR_PTR(-EIDRM);
@@ -1042,7 +1050,7 @@ static struct sem_undo *find_undo(int se
 	ulp->proc_list = new;
 	new->id_next = sma->undo;
 	sma->undo = new;
-	sem_unlock(sma);
+	sem_unlock(context, sma);
 	un = new;
 	unlock_semundo();
 out:
@@ -1052,6 +1060,7 @@ out:
 asmlinkage long sys_semtimedop(int semid, struct sembuf __user *tsops,
 			unsigned nsops, const struct timespec __user *timeout)
 {
+	struct ipc_sem_context *context = &current->ipc_context->sem;
 	int error = -EINVAL;
 	struct sem_array *sma;
 	struct sembuf fast_sops[SEMOPM_FAST];
@@ -1099,7 +1108,7 @@ asmlinkage long sys_semtimedop(int semid
 
 retry_undos:
 	if (undos) {
-		un = find_undo(semid);
+		un = find_undo(context, semid);
 		if (IS_ERR(un)) {
 			error = PTR_ERR(un);
 			goto out_free;
@@ -1107,12 +1116,12 @@ retry_undos:
 	} else
 		un = NULL;
 
-	sma = sem_lock(semid);
+	sma = sem_lock(context, semid);
 	error=-EINVAL;
 	if(sma==NULL)
 		goto out_free;
 	error = -EIDRM;
-	if (sem_checkid(sma,semid))
+	if (sem_checkid(context, sma,semid))
 		goto out_unlock_free;
 	/*
 	 * semid identifies are not unique - find_undo may have
@@ -1120,7 +1129,7 @@ retry_undos:
 	 * and now a new array with received the same id. Check and retry.
 	 */
 	if (un && un->semid == -1) {
-		sem_unlock(sma);
+		sem_unlock(context, sma);
 		goto retry_undos;
 	}
 	error = -EFBIG;
@@ -1161,7 +1170,7 @@ retry_undos:
 	queue.status = -EINTR;
 	queue.sleeper = current;
 	current->state = TASK_INTERRUPTIBLE;
-	sem_unlock(sma);
+	sem_unlock(context, sma);
 
 	if (timeout)
 		jiffies_left = schedule_timeout(jiffies_left);
@@ -1180,7 +1189,7 @@ retry_undos:
 		goto out_free;
 	}
 
-	sma = sem_lock(semid);
+	sma = sem_lock(context, semid);
 	if(sma==NULL) {
 		if(queue.prev != NULL)
 			BUG();
@@ -1205,7 +1214,7 @@ retry_undos:
 	goto out_unlock_free;
 
 out_unlock_free:
-	sem_unlock(sma);
+	sem_unlock(context, sma);
 out_free:
 	if(sops != fast_sops)
 		kfree(sops);
@@ -1258,6 +1267,7 @@ void exit_sem(struct task_struct *tsk)
 {
 	struct sem_undo_list *undo_list;
 	struct sem_undo *u, **up;
+	struct ipc_sem_context *context = &tsk->ipc_context->sem;
 
 	undo_list = tsk->sysvsem.undo_list;
 	if (!undo_list)
@@ -1279,14 +1289,14 @@ void exit_sem(struct task_struct *tsk)
 
 		if(semid == -1)
 			continue;
-		sma = sem_lock(semid);
+		sma = sem_lock(context, semid);
 		if (sma == NULL)
 			continue;
 
 		if (u->semid == -1)
 			goto next_entry;
 
-		BUG_ON(sem_checkid(sma,u->semid));
+		BUG_ON(sem_checkid(context, sma,u->semid));
 
 		/* remove u from the sma->undo list */
 		for (unp = &sma->undo; (un = *unp); unp = &un->id_next) {
@@ -1327,7 +1337,7 @@ found:
 		/* maybe some queued-up processes were waiting for this */
 		update_queue(sma);
 next_entry:
-		sem_unlock(sma);
+		sem_unlock(context, sma);
 	}
 	kfree(undo_list);
 }
diff -puN ipc/util.c~sysvsem-container ipc/util.c
--- work/ipc/util.c~sysvsem-container	2006-03-06 15:41:58.000000000 -0800
+++ work-dave/ipc/util.c	2006-03-06 15:41:58.000000000 -0800
@@ -52,7 +52,7 @@ static int __init ipc_init(void)
 	if (!init_task.ipc_context)
 		return -ENOMEM;
 
-	sem_init();
+	sem_init(&init_task.ipc_context->sem);
 	msg_init(&init_task.ipc_context->msg);
 	shm_init();
 	return 0;
diff -puN ipc/util.h~sysvsem-container ipc/util.h
--- work/ipc/util.h~sysvsem-container	2006-03-06 15:41:58.000000000 -0800
+++ work-dave/ipc/util.h	2006-03-06 15:41:58.000000000 -0800
@@ -11,10 +11,6 @@
 #define USHRT_MAX 0xffff
 #define SEQ_MULTIPLIER	(IPCMNI)
 
-void sem_init (void);
-void msg_init (struct ipc_msg_context *context);
-void shm_init (void);
-
 struct ipc_id_ary {
 	int size;
 	struct kern_ipc_perm *p[0];
@@ -42,10 +38,21 @@ struct ipc_msg_context {
 	struct kref count;
 };
 
+struct ipc_sem_context {
+	struct ipc_ids ids;
+
+	int nr_used;
+};
+
 struct ipc_context {
 	struct ipc_msg_context msg;
+	struct ipc_sem_context sem;
 };
 
+void sem_init (struct ipc_sem_context *context);
+void msg_init (struct ipc_msg_context *context);
+void shm_init (void);
+
 struct seq_file;
 void __init ipc_init_ids(struct ipc_ids* ids, int size);
 #ifdef CONFIG_PROC_FS
_

  parent reply	other threads:[~2006-03-06 23:53 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-03-06 23:52 [RFC][PATCH 0/6] support separate namespaces for sysv Dave Hansen
2006-03-06 23:52 ` [RFC][PATCH 1/6] prepare sysctls for containers Dave Hansen
2006-03-07  0:50   ` Herbert Poetzl
2006-03-07  2:00     ` Dave Hansen
2006-03-07  2:45       ` Herbert Poetzl
2006-03-19 15:54         ` Eric W. Biederman
2006-03-07  1:01   ` Chris Wright
2006-03-07  2:04     ` Dave Hansen
2006-03-07  2:18       ` Chris Wright
2006-03-07  3:02       ` Sam Vilain
2006-03-07  1:24   ` Al Viro
2006-03-07  1:55     ` Dave Hansen
2006-03-07  1:57       ` Al Viro
2006-03-19 14:50         ` Eric W. Biederman
2006-03-19 15:29   ` Eric W. Biederman
2006-03-06 23:52 ` [RFC][PATCH 3/6] sysvmsg: containerize sysctls Dave Hansen
2006-03-06 23:52 ` [RFC][PATCH 2/6] sysvmsg: containerize Dave Hansen
2006-03-07  1:57   ` Chris Wright
2006-03-07  2:08     ` Dave Hansen
2006-03-07  2:34       ` Chris Wright
2006-03-19 15:36         ` Eric W. Biederman
2006-03-20 19:34           ` Chris Wright
2006-03-20 21:29             ` Eric W. Biederman
2006-03-20 21:50               ` Chris Wright
2006-03-06 23:52 ` Dave Hansen [this message]
2006-03-07  2:44   ` [RFC][PATCH 4/6] sysvsem: containerize Chris Wright
2006-03-07  5:08     ` Dave Hansen
2006-03-06 23:52 ` [RFC][PATCH 5/6] sysvshm: containerize Dave Hansen
2006-03-06 23:52 ` [RFC][PATCH 6/6] sysvshm: containerize sysctls Dave Hansen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20060306235251.04FABF95@localhost.localdomain \
    --to=haveblue@us.ibm.com \
    --cc=clg@fr.ibm.com \
    --cc=frankeh@watson.ibm.com \
    --cc=herbert@13thfloor.at \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sam@vilain.net \
    --cc=serue@us.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.