• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/ipc/

Lines Matching refs:sma

95 #define sem_unlock(sma)		ipc_unlock(&(sma)->sem_perm)
96 #define sem_checkid(sma, semid) ipc_checkid(&sma->sem_perm, semid)
172 static inline void sem_lock_and_putref(struct sem_array *sma)
174 ipc_lock_by_ptr(&sma->sem_perm);
175 ipc_rcu_putref(sma);
178 static inline void sem_getref_and_unlock(struct sem_array *sma)
180 ipc_rcu_getref(sma);
181 ipc_unlock(&(sma)->sem_perm);
184 static inline void sem_putref(struct sem_array *sma)
186 ipc_lock_by_ptr(&sma->sem_perm);
187 ipc_rcu_putref(sma);
188 ipc_unlock(&(sma)->sem_perm);
201 * * unlinking the queue entry from sma->sem_pending
217 * thread could race forward and try (and fail) to acquire sma->lock
242 struct sem_array *sma;
254 size = sizeof (*sma) + nsems * sizeof (struct sem);
255 sma = ipc_rcu_alloc(size);
256 if (!sma) {
259 memset (sma, 0, size);
261 sma->sem_perm.mode = (semflg & S_IRWXUGO);
262 sma->sem_perm.key = key;
264 sma->sem_perm.security = NULL;
265 retval = security_sem_alloc(sma);
267 ipc_rcu_putref(sma);
271 id = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni);
273 security_sem_free(sma);
274 ipc_rcu_putref(sma);
279 sma->sem_base = (struct sem *) &sma[1];
282 INIT_LIST_HEAD(&sma->sem_base[i].sem_pending);
284 sma->complex_count = 0;
285 INIT_LIST_HEAD(&sma->sem_pending);
286 INIT_LIST_HEAD(&sma->list_id);
287 sma->sem_nsems = nsems;
288 sma->sem_ctime = get_seconds();
289 sem_unlock(sma);
291 return sma->sem_perm.id;
300 struct sem_array *sma;
302 sma = container_of(ipcp, struct sem_array, sem_perm);
303 return security_sem_associate(sma, semflg);
312 struct sem_array *sma;
314 sma = container_of(ipcp, struct sem_array, sem_perm);
315 if (params->u.nsems > sma->sem_nsems)
348 static int try_atomic_semop (struct sem_array * sma, struct sembuf * sops,
356 curr = sma->sem_base + sop->sem_num;
381 sma->sem_base[sop->sem_num].sempid = pid;
402 sma->sem_base[sop->sem_num].semval -= sop->sem_op;
456 static void unlink_queue(struct sem_array *sma, struct sem_queue *q)
462 sma->complex_count--;
465 /** check_restart(sma, q)
466 * @sma: semaphore array
474 static int check_restart(struct sem_array *sma, struct sem_queue *q)
484 if (sma->complex_count)
491 curr = sma->sem_base + q->sops[0].sem_num;
530 * update_queue(sma, semnum): Look for tasks that can be completed.
531 * @sma: semaphore array.
542 static int update_queue(struct sem_array *sma, int semnum, struct list_head *pt)
554 if (sma->complex_count)
558 pending_list = &sma->sem_pending;
561 pending_list = &sma->sem_base[semnum].sem_pending;
580 if (semnum != -1 && sma->sem_base[semnum].semval == 0 &&
584 error = try_atomic_semop(sma, q->sops, q->nsops,
591 unlink_queue(sma, q);
597 restart = check_restart(sma, q);
608 * do_smart_update(sma, sops, nsops, otime, pt) - optimized update_queue
609 * @sma: semaphore array
621 static void do_smart_update(struct sem_array *sma, struct sembuf *sops, int nsops,
626 if (sma->complex_count || sops == NULL) {
627 if (update_queue(sma, -1, pt))
635 sma->sem_base[sops[i].sem_num].semval == 0))
636 if (update_queue(sma, sops[i].sem_num, pt))
641 sma->sem_otime = get_seconds();
654 static int count_semncnt (struct sem_array * sma, ushort semnum)
660 list_for_each_entry(q, &sma->sem_pending, list) {
673 static int count_semzcnt (struct sem_array * sma, ushort semnum)
679 list_for_each_entry(q, &sma->sem_pending, list) {
706 struct sem_array *sma = container_of(ipcp, struct sem_array, sem_perm);
710 assert_spin_locked(&sma->sem_perm.lock);
711 list_for_each_entry_safe(un, tu, &sma->list_id, list_id) {
722 list_for_each_entry_safe(q, tq, &sma->sem_pending, list) {
723 unlink_queue(sma, q);
728 sem_rmid(ns, sma);
729 sem_unlock(sma);
732 ns->used_sems -= sma->sem_nsems;
733 security_sem_free(sma);
734 ipc_rcu_putref(sma);
765 struct sem_array *sma;
808 sma = sem_lock(ns, semid);
809 if (IS_ERR(sma))
810 return PTR_ERR(sma);
811 id = sma->sem_perm.id;
813 sma = sem_lock_check(ns, semid);
814 if (IS_ERR(sma))
815 return PTR_ERR(sma);
820 if (ipcperms (&sma->sem_perm, S_IRUGO))
823 err = security_sem_semctl(sma, cmd);
829 kernel_to_ipc64_perm(&sma->sem_perm, &tbuf.sem_perm);
830 tbuf.sem_otime = sma->sem_otime;
831 tbuf.sem_ctime = sma->sem_ctime;
832 tbuf.sem_nsems = sma->sem_nsems;
833 sem_unlock(sma);
842 sem_unlock(sma);
849 struct sem_array *sma;
857 sma = sem_lock_check(ns, semid);
858 if (IS_ERR(sma))
859 return PTR_ERR(sma);
862 nsems = sma->sem_nsems;
865 if (ipcperms (&sma->sem_perm, (cmd==SETVAL||cmd==SETALL)?S_IWUGO:S_IRUGO))
868 err = security_sem_semctl(sma, cmd);
880 sem_getref_and_unlock(sma);
884 sem_putref(sma);
888 sem_lock_and_putref(sma);
889 if (sma->sem_perm.deleted) {
890 sem_unlock(sma);
896 for (i = 0; i < sma->sem_nsems; i++)
897 sem_io[i] = sma->sem_base[i].semval;
898 sem_unlock(sma);
909 sem_getref_and_unlock(sma);
914 sem_putref(sma);
920 sem_putref(sma);
927 sem_putref(sma);
932 sem_lock_and_putref(sma);
933 if (sma->sem_perm.deleted) {
934 sem_unlock(sma);
940 sma->sem_base[i].semval = sem_io[i];
942 assert_spin_locked(&sma->sem_perm.lock);
943 list_for_each_entry(un, &sma->list_id, list_id) {
947 sma->sem_ctime = get_seconds();
949 do_smart_update(sma, NULL, 0, 0, &tasks);
959 curr = &sma->sem_base[semnum];
969 err = count_semncnt(sma,semnum);
972 err = count_semzcnt(sma,semnum);
983 assert_spin_locked(&sma->sem_perm.lock);
984 list_for_each_entry(un, &sma->list_id, list_id)
989 sma->sem_ctime = get_seconds();
991 do_smart_update(sma, NULL, 0, 0, &tasks);
997 sem_unlock(sma);
1040 struct sem_array *sma;
1054 sma = container_of(ipcp, struct sem_array, sem_perm);
1056 err = security_sem_semctl(sma, cmd);
1066 sma->sem_ctime = get_seconds();
1073 sem_unlock(sma);
1191 struct sem_array *sma;
1211 sma = sem_lock_check(ns, semid);
1212 if (IS_ERR(sma))
1213 return ERR_CAST(sma);
1215 nsems = sma->sem_nsems;
1216 sem_getref_and_unlock(sma);
1221 sem_putref(sma);
1226 sem_lock_and_putref(sma);
1227 if (sma->sem_perm.deleted) {
1228 sem_unlock(sma);
1249 assert_spin_locked(&sma->sem_perm.lock);
1250 list_add(&new->list_id, &sma->list_id);
1256 sem_unlock(sma);
1292 struct sem_array *sma;
1351 sma = sem_lock_check(ns, semid);
1352 if (IS_ERR(sma)) {
1355 error = PTR_ERR(sma);
1385 if (max >= sma->sem_nsems)
1389 if (ipcperms(&sma->sem_perm, alter ? S_IWUGO : S_IRUGO))
1392 error = security_sem_semop(sma, sops, nsops, alter);
1396 error = try_atomic_semop (sma, sops, nsops, un, task_tgid_vnr(current));
1399 do_smart_update(sma, sops, nsops, 1, &tasks);
1414 list_add_tail(&queue.list, &sma->sem_pending);
1416 list_add(&queue.list, &sma->sem_pending);
1420 curr = &sma->sem_base[sops->sem_num];
1428 sma->complex_count++;
1434 sem_unlock(sma);
1456 sma = sem_lock(ns, semid);
1457 if (IS_ERR(sma)) {
1477 unlink_queue(sma, &queue);
1480 sem_unlock(sma);
1541 struct sem_array *sma;
1559 sma = sem_lock_check(tsk->nsproxy->ipc_ns, un->semid);
1562 if (IS_ERR(sma))
1570 sem_unlock(sma);
1575 assert_spin_locked(&sma->sem_perm.lock);
1583 for (i = 0; i < sma->sem_nsems; i++) {
1584 struct sem * semaphore = &sma->sem_base[i];
1609 do_smart_update(sma, NULL, 0, 1, &tasks);
1610 sem_unlock(sma);
1621 struct sem_array *sma = it;
1625 sma->sem_perm.key,
1626 sma->sem_perm.id,
1627 sma->sem_perm.mode,
1628 sma->sem_nsems,
1629 sma->sem_perm.uid,
1630 sma->sem_perm.gid,
1631 sma->sem_perm.cuid,
1632 sma->sem_perm.cgid,
1633 sma->sem_otime,
1634 sma->sem_ctime);