Lines Matching defs:msq
131 struct msg_queue *msq = container_of(p, struct msg_queue, q_perm);
133 security_msg_queue_free(&msq->q_perm);
134 kvfree(msq);
146 struct msg_queue *msq;
151 msq = kvmalloc(sizeof(*msq), GFP_KERNEL);
152 if (unlikely(!msq)) {
156 msq->q_perm.mode = msgflg & S_IRWXUGO;
157 msq->q_perm.key = key;
159 msq->q_perm.security = NULL;
160 retval = security_msg_queue_alloc(&msq->q_perm);
162 kvfree(msq);
166 msq->q_stime = msq->q_rtime = 0;
167 msq->q_ctime = ktime_get_real_seconds();
168 msq->q_cbytes = msq->q_qnum = 0;
169 msq->q_qbytes = ns->msg_ctlmnb;
170 msq->q_lspid = msq->q_lrpid = NULL;
171 INIT_LIST_HEAD(&msq->q_messages);
172 INIT_LIST_HEAD(&msq->q_receivers);
173 INIT_LIST_HEAD(&msq->q_senders);
175 /* ipc_addid() locks msq upon success. */
176 retval = ipc_addid(&msg_ids(ns), &msq->q_perm, ns->msg_ctlmni);
178 ipc_rcu_putref(&msq->q_perm, msg_rcu_free);
182 ipc_unlock_object(&msq->q_perm);
185 return msq->q_perm.id;
188 static inline bool msg_fits_inqueue(struct msg_queue *msq, size_t msgsz)
190 return msgsz + msq->q_cbytes <= msq->q_qbytes && 1 + msq->q_qnum <= msq->q_qbytes;
193 static inline void ss_add(struct msg_queue *msq, struct msg_sender *mss, size_t msgsz)
202 list_add_tail(&mss->list, &msq->q_senders);
212 static void ss_wakeup(struct msg_queue *msq, struct wake_q_head *wake_q, bool kill)
216 struct list_head *h = &msq->q_senders;
224 } else if (!msg_fits_inqueue(msq, mss->msgsz)) {
229 list_move_tail(&mss->list, &msq->q_senders);
237 static void expunge_all(struct msg_queue *msq, int res, struct wake_q_head *wake_q)
241 list_for_each_entry_safe(msr, t, &msq->q_receivers, r_list)
261 static void freeque(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp) __releases(RCU) __releases(&msq->q_perm)
264 struct msg_queue *msq = container_of(ipcp, struct msg_queue, q_perm);
267 expunge_all(msq, -EIDRM, &wake_q);
268 ss_wakeup(msq, &wake_q, true);
269 msg_rmid(ns, msq);
270 ipc_unlock_object(&msq->q_perm);
274 list_for_each_entry_safe(msg, t, &msq->q_messages, m_list)
279 atomic_sub(msq->q_cbytes, &ns->msg_bytes);
280 ipc_update_pid(&msq->q_lspid, NULL);
281 ipc_update_pid(&msq->q_lrpid, NULL);
282 ipc_rcu_putref(&msq->q_perm, msg_rcu_free);
393 struct msg_queue *msq;
405 msq = container_of(ipcp, struct msg_queue, q_perm);
407 err = security_msg_queue_msgctl(&msq->q_perm, cmd);
414 ipc_lock_object(&msq->q_perm);
426 ipc_lock_object(&msq->q_perm);
432 msq->q_qbytes = msg_qbytes;
434 msq->q_ctime = ktime_get_real_seconds();
439 expunge_all(msq, -EAGAIN, &wake_q);
444 ss_wakeup(msq, &wake_q, false);
445 ipc_unlock_object(&msq->q_perm);
456 ipc_unlock_object(&msq->q_perm);
502 struct msg_queue *msq;
509 msq = msq_obtain_object(ns, msqid);
510 if (IS_ERR(msq)) {
511 err = PTR_ERR(msq);
515 msq = msq_obtain_object_check(ns, msqid);
516 if (IS_ERR(msq)) {
517 err = PTR_ERR(msq);
524 audit_ipc_obj(&msq->q_perm);
527 if (ipcperms(ns, &msq->q_perm, S_IRUGO)) {
532 err = security_msg_queue_msgctl(&msq->q_perm, cmd);
537 ipc_lock_object(&msq->q_perm);
539 if (!ipc_valid_object(&msq->q_perm)) {
540 ipc_unlock_object(&msq->q_perm);
545 kernel_to_ipc64_perm(&msq->q_perm, &p->msg_perm);
546 p->msg_stime = msq->q_stime;
547 p->msg_rtime = msq->q_rtime;
548 p->msg_ctime = msq->q_ctime;
550 p->msg_stime_high = msq->q_stime >> 0x20;
551 p->msg_rtime_high = msq->q_rtime >> 0x20;
552 p->msg_ctime_high = msq->q_ctime >> 0x20;
554 p->msg_cbytes = msq->q_cbytes;
555 p->msg_qnum = msq->q_qnum;
556 p->msg_qbytes = msq->q_qbytes;
557 p->msg_lspid = pid_vnr(msq->q_lspid);
558 p->msg_lrpid = pid_vnr(msq->q_lrpid);
571 err = msq->q_perm.id;
574 ipc_unlock_object(&msq->q_perm);
815 static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg, struct wake_q_head *wake_q)
819 list_for_each_entry_safe(msr, t, &msq->q_receivers, r_list)
822 !security_msg_queue_msgrcv(&msq->q_perm, msg, msr->r_tsk, msr->r_msgtype, msr->r_mode)) {
830 ipc_update_pid(&msq->q_lrpid, task_pid(msr->r_tsk));
831 msq->q_rtime = ktime_get_real_seconds();
847 struct msg_queue *msq;
871 msq = msq_obtain_object_check(ns, msqid);
872 if (IS_ERR(msq)) {
873 err = PTR_ERR(msq);
877 ipc_lock_object(&msq->q_perm);
883 if (ipcperms(ns, &msq->q_perm, S_IWUGO)) {
888 if (!ipc_valid_object(&msq->q_perm)) {
893 err = security_msg_queue_msgsnd(&msq->q_perm, msg, msgflg);
898 if (msg_fits_inqueue(msq, msgsz)) {
909 ss_add(msq, &s, msgsz);
911 if (!ipc_rcu_getref(&msq->q_perm)) {
916 ipc_unlock_object(&msq->q_perm);
921 ipc_lock_object(&msq->q_perm);
923 ipc_rcu_putref(&msq->q_perm, msg_rcu_free);
925 if (!ipc_valid_object(&msq->q_perm)) {
937 ipc_update_pid(&msq->q_lspid, task_tgid(current));
938 msq->q_stime = ktime_get_real_seconds();
940 if (!pipelined_send(msq, msg, &wake_q)) {
942 list_add_tail(&msg->m_list, &msq->q_messages);
943 msq->q_cbytes += msgsz;
944 msq->q_qnum++;
953 ipc_unlock_object(&msq->q_perm);
1082 static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode)
1087 list_for_each_entry(msg, &msq->q_messages, m_list)
1089 if (testmsg(msg, *msgtyp, mode) && !security_msg_queue_msgrcv(&msq->q_perm, msg, current, *msgtyp, mode)) {
1111 struct msg_queue *msq;
1134 msq = msq_obtain_object_check(ns, msqid);
1135 if (IS_ERR(msq)) {
1138 return PTR_ERR(msq);
1145 if (ipcperms(ns, &msq->q_perm, S_IRUGO)) {
1149 ipc_lock_object(&msq->q_perm);
1152 if (!ipc_valid_object(&msq->q_perm)) {
1157 msg = find_msg(msq, &msgtyp, mode);
1177 msq->q_qnum--;
1178 msq->q_rtime = ktime_get_real_seconds();
1179 ipc_update_pid(&msq->q_lrpid, task_tgid(current));
1180 msq->q_cbytes -= msg->m_ts;
1183 ss_wakeup(msq, &wake_q, false);
1194 list_add_tail(&msr_d.r_list, &msq->q_receivers);
1210 ipc_unlock_object(&msq->q_perm);
1219 * msq:
1247 ipc_lock_object(&msq->q_perm);
1260 ipc_unlock_object(&msq->q_perm);
1264 ipc_unlock_object(&msq->q_perm);
1344 struct msg_queue *msq = container_of(ipcp, struct msg_queue, q_perm);
1346 seq_printf(s, "%10d %10d %4o %10lu %10lu %5u %5u %5u %5u %5u %5u %10llu %10llu %10llu\n", msq->q_perm.key,
1347 msq->q_perm.id, msq->q_perm.mode, msq->q_cbytes, msq->q_qnum, pid_nr_ns(msq->q_lspid, pid_ns),
1348 pid_nr_ns(msq->q_lrpid, pid_ns), from_kuid_munged(user_ns, msq->q_perm.uid),
1349 from_kgid_munged(user_ns, msq->q_perm.gid), from_kuid_munged(user_ns, msq->q_perm.cuid),
1350 from_kgid_munged(user_ns, msq->q_perm.cgid), msq->q_stime, msq->q_rtime, msq->q_ctime);