Lines Matching defs:info

91 static void remove_notification(struct mqueue_inode_info *info);
121 static int msg_insert(struct msg_msg *msg, struct mqueue_inode_info *info)
126 p = &info->msg_tree.rb_node;
138 if (info->node_cache) {
139 leaf = info->node_cache;
140 info->node_cache = NULL;
146 info->qsize += sizeof(*leaf);
150 rb_insert_color(&leaf->rb_node, &info->msg_tree);
152 info->attr.mq_curmsgs++;
153 info->qsize += msg->m_ts;
158 static inline struct msg_msg *msg_get(struct mqueue_inode_info *info)
165 p = &info->msg_tree.rb_node;
176 if (info->attr.mq_curmsgs) {
180 info->attr.mq_curmsgs = 0;
189 rb_erase(&leaf->rb_node, &info->msg_tree);
190 if (info->node_cache) {
191 info->qsize -= sizeof(*leaf);
194 info->node_cache = leaf;
202 rb_erase(&leaf->rb_node, &info->msg_tree);
203 if (info->node_cache) {
204 info->qsize -= sizeof(*leaf);
207 info->node_cache = leaf;
211 info->attr.mq_curmsgs--;
212 info->qsize -= msg->m_ts;
235 struct mqueue_inode_info *info;
240 /* mqueue specific info */
241 info = MQUEUE_I(inode);
242 spin_lock_init(&info->lock);
243 init_waitqueue_head(&info->wait_q);
244 INIT_LIST_HEAD(&info->e_wait_q[0].list);
245 INIT_LIST_HEAD(&info->e_wait_q[1].list);
246 info->notify_owner = NULL;
247 info->notify_user_ns = NULL;
248 info->qsize = 0;
249 info->user = NULL; /* set when all is ok */
250 info->msg_tree = RB_ROOT;
251 info->node_cache = NULL;
252 memset(&info->attr, 0, sizeof(info->attr));
253 info->attr.mq_maxmsg = min(ipc_ns->mq_msg_max,
255 info->attr.mq_msgsize = min(ipc_ns->mq_msgsize_max,
258 info->attr.mq_maxmsg = attr->mq_maxmsg;
259 info->attr.mq_msgsize = attr->mq_msgsize;
274 mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) +
275 min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) *
278 mq_bytes = mq_treesize + (info->attr.mq_maxmsg *
279 info->attr.mq_msgsize);
285 /* mqueue_evict_inode() releases info->messages */
293 info->user = get_uid(u);
376 struct mqueue_inode_info *info;
388 info = MQUEUE_I(inode);
389 spin_lock(&info->lock);
390 while ((msg = msg_get(info)) != NULL)
392 kfree(info->node_cache);
393 spin_unlock(&info->lock);
396 mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) +
397 min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) *
400 mq_bytes = mq_treesize + (info->attr.mq_maxmsg *
401 info->attr.mq_msgsize);
403 user = info->user;
481 * to read only queue size & notification info (the only values
488 struct mqueue_inode_info *info = MQUEUE_I(file_inode(filp));
492 spin_lock(&info->lock);
495 info->qsize,
496 info->notify_owner ? info->notify.sigev_notify : 0,
497 (info->notify_owner &&
498 info->notify.sigev_notify == SIGEV_SIGNAL) ?
499 info->notify.sigev_signo : 0,
500 pid_vnr(info->notify_owner));
501 spin_unlock(&info->lock);
515 struct mqueue_inode_info *info = MQUEUE_I(file_inode(filp));
517 spin_lock(&info->lock);
518 if (task_tgid(current) == info->notify_owner)
519 remove_notification(info);
521 spin_unlock(&info->lock);
527 struct mqueue_inode_info *info = MQUEUE_I(file_inode(filp));
530 poll_wait(filp, &info->wait_q, poll_tab);
532 spin_lock(&info->lock);
533 if (info->attr.mq_curmsgs)
536 if (info->attr.mq_curmsgs < info->attr.mq_maxmsg)
538 spin_unlock(&info->lock);
543 /* Adds current to info->e_wait_q[sr] before element with smaller prio */
544 static void wq_add(struct mqueue_inode_info *info, int sr,
551 list_for_each_entry(walk, &info->e_wait_q[sr].list, list) {
557 list_add_tail(&ewp->list, &info->e_wait_q[sr].list);
565 static int wq_sleep(struct mqueue_inode_info *info, int sr,
571 wq_add(info, sr, ewp);
576 spin_unlock(&info->lock);
587 spin_lock(&info->lock);
603 spin_unlock(&info->lock);
612 struct mqueue_inode_info *info, int sr)
616 ptr = info->e_wait_q[sr].list.prev;
617 if (ptr == &info->e_wait_q[sr].list)
631 static void __do_notify(struct mqueue_inode_info *info)
638 if (info->notify_owner &&
639 info->attr.mq_curmsgs == 1) {
641 switch (info->notify.sigev_notify) {
647 sig_i.si_signo = info->notify.sigev_signo;
650 sig_i.si_value = info->notify.sigev_value;
651 /* map current pid/uid into info->owner's namespaces */
654 ns_of_pid(info->notify_owner));
655 sig_i.si_uid = from_kuid_munged(info->notify_user_ns, current_uid());
658 kill_pid_info(info->notify.sigev_signo,
659 &sig_i, info->notify_owner);
662 set_cookie(info->notify_cookie, NOTIFY_WOKENUP);
663 netlink_sendskb(info->notify_sock, info->notify_cookie);
667 put_pid(info->notify_owner);
668 put_user_ns(info->notify_user_ns);
669 info->notify_owner = NULL;
670 info->notify_user_ns = NULL;
672 wake_up(&info->wait_q);
687 static void remove_notification(struct mqueue_inode_info *info)
689 if (info->notify_owner != NULL &&
690 info->notify.sigev_notify == SIGEV_THREAD) {
691 set_cookie(info->notify_cookie, NOTIFY_REMOVED);
692 netlink_sendskb(info->notify_sock, info->notify_cookie);
694 put_pid(info->notify_owner);
695 put_user_ns(info->notify_user_ns);
696 info->notify_owner = NULL;
697 info->notify_user_ns = NULL;
922 static inline void pipelined_send(struct mqueue_inode_info *info,
936 static inline void pipelined_receive(struct mqueue_inode_info *info)
938 struct ext_wait_queue *sender = wq_get_first_waiter(info, SEND);
942 wake_up_interruptible(&info->wait_q);
945 if (msg_insert(sender->msg, info))
963 struct mqueue_inode_info *info;
992 info = MQUEUE_I(inode);
1000 if (unlikely(msg_len > info->attr.mq_msgsize)) {
1020 if (!info->node_cache)
1023 spin_lock(&info->lock);
1025 if (!info->node_cache && new_leaf) {
1028 info->node_cache = new_leaf;
1029 info->qsize += sizeof(*new_leaf);
1035 if (info->attr.mq_curmsgs == info->attr.mq_maxmsg) {
1042 ret = wq_sleep(info, SEND, timeout, &wait);
1044 * wq_sleep must be called with info->lock held, and
1050 receiver = wq_get_first_waiter(info, RECV);
1052 pipelined_send(info, msg_ptr, receiver);
1055 ret = msg_insert(msg_ptr, info);
1058 __do_notify(info);
1064 spin_unlock(&info->lock);
1082 struct mqueue_inode_info *info;
1108 info = MQUEUE_I(inode);
1117 if (unlikely(msg_len < info->attr.mq_msgsize)) {
1127 if (!info->node_cache)
1130 spin_lock(&info->lock);
1132 if (!info->node_cache && new_leaf) {
1135 info->node_cache = new_leaf;
1136 info->qsize += sizeof(*new_leaf);
1141 if (info->attr.mq_curmsgs == 0) {
1143 spin_unlock(&info->lock);
1148 ret = wq_sleep(info, RECV, timeout, &wait);
1152 msg_ptr = msg_get(info);
1158 pipelined_receive(info);
1159 spin_unlock(&info->lock);
1190 struct mqueue_inode_info *info;
1268 info = MQUEUE_I(inode);
1271 spin_lock(&info->lock);
1273 if (info->notify_owner == task_tgid(current)) {
1274 remove_notification(info);
1277 } else if (info->notify_owner != NULL) {
1282 info->notify.sigev_notify = SIGEV_NONE;
1285 info->notify_sock = sock;
1286 info->notify_cookie = nc;
1289 info->notify.sigev_notify = SIGEV_THREAD;
1292 info->notify.sigev_signo = notification.sigev_signo;
1293 info->notify.sigev_value = notification.sigev_value;
1294 info->notify.sigev_notify = SIGEV_SIGNAL;
1298 info->notify_owner = get_pid(task_tgid(current));
1299 info->notify_user_ns = get_user_ns(current_user_ns());
1302 spin_unlock(&info->lock);
1322 struct mqueue_inode_info *info;
1342 info = MQUEUE_I(inode);
1344 spin_lock(&info->lock);
1346 omqstat = info->attr;
1360 spin_unlock(&info->lock);