Lines Matching refs:qp
283 static int msgq_check_err(kmsqid_t *qp, int cvres);
351 kmsqid_t *qp = (kmsqid_t *)perm;
355 ASSERT(list_is_empty(&qp->msg_wait_snd[ii]));
356 ASSERT(list_is_empty(&qp->msg_wait_snd_ngt[ii]));
357 list_destroy(&qp->msg_wait_snd[ii]);
358 list_destroy(&qp->msg_wait_snd_ngt[ii]);
360 ASSERT(list_is_empty(&qp->msg_cpy_block));
361 ASSERT(list_is_empty(&qp->msg_wait_rcv));
362 list_destroy(&qp->msg_cpy_block);
363 ASSERT(qp->msg_snd_cnt == 0);
364 ASSERT(qp->msg_cbytes == 0);
365 list_destroy(&qp->msg_list);
366 list_destroy(&qp->msg_wait_rcv);
394 msgunlink(kmsqid_t *qp, struct msg *mp)
396 list_remove(&qp->msg_list, mp);
397 qp->msg_qnum--;
398 qp->msg_cbytes -= mp->msg_size;
402 msg_wakeup_senders(qp);
408 kmsqid_t *qp = (kmsqid_t *)perm;
413 while ((mp = list_head(&qp->msg_list)) != NULL)
414 msgunlink(qp, mp);
415 ASSERT(qp->msg_cbytes == 0);
422 msg_rcvq_wakeup_all(&qp->msg_wait_snd[ii]);
423 msg_rcvq_wakeup_all(&qp->msg_wait_snd_ngt[ii]);
425 msg_rcvq_wakeup_all(&qp->msg_cpy_block);
426 msg_rcvq_wakeup_all(&qp->msg_wait_rcv);
439 kmsqid_t *qp; /* ptr to associated q */
473 if ((lock = ipc_lookup(msq_svc, msgid, (kipc_perm_t **)&qp)) == NULL)
478 if (STRUCT_FGET(ds, msg_qbytes) > qp->msg_qbytes &&
483 if (error = ipcperm_set(msq_svc, cr, &qp->msg_perm,
488 qp->msg_qbytes = STRUCT_FGET(ds, msg_qbytes);
489 qp->msg_ctime = gethrestime_sec();
493 if (error = ipcperm_access(&qp->msg_perm, MSG_R, cr)) {
498 if (qp->msg_rcv_cnt)
499 qp->msg_perm.ipc_mode |= MSG_RWAIT;
500 if (qp->msg_snd_cnt)
501 qp->msg_perm.ipc_mode |= MSG_WWAIT;
502 ipcperm_stat(&STRUCT_BUF(ds)->msg_perm, &qp->msg_perm, mdl);
503 qp->msg_perm.ipc_mode &= ~(MSG_RWAIT|MSG_WWAIT);
506 STRUCT_FSET(ds, msg_cbytes, qp->msg_cbytes);
507 STRUCT_FSET(ds, msg_qnum, qp->msg_qnum);
508 STRUCT_FSET(ds, msg_qbytes, qp->msg_qbytes);
509 STRUCT_FSET(ds, msg_lspid, qp->msg_lspid);
510 STRUCT_FSET(ds, msg_lrpid, qp->msg_lrpid);
511 STRUCT_FSET(ds, msg_stime, qp->msg_stime);
512 STRUCT_FSET(ds, msg_rtime, qp->msg_rtime);
513 STRUCT_FSET(ds, msg_ctime, qp->msg_ctime);
518 if ((ds64.msgx_qbytes > qp->msg_qbytes) &&
527 if (error = ipcperm_set64(msq_svc, cr, &qp->msg_perm,
532 qp->msg_qbytes = ds64.msgx_qbytes;
533 qp->msg_ctime = gethrestime_sec();
537 if (qp->msg_rcv_cnt)
538 qp->msg_perm.ipc_mode |= MSG_RWAIT;
539 if (qp->msg_snd_cnt)
540 qp->msg_perm.ipc_mode |= MSG_WWAIT;
541 ipcperm_stat64(&ds64.msgx_perm, &qp->msg_perm);
542 qp->msg_perm.ipc_mode &= ~(MSG_RWAIT|MSG_WWAIT);
543 ds64.msgx_cbytes = qp->msg_cbytes;
544 ds64.msgx_qnum = qp->msg_qnum;
545 ds64.msgx_qbytes = qp->msg_qbytes;
546 ds64.msgx_lspid = qp->msg_lspid;
547 ds64.msgx_lrpid = qp->msg_lrpid;
548 ds64.msgx_stime = qp->msg_stime;
549 ds64.msgx_rtime = qp->msg_rtime;
550 ds64.msgx_ctime = qp->msg_ctime;
595 kmsqid_t *qp;
602 if (error = ipc_get(msq_svc, key, msgflg, (kipc_perm_t **)&qp, &lock))
605 if (IPC_FREE(&qp->msg_perm)) {
609 list_create(&qp->msg_list, sizeof (struct msg),
611 qp->msg_qnum = 0;
612 qp->msg_lspid = qp->msg_lrpid = 0;
613 qp->msg_stime = qp->msg_rtime = 0;
614 qp->msg_ctime = gethrestime_sec();
615 qp->msg_ngt_cnt = 0;
616 qp->msg_neg_copy = 0;
618 list_create(&qp->msg_wait_snd[ii],
621 list_create(&qp->msg_wait_snd_ngt[ii],
631 qp->msg_lowest_type = MSG_SMALL_INIT;
632 list_create(&qp->msg_cpy_block,
635 list_create(&qp->msg_wait_rcv,
638 qp->msg_fnd_sndr = &msg_fnd_sndr[0];
639 qp->msg_fnd_rdr = &msg_fnd_rdr[0];
640 qp->msg_rcv_cnt = 0;
641 qp->msg_snd_cnt = 0;
642 qp->msg_snd_smallest = MSG_SMALL_INIT;
645 (kipc_perm_t *)qp)) {
650 qp->msg_qbytes = rctl_enforced_value(rc_process_msgmnb,
652 qp->msg_qmax = rctl_enforced_value(rc_process_msgtql,
654 lock = ipc_commit_end(msq_svc, &qp->msg_perm);
658 audit_ipcget(AT_IPC_MSG, (void *)qp);
660 id = qp->msg_perm.ipc_id;
669 kmsqid_t *qp; /* ptr to associated q */
680 if ((lock = ipc_lookup(msq_svc, msqid, (kipc_perm_t **)&qp)) == NULL) {
683 ipc_hold(msq_svc, (kipc_perm_t *)qp);
685 if (error = ipcperm_access(&qp->msg_perm, MSG_R, CRED())) {
697 smp = msgrcv_lookup(qp, msgtyp);
710 error = msg_copyout(qp, msgtyp, &lock, &xtsz, msgsz,
723 msg_wakeup_rdr(qp, &qp->msg_fnd_sndr, t);
729 msg_wakeup_rdr(qp, &qp->msg_fnd_rdr, 0);
738 cvres = msg_rcvq_sleep(&qp->msg_cpy_block,
739 &msg_entry, &lock, qp);
740 error = msgq_check_err(qp, cvres);
754 msg_wakeup_rdr(qp, &qp->msg_fnd_rdr, 0);
762 cvres = msg_rcvq_sleep(&qp->msg_wait_snd[msg_hash],
763 &msg_entry, &lock, qp);
765 qp->msg_ngt_cnt++;
766 cvres = msg_rcvq_sleep(&qp->msg_wait_snd_ngt[msg_hash],
767 &msg_entry, &lock, qp);
768 qp->msg_ngt_cnt--;
771 if (!(error = msgq_check_err(qp, cvres))) {
777 msg_wakeup_rdr(qp, &qp->msg_fnd_rdr, 0);
779 msg_wakeup_rdr(qp, &qp->msg_fnd_sndr,
782 ipc_rele(msq_svc, (kipc_perm_t *)qp);
785 ipc_rele(msq_svc, (kipc_perm_t *)qp);
790 msgq_check_err(kmsqid_t *qp, int cvres)
792 if (IPC_FREE(&qp->msg_perm)) {
804 msg_copyout(kmsqid_t *qp, long msgtyp, kmutex_t **lock, size_t *xtsz_ret,
833 ASSERT(qp->msg_neg_copy == 0);
834 qp->msg_neg_copy = 1;
860 *lock = ipc_lock(msq_svc, qp->msg_perm.ipc_id);
862 qp->msg_neg_copy = 0;
867 if (IPC_FREE(&qp->msg_perm)) {
873 qp->msg_lrpid = ttoproc(curthread)->p_pid;
874 qp->msg_rtime = gethrestime_sec();
875 msgunlink(qp, smp);
880 msgrcv_lookup(kmsqid_t *qp, long msgtyp)
888 mp = list_head(&qp->msg_list);
892 qp_low = qp->msg_lowest_type;
903 for (; mp; mp = list_next(&qp->msg_list, mp)) {
922 if (qp->msg_neg_copy) {
926 for (; mp; mp = list_next(&qp->msg_list, mp)) {
940 qp->msg_lowest_type = smp->msg_type;
971 kmsqid_t *qp; /* ptr to associated q */
987 if ((lock = ipc_lookup(msq_svc, msqid, (kipc_perm_t **)&qp)) == NULL)
990 if (error = ipcperm_access(&qp->msg_perm, MSG_R, CRED())) {
994 ipc_hold(msq_svc, (kipc_perm_t *)qp);
1001 for (mp = list_head(&qp->msg_list); mp;
1002 mp = list_next(&qp->msg_list, mp)) {
1025 for (mp = list_head(&qp->msg_list); mp;
1026 mp = list_next(&qp->msg_list, mp)) {
1069 lock = ipc_lock(msq_svc, qp->msg_perm.ipc_id);
1072 if (IPC_FREE(&qp->msg_perm))
1077 (void) ipc_lock(msq_svc, qp->msg_perm.ipc_id);
1078 ipc_rele(msq_svc, (kipc_perm_t *)qp);
1096 kmsqid_t *qp;
1147 if ((lock = ipc_lookup(msq_svc, msqid, (kipc_perm_t **)&qp)) == NULL) {
1152 ipc_hold(msq_svc, (kipc_perm_t *)qp);
1154 if (msgsz > qp->msg_qbytes) {
1159 if (error = ipcperm_access(&qp->msg_perm, MSG_W, CRED()))
1166 ASSERT(qp->msg_qnum <= qp->msg_qmax);
1167 while ((msgsz > qp->msg_qbytes - qp->msg_cbytes) ||
1168 (qp->msg_qnum == qp->msg_qmax)) {
1177 qp->msg_snd_cnt++;
1182 list_insert_tail(&qp->msg_wait_rcv, &msg_entry);
1183 if (qp->msg_snd_smallest > msgsz)
1184 qp->msg_snd_smallest = msgsz;
1186 lock = ipc_relock(msq_svc, qp->msg_perm.ipc_id, lock);
1187 qp->msg_snd_cnt--;
1189 list_remove(&qp->msg_wait_rcv, &msg_entry);
1190 if (error = msgq_check_err(qp, cvres)) {
1208 lock = ipc_lock(msq_svc, qp->msg_perm.ipc_id);
1209 if (IPC_FREE(&qp->msg_perm)) {
1223 qp->msg_qnum++;
1224 qp->msg_cbytes += msgsz;
1225 qp->msg_lspid = curproc->p_pid;
1226 qp->msg_stime = gethrestime_sec();
1228 if (qp->msg_lowest_type > type)
1229 qp->msg_lowest_type = type;
1230 list_insert_tail(&qp->msg_list, mp);
1234 msg_wakeup_rdr(qp, &qp->msg_fnd_sndr, type);
1245 msg_wakeup_senders(qp);
1248 ipc_rele(msq_svc, (kipc_perm_t *)qp); /* drops lock */
1260 msg_wakeup_rdr(kmsqid_t *qp, msg_select_t **flist, long type)
1269 wakeup = walker->selection(qp, msg_hash, type);
1314 msg_fnd_any_snd(kmsqid_t *qp, int msg_hash, long type)
1318 walker = list_head(&qp->msg_wait_snd[0]);
1321 list_remove(&qp->msg_wait_snd[0], walker);
1327 msg_fnd_any_rdr(kmsqid_t *qp, int msg_hash, long type)
1331 walker = list_head(&qp->msg_cpy_block);
1333 list_remove(&qp->msg_cpy_block, walker);
1338 msg_fnd_spc_snd(kmsqid_t *qp, int msg_hash, long type)
1342 walker = list_head(&qp->msg_wait_snd[msg_hash]);
1345 walker = list_next(&qp->msg_wait_snd[msg_hash], walker);
1347 list_remove(&qp->msg_wait_snd[msg_hash], walker);
1353 msg_fnd_neg_snd(kmsqid_t *qp, int msg_hash, long type)
1361 if (!qp->msg_ngt_cnt) {
1376 check_index = neg_index + (qp->msg_stime % nbuckets);
1379 qptr = list_head(&qp->msg_wait_snd_ngt[check_index]);
1389 list_remove(&qp->msg_wait_snd_ngt[check_index],
1393 qptr = list_next(&qp->msg_wait_snd_ngt[check_index],
1405 kmsqid_t *qp)
1413 qp->msg_rcv_cnt++;
1415 *lock = ipc_relock(msq_svc, qp->msg_perm.ipc_id, *lock);
1416 qp->msg_rcv_cnt--;
1483 msg_wakeup_senders(kmsqid_t *qp)
1494 if (IPC_FREE(&qp->msg_perm) || qp->msg_qnum >= qp->msg_qmax)
1497 avail = qp->msg_qbytes - qp->msg_cbytes;
1498 if (avail < qp->msg_snd_smallest)
1501 ptr = list_head(&qp->msg_wait_rcv);
1503 qp->msg_snd_smallest = MSG_SMALL_INIT;
1519 msgs_out = qp->msg_qnum;
1521 ptr = list_next(&qp->msg_wait_rcv, ptr);
1523 list_remove(&qp->msg_wait_rcv, optr);
1527 if (msgs_out == qp->msg_qmax ||
1528 avail < qp->msg_snd_smallest)
1541 qp->msg_snd_smallest = smallest;