• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/ipc/

Lines Matching refs:sma

92 #define sem_unlock(sma)		ipc_unlock(&(sma)->sem_perm)
94 #define sem_checkid(ns, sma, semid) \
95 ipc_checkid(&sem_ids(ns),&sma->sem_perm,semid)
102 static void freeary(struct ipc_namespace *ns, struct sem_array *sma, int id);
151 struct sem_array *sma;
155 sma = sem_lock(ns, i);
156 if (sma == NULL)
159 freeary(ns, sma, i);
182 * * unlinking the queue entry from sma->sem_pending
198 * thread could race forward and try (and fail) to acquire sma->lock
215 struct sem_array *sma;
223 size = sizeof (*sma) + nsems * sizeof (struct sem);
224 sma = ipc_rcu_alloc(size);
225 if (!sma) {
228 memset (sma, 0, size);
230 sma->sem_perm.mode = (semflg & S_IRWXUGO);
231 sma->sem_perm.key = key;
233 sma->sem_perm.security = NULL;
234 retval = security_sem_alloc(sma);
236 ipc_rcu_putref(sma);
240 id = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni);
242 security_sem_free(sma);
243 ipc_rcu_putref(sma);
248 sma->sem_id = sem_buildid(ns, id, sma->sem_perm.seq);
249 sma->sem_base = (struct sem *) &sma[1];
250 /* sma->sem_pending = NULL; */
251 sma->sem_pending_last = &sma->sem_pending;
252 /* sma->undo = NULL; */
253 sma->sem_nsems = nsems;
254 sma->sem_ctime = get_seconds();
255 sem_unlock(sma);
257 return sma->sem_id;
263 struct sem_array *sma;
282 sma = sem_lock(ns, id);
283 BUG_ON(sma==NULL);
284 if (nsems > sma->sem_nsems)
286 else if (ipcperms(&sma->sem_perm, semflg))
289 int semid = sem_buildid(ns, id, sma->sem_perm.seq);
290 err = security_sem_associate(sma, semflg);
294 sem_unlock(sma);
301 /* Manage the doubly linked list sma->sem_pending as a FIFO:
302 * insert new queue elements at the tail sma->sem_pending_last.
304 static inline void append_to_queue (struct sem_array * sma,
307 *(q->prev = sma->sem_pending_last) = q;
308 *(sma->sem_pending_last = &q->next) = NULL;
311 static inline void prepend_to_queue (struct sem_array * sma,
314 q->next = sma->sem_pending;
315 *(q->prev = &sma->sem_pending) = q;
318 else /* sma->sem_pending_last == &sma->sem_pending */
319 sma->sem_pending_last = &q->next;
322 static inline void remove_from_queue (struct sem_array * sma,
328 else /* sma->sem_pending_last == &q->next */
329 sma->sem_pending_last = q->prev;
338 static int try_atomic_semop (struct sem_array * sma, struct sembuf * sops,
346 curr = sma->sem_base + sop->sem_num;
371 sma->sem_base[sop->sem_num].sempid = pid;
377 sma->sem_otime = get_seconds();
393 sma->sem_base[sop->sem_num].semval -= sop->sem_op;
403 static void update_queue (struct sem_array * sma)
408 q = sma->sem_pending;
410 error = try_atomic_semop(sma, q->sops, q->nsops,
416 remove_from_queue(sma,q);
430 n = sma->sem_pending;
455 static int count_semncnt (struct sem_array * sma, ushort semnum)
461 for (q = sma->sem_pending; q; q = q->next) {
473 static int count_semzcnt (struct sem_array * sma, ushort semnum)
479 for (q = sma->sem_pending; q; q = q->next) {
496 static void freeary (struct ipc_namespace *ns, struct sem_array *sma, int id)
506 for (un = sma->undo; un; un = un->id_next)
510 q = sma->sem_pending;
524 sma = sem_rmid(ns, id);
525 sem_unlock(sma);
527 ns->used_sems -= sma->sem_nsems;
528 size = sizeof (*sma) + sma->sem_nsems * sizeof (struct sem);
529 security_sem_free(sma);
530 ipc_rcu_putref(sma);
559 struct sem_array *sma;
605 sma = sem_lock(ns, semid);
606 if(sma == NULL)
610 if (ipcperms (&sma->sem_perm, S_IRUGO))
613 err = security_sem_semctl(sma, cmd);
617 id = sem_buildid(ns, semid, sma->sem_perm.seq);
619 kernel_to_ipc64_perm(&sma->sem_perm, &tbuf.sem_perm);
620 tbuf.sem_otime = sma->sem_otime;
621 tbuf.sem_ctime = sma->sem_ctime;
622 tbuf.sem_nsems = sma->sem_nsems;
623 sem_unlock(sma);
633 sem_unlock(sma);
640 struct sem_array *sma;
647 sma = sem_lock(ns, semid);
648 if(sma==NULL)
651 nsems = sma->sem_nsems;
654 if (sem_checkid(ns,sma,semid))
658 if (ipcperms (&sma->sem_perm, (cmd==SETVAL||cmd==SETALL)?S_IWUGO:S_IRUGO))
661 err = security_sem_semctl(sma, cmd);
673 ipc_rcu_getref(sma);
674 sem_unlock(sma);
678 ipc_lock_by_ptr(&sma->sem_perm);
679 ipc_rcu_putref(sma);
680 sem_unlock(sma);
684 ipc_lock_by_ptr(&sma->sem_perm);
685 ipc_rcu_putref(sma);
686 if (sma->sem_perm.deleted) {
687 sem_unlock(sma);
693 for (i = 0; i < sma->sem_nsems; i++)
694 sem_io[i] = sma->sem_base[i].semval;
695 sem_unlock(sma);
706 ipc_rcu_getref(sma);
707 sem_unlock(sma);
712 ipc_lock_by_ptr(&sma->sem_perm);
713 ipc_rcu_putref(sma);
714 sem_unlock(sma);
720 ipc_lock_by_ptr(&sma->sem_perm);
721 ipc_rcu_putref(sma);
722 sem_unlock(sma);
729 ipc_lock_by_ptr(&sma->sem_perm);
730 ipc_rcu_putref(sma);
731 sem_unlock(sma);
736 ipc_lock_by_ptr(&sma->sem_perm);
737 ipc_rcu_putref(sma);
738 if (sma->sem_perm.deleted) {
739 sem_unlock(sma);
745 sma->sem_base[i].semval = sem_io[i];
746 for (un = sma->undo; un; un = un->id_next)
749 sma->sem_ctime = get_seconds();
751 update_queue(sma);
759 kernel_to_ipc64_perm(&sma->sem_perm, &tbuf.sem_perm);
760 tbuf.sem_otime = sma->sem_otime;
761 tbuf.sem_ctime = sma->sem_ctime;
762 tbuf.sem_nsems = sma->sem_nsems;
763 sem_unlock(sma);
774 curr = &sma->sem_base[semnum];
784 err = count_semncnt(sma,semnum);
787 err = count_semzcnt(sma,semnum);
797 for (un = sma->undo; un; un = un->id_next)
801 sma->sem_ctime = get_seconds();
803 update_queue(sma);
809 sem_unlock(sma);
859 struct sem_array *sma;
868 sma = sem_lock(ns, semid);
869 if(sma==NULL)
872 if (sem_checkid(ns,sma,semid)) {
876 ipcp = &sma->sem_perm;
893 err = security_sem_semctl(sma, cmd);
899 freeary(ns, sma, semid);
907 sma->sem_ctime = get_seconds();
908 sem_unlock(sma);
912 sem_unlock(sma);
919 sem_unlock(sma);
1042 struct sem_array *sma;
1059 sma = sem_lock(ns, semid);
1061 if(sma==NULL)
1064 if (sem_checkid(ns,sma,semid)) {
1065 sem_unlock(sma);
1068 nsems = sma->sem_nsems;
1069 ipc_rcu_getref(sma);
1070 sem_unlock(sma);
1074 ipc_lock_by_ptr(&sma->sem_perm);
1075 ipc_rcu_putref(sma);
1076 sem_unlock(sma);
1087 ipc_lock_by_ptr(&sma->sem_perm);
1088 ipc_rcu_putref(sma);
1089 sem_unlock(sma);
1092 ipc_lock_by_ptr(&sma->sem_perm);
1093 ipc_rcu_putref(sma);
1094 if (sma->sem_perm.deleted) {
1095 sem_unlock(sma);
1103 new->id_next = sma->undo;
1104 sma->undo = new;
1105 sem_unlock(sma);
1116 struct sem_array *sma;
1173 sma = sem_lock(ns, semid);
1175 if(sma==NULL)
1178 if (sem_checkid(ns,sma,semid))
1186 sem_unlock(sma);
1190 if (max >= sma->sem_nsems)
1194 if (ipcperms(&sma->sem_perm, alter ? S_IWUGO : S_IRUGO))
1197 error = security_sem_semop(sma, sops, nsops, alter);
1201 error = try_atomic_semop (sma, sops, nsops, un, current->tgid);
1204 update_queue (sma);
1212 queue.sma = sma;
1220 append_to_queue(sma ,&queue);
1222 prepend_to_queue(sma ,&queue);
1227 sem_unlock(sma);
1246 sma = sem_lock(ns, semid);
1247 if(sma==NULL) {
1266 remove_from_queue(sma,&queue);
1270 sem_unlock(sma);
1337 struct sem_array *sma;
1346 sma = sem_lock(ns, semid);
1347 if (sma == NULL)
1353 BUG_ON(sem_checkid(ns,sma,u->semid));
1355 /* remove u from the sma->undo list */
1356 for (unp = &sma->undo; (un = *unp); unp = &un->id_next) {
1365 nsems = sma->sem_nsems;
1367 struct sem * semaphore = &sma->sem_base[i];
1390 sma->sem_otime = get_seconds();
1392 update_queue(sma);
1394 sem_unlock(sma);
1402 struct sem_array *sma = it;
1406 sma->sem_perm.key,
1407 sma->sem_id,
1408 sma->sem_perm.mode,
1409 sma->sem_nsems,
1410 sma->sem_perm.uid,
1411 sma->sem_perm.gid,
1412 sma->sem_perm.cuid,
1413 sma->sem_perm.cgid,
1414 sma->sem_otime,
1415 sma->sem_ctime);