Lines Matching defs:msq
130 struct msg_queue *msq = container_of(p, struct msg_queue, q_perm);
132 security_msg_queue_free(&msq->q_perm);
133 kvfree(msq);
145 struct msg_queue *msq;
150 msq = kvmalloc(sizeof(*msq), GFP_KERNEL_ACCOUNT);
151 if (unlikely(!msq))
154 msq->q_perm.mode = msgflg & S_IRWXUGO;
155 msq->q_perm.key = key;
157 msq->q_perm.security = NULL;
158 retval = security_msg_queue_alloc(&msq->q_perm);
160 kvfree(msq);
164 msq->q_stime = msq->q_rtime = 0;
165 msq->q_ctime = ktime_get_real_seconds();
166 msq->q_cbytes = msq->q_qnum = 0;
167 msq->q_qbytes = ns->msg_ctlmnb;
168 msq->q_lspid = msq->q_lrpid = NULL;
169 INIT_LIST_HEAD(&msq->q_messages);
170 INIT_LIST_HEAD(&msq->q_receivers);
171 INIT_LIST_HEAD(&msq->q_senders);
173 /* ipc_addid() locks msq upon success. */
174 retval = ipc_addid(&msg_ids(ns), &msq->q_perm, ns->msg_ctlmni);
176 ipc_rcu_putref(&msq->q_perm, msg_rcu_free);
180 ipc_unlock_object(&msq->q_perm);
183 return msq->q_perm.id;
186 static inline bool msg_fits_inqueue(struct msg_queue *msq, size_t msgsz)
188 return msgsz + msq->q_cbytes <= msq->q_qbytes &&
189 1 + msq->q_qnum <= msq->q_qbytes;
192 static inline void ss_add(struct msg_queue *msq,
202 list_add_tail(&mss->list, &msq->q_senders);
211 static void ss_wakeup(struct msg_queue *msq,
216 struct list_head *h = &msq->q_senders;
236 else if (!msg_fits_inqueue(msq, mss->msgsz)) {
240 list_move_tail(&mss->list, &msq->q_senders);
248 static void expunge_all(struct msg_queue *msq, int res,
253 list_for_each_entry_safe(msr, t, &msq->q_receivers, r_list) {
274 __releases(&msq->q_perm)
277 struct msg_queue *msq = container_of(ipcp, struct msg_queue, q_perm);
280 expunge_all(msq, -EIDRM, &wake_q);
281 ss_wakeup(msq, &wake_q, true);
282 msg_rmid(ns, msq);
283 ipc_unlock_object(&msq->q_perm);
287 list_for_each_entry_safe(msg, t, &msq->q_messages, m_list) {
291 atomic_sub(msq->q_cbytes, &ns->msg_bytes);
292 ipc_update_pid(&msq->q_lspid, NULL);
293 ipc_update_pid(&msq->q_lrpid, NULL);
294 ipc_rcu_putref(&msq->q_perm, msg_rcu_free);
404 struct msg_queue *msq;
417 msq = container_of(ipcp, struct msg_queue, q_perm);
419 err = security_msg_queue_msgctl(&msq->q_perm, cmd);
425 ipc_lock_object(&msq->q_perm);
439 ipc_lock_object(&msq->q_perm);
444 msq->q_qbytes = msg_qbytes;
446 msq->q_ctime = ktime_get_real_seconds();
451 expunge_all(msq, -EAGAIN, &wake_q);
456 ss_wakeup(msq, &wake_q, false);
457 ipc_unlock_object(&msq->q_perm);
468 ipc_unlock_object(&msq->q_perm);
515 struct msg_queue *msq;
522 msq = msq_obtain_object(ns, msqid);
523 if (IS_ERR(msq)) {
524 err = PTR_ERR(msq);
528 msq = msq_obtain_object_check(ns, msqid);
529 if (IS_ERR(msq)) {
530 err = PTR_ERR(msq);
537 audit_ipc_obj(&msq->q_perm);
540 if (ipcperms(ns, &msq->q_perm, S_IRUGO))
544 err = security_msg_queue_msgctl(&msq->q_perm, cmd);
548 ipc_lock_object(&msq->q_perm);
550 if (!ipc_valid_object(&msq->q_perm)) {
551 ipc_unlock_object(&msq->q_perm);
556 kernel_to_ipc64_perm(&msq->q_perm, &p->msg_perm);
557 p->msg_stime = msq->q_stime;
558 p->msg_rtime = msq->q_rtime;
559 p->msg_ctime = msq->q_ctime;
561 p->msg_stime_high = msq->q_stime >> 32;
562 p->msg_rtime_high = msq->q_rtime >> 32;
563 p->msg_ctime_high = msq->q_ctime >> 32;
565 p->msg_cbytes = msq->q_cbytes;
566 p->msg_qnum = msq->q_qnum;
567 p->msg_qbytes = msq->q_qbytes;
568 p->msg_lspid = pid_vnr(msq->q_lspid);
569 p->msg_lrpid = pid_vnr(msq->q_lrpid);
582 err = msq->q_perm.id;
585 ipc_unlock_object(&msq->q_perm);
810 static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg,
815 list_for_each_entry_safe(msr, t, &msq->q_receivers, r_list) {
817 !security_msg_queue_msgrcv(&msq->q_perm, msg, msr->r_tsk,
827 ipc_update_pid(&msq->q_lrpid, task_pid(msr->r_tsk));
828 msq->q_rtime = ktime_get_real_seconds();
845 struct msg_queue *msq;
866 msq = msq_obtain_object_check(ns, msqid);
867 if (IS_ERR(msq)) {
868 err = PTR_ERR(msq);
872 ipc_lock_object(&msq->q_perm);
878 if (ipcperms(ns, &msq->q_perm, S_IWUGO))
882 if (!ipc_valid_object(&msq->q_perm)) {
887 err = security_msg_queue_msgsnd(&msq->q_perm, msg, msgflg);
891 if (msg_fits_inqueue(msq, msgsz))
901 ss_add(msq, &s, msgsz);
903 if (!ipc_rcu_getref(&msq->q_perm)) {
908 ipc_unlock_object(&msq->q_perm);
913 ipc_lock_object(&msq->q_perm);
915 ipc_rcu_putref(&msq->q_perm, msg_rcu_free);
917 if (!ipc_valid_object(&msq->q_perm)) {
930 ipc_update_pid(&msq->q_lspid, task_tgid(current));
931 msq->q_stime = ktime_get_real_seconds();
933 if (!pipelined_send(msq, msg, &wake_q)) {
935 list_add_tail(&msg->m_list, &msq->q_messages);
936 msq->q_cbytes += msgsz;
937 msq->q_qnum++;
946 ipc_unlock_object(&msq->q_perm);
1068 static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode)
1073 list_for_each_entry(msg, &msq->q_messages, m_list) {
1075 !security_msg_queue_msgrcv(&msq->q_perm, msg, current,
1096 struct msg_queue *msq;
1116 msq = msq_obtain_object_check(ns, msqid);
1117 if (IS_ERR(msq)) {
1120 return PTR_ERR(msq);
1127 if (ipcperms(ns, &msq->q_perm, S_IRUGO))
1130 ipc_lock_object(&msq->q_perm);
1133 if (!ipc_valid_object(&msq->q_perm)) {
1138 msg = find_msg(msq, &msgtyp, mode);
1158 msq->q_qnum--;
1159 msq->q_rtime = ktime_get_real_seconds();
1160 ipc_update_pid(&msq->q_lrpid, task_tgid(current));
1161 msq->q_cbytes -= msg->m_ts;
1164 ss_wakeup(msq, &wake_q, false);
1175 list_add_tail(&msr_d.r_list, &msq->q_receivers);
1190 ipc_unlock_object(&msq->q_perm);
1199 * msq:
1227 ipc_lock_object(&msq->q_perm);
1239 ipc_unlock_object(&msq->q_perm);
1243 ipc_unlock_object(&msq->q_perm);
1326 struct msg_queue *msq = container_of(ipcp, struct msg_queue, q_perm);
1330 msq->q_perm.key,
1331 msq->q_perm.id,
1332 msq->q_perm.mode,
1333 msq->q_cbytes,
1334 msq->q_qnum,
1335 pid_nr_ns(msq->q_lspid, pid_ns),
1336 pid_nr_ns(msq->q_lrpid, pid_ns),
1337 from_kuid_munged(user_ns, msq->q_perm.uid),
1338 from_kgid_munged(user_ns, msq->q_perm.gid),
1339 from_kuid_munged(user_ns, msq->q_perm.cuid),
1340 from_kgid_munged(user_ns, msq->q_perm.cgid),
1341 msq->q_stime,
1342 msq->q_rtime,
1343 msq->q_ctime);