Lines Matching refs:ct

260 contract_dtor(contract_t *ct)  in contract_dtor()  argument
262 cte_queue_destroy(&ct->ct_events); in contract_dtor()
263 list_destroy(&ct->ct_vnodes); in contract_dtor()
264 mutex_destroy(&ct->ct_reflock); in contract_dtor()
265 mutex_destroy(&ct->ct_lock); in contract_dtor()
266 mutex_destroy(&ct->ct_evtlock); in contract_dtor()
284 contract_ctor(contract_t *ct, ct_type_t *type, ct_template_t *tmpl, void *data, in contract_ctor() argument
292 mutex_init(&ct->ct_lock, NULL, MUTEX_DEFAULT, NULL); in contract_ctor()
293 mutex_init(&ct->ct_reflock, NULL, MUTEX_DEFAULT, NULL); in contract_ctor()
294 mutex_init(&ct->ct_evtlock, NULL, MUTEX_DEFAULT, NULL); in contract_ctor()
295 ct->ct_id = id_alloc(contract_ids); in contract_ctor()
297 cte_queue_create(&ct->ct_events, CTEL_CONTRACT, 20, 0); in contract_ctor()
298 list_create(&ct->ct_vnodes, sizeof (contract_vnode_t), in contract_ctor()
304 ct->ct_ref = 2; /* one for the holder, one for "latest" */ in contract_ctor()
305 ct->ct_cuid = crgetuid(CRED()); in contract_ctor()
306 ct->ct_type = type; in contract_ctor()
307 ct->ct_data = data; in contract_ctor()
308 gethrestime(&ct->ct_ctime); in contract_ctor()
309 ct->ct_state = CTS_OWNED; in contract_ctor()
310 ct->ct_flags = flags; in contract_ctor()
311 ct->ct_regent = author->p_ct_process ? in contract_ctor()
313 ct->ct_ev_info = tmpl->ctmpl_ev_info; in contract_ctor()
314 ct->ct_ev_crit = tmpl->ctmpl_ev_crit; in contract_ctor()
315 ct->ct_cookie = tmpl->ctmpl_cookie; in contract_ctor()
316 ct->ct_owner = author; in contract_ctor()
317 ct->ct_ntime.ctm_total = -1; in contract_ctor()
318 ct->ct_qtime.ctm_total = -1; in contract_ctor()
319 ct->ct_nevent = NULL; in contract_ctor()
329 id_free(contract_ids, ct->ct_id); in contract_ctor()
332 ct->ct_events.ctq_flags |= CTQ_DEAD; in contract_ctor()
333 contract_dtor(ct); in contract_ctor()
336 ct->ct_proj = author->p_task->tk_proj; in contract_ctor()
337 ct->ct_proj->kpj_data.kpd_contract++; in contract_ctor()
338 (void) project_hold(ct->ct_proj); in contract_ctor()
347 ct->ct_zoneid = author->p_zone->zone_id; in contract_ctor()
348 ct->ct_czuniqid = ct->ct_mzuniqid = author->p_zone->zone_uniqid; in contract_ctor()
349 VERIFY(avl_find(&author->p_ct_held, ct, &where) == NULL); in contract_ctor()
350 avl_insert(&author->p_ct_held, ct, where); in contract_ctor()
357 VERIFY(avl_find(&contract_avl, ct, &where) == NULL); in contract_ctor()
358 avl_insert(&contract_avl, ct, where); in contract_ctor()
365 VERIFY(avl_find(&type->ct_type_avl, ct, &where) == NULL); in contract_ctor()
366 avl_insert(&type->ct_type_avl, ct, where); in contract_ctor()
367 type->ct_type_timestruc = ct->ct_ctime; in contract_ctor()
372 curlwp->lwp_ct_latest[type->ct_type_index] = ct; in contract_ctor()
387 contract_rele(contract_t *ct) in contract_rele() argument
391 mutex_enter(&ct->ct_reflock); in contract_rele()
392 ASSERT(ct->ct_ref > 0); in contract_rele()
393 nref = --ct->ct_ref; in contract_rele()
394 mutex_exit(&ct->ct_reflock); in contract_rele()
399 ASSERT(ct->ct_owner == NULL); in contract_rele()
400 ASSERT(ct->ct_evcnt == 0); in contract_rele()
406 avl_remove(&contract_avl, ct); in contract_rele()
412 mutex_enter(&ct->ct_type->ct_type_lock); in contract_rele()
413 avl_remove(&ct->ct_type->ct_type_avl, ct); in contract_rele()
414 mutex_exit(&ct->ct_type->ct_type_lock); in contract_rele()
419 id_free(contract_ids, ct->ct_id); in contract_rele()
425 ct->ct_proj->kpj_data.kpd_contract--; in contract_rele()
426 project_rele(ct->ct_proj); in contract_rele()
432 contract_dtor(ct); in contract_rele()
433 ct->ct_type->ct_type_ops->contop_free(ct); in contract_rele()
443 contract_hold(contract_t *ct) in contract_hold() argument
445 mutex_enter(&ct->ct_reflock); in contract_hold()
446 ASSERT(ct->ct_ref < UINT64_MAX); in contract_hold()
447 ct->ct_ref++; in contract_hold()
448 mutex_exit(&ct->ct_reflock); in contract_hold()
460 contract_getzuniqid(contract_t *ct) in contract_getzuniqid() argument
464 mutex_enter(&ct->ct_reflock); in contract_getzuniqid()
465 zuniqid = ct->ct_mzuniqid; in contract_getzuniqid()
466 mutex_exit(&ct->ct_reflock); in contract_getzuniqid()
477 contract_setzuniqid(contract_t *ct, uint64_t zuniqid) in contract_setzuniqid() argument
479 mutex_enter(&ct->ct_reflock); in contract_setzuniqid()
480 ct->ct_mzuniqid = zuniqid; in contract_setzuniqid()
481 mutex_exit(&ct->ct_reflock); in contract_setzuniqid()
494 contract_abandon(contract_t *ct, proc_t *p, int explicit) in contract_abandon() argument
502 mutex_enter(&ct->ct_lock); in contract_abandon()
509 if (!explicit && (ct->ct_flags & CTF_INHERIT) && in contract_abandon()
511 mutex_exit(&ct->ct_lock); in contract_abandon()
513 mutex_enter(&ct->ct_lock); in contract_abandon()
517 if (ct->ct_owner != p) { in contract_abandon()
518 mutex_exit(&ct->ct_lock); in contract_abandon()
526 avl_remove(&p->p_ct_held, ct); in contract_abandon()
527 ct->ct_owner = NULL; in contract_abandon()
535 q = p->p_ct_equeue[ct->ct_type->ct_type_index]; in contract_abandon()
546 contract_hold(ct); in contract_abandon()
549 ct->ct_state = CTS_INHERITED; in contract_abandon()
550 VERIFY(ct->ct_regent == parent); in contract_abandon()
551 contract_process_take(parent, ct); in contract_abandon()
558 mutex_exit(&ct->ct_lock); in contract_abandon()
561 ct->ct_regent = NULL; in contract_abandon()
562 ct->ct_type->ct_type_ops->contop_abandon(ct); in contract_abandon()
571 cte_trim(q, ct); in contract_abandon()
575 contract_rele(ct); in contract_abandon()
581 contract_newct(contract_t *ct) in contract_newct() argument
583 return (ct->ct_type->ct_type_ops->contop_newct(ct)); in contract_newct()
595 contract_adopt(contract_t *ct, proc_t *p) in contract_adopt() argument
607 (void) contract_type_pbundle(ct->ct_type, p); in contract_adopt()
609 mutex_enter(&ct->ct_lock); in contract_adopt()
610 parent = ct->ct_regent; in contract_adopt()
611 if (ct->ct_state != CTS_INHERITED || in contract_adopt()
613 p->p_zone->zone_uniqid != ct->ct_czuniqid) { in contract_adopt()
614 mutex_exit(&ct->ct_lock); in contract_adopt()
621 mutex_exit(&ct->ct_lock); in contract_adopt()
623 mutex_enter(&ct->ct_lock); in contract_adopt()
631 if (ct->ct_state != CTS_INHERITED) { in contract_adopt()
633 mutex_exit(&ct->ct_lock); in contract_adopt()
636 ASSERT(ct->ct_regent == parent); in contract_adopt()
638 ct->ct_state = CTS_OWNED; in contract_adopt()
640 contract_process_adopt(ct, p); in contract_adopt()
643 ct->ct_owner = p; in contract_adopt()
644 VERIFY(avl_find(&p->p_ct_held, ct, &where) == NULL); in contract_adopt()
645 avl_insert(&p->p_ct_held, ct, where); in contract_adopt()
648 ASSERT(ct->ct_owner->p_ct_equeue); in contract_adopt()
649 ASSERT(ct->ct_owner->p_ct_equeue[ct->ct_type->ct_type_index]); in contract_adopt()
650 q = ct->ct_owner->p_ct_equeue[ct->ct_type->ct_type_index]; in contract_adopt()
651 cte_copy(&ct->ct_events, q); in contract_adopt()
652 mutex_exit(&ct->ct_lock); in contract_adopt()
663 contract_ack(contract_t *ct, uint64_t evid, int ack) in contract_ack() argument
666 list_t *queue = &ct->ct_events.ctq_events; in contract_ack()
673 mutex_enter(&ct->ct_lock); in contract_ack()
674 mutex_enter(&ct->ct_events.ctq_lock); in contract_ack()
686 ct->ct_evcnt--; in contract_ack()
693 mutex_exit(&ct->ct_events.ctq_lock); in contract_ack()
694 mutex_exit(&ct->ct_lock); in contract_ack()
705 error = ct->ct_type->ct_type_ops->contop_ack(ct, evtype, evid); in contract_ack()
707 error = ct->ct_type->ct_type_ops->contop_nack(ct, evtype, evid); in contract_ack()
714 contract_ack_inval(contract_t *ct, uint_t evtype, uint64_t evid) in contract_ack_inval() argument
717 ct->ct_id); in contract_ack_inval()
723 contract_qack_inval(contract_t *ct, uint_t evtype, uint64_t evid) in contract_qack_inval() argument
726 ct->ct_id); in contract_qack_inval()
732 contract_qack_notsup(contract_t *ct, uint_t evtype, uint64_t evid) in contract_qack_notsup() argument
743 contract_qack(contract_t *ct, uint64_t evid) in contract_qack() argument
746 list_t *queue = &ct->ct_events.ctq_events; in contract_qack()
750 mutex_enter(&ct->ct_lock); in contract_qack()
751 mutex_enter(&ct->ct_events.ctq_lock); in contract_qack()
762 mutex_exit(&ct->ct_events.ctq_lock); in contract_qack()
763 mutex_exit(&ct->ct_lock); in contract_qack()
773 return (ct->ct_type->ct_type_ops->contop_qack(ct, evtype, evid)); in contract_qack()
783 contract_orphan(contract_t *ct) in contract_orphan() argument
786 list_t *queue = &ct->ct_events.ctq_events; in contract_orphan()
788 ASSERT(MUTEX_HELD(&ct->ct_lock)); in contract_orphan()
789 ASSERT(ct->ct_state != CTS_ORPHAN); in contract_orphan()
791 mutex_enter(&ct->ct_events.ctq_lock); in contract_orphan()
792 ct->ct_state = CTS_ORPHAN; in contract_orphan()
796 ct->ct_evcnt--; in contract_orphan()
799 mutex_exit(&ct->ct_events.ctq_lock); in contract_orphan()
801 ASSERT(ct->ct_evcnt == 0); in contract_orphan()
814 contract_destroy(contract_t *ct) in contract_destroy() argument
816 ASSERT(MUTEX_HELD(&ct->ct_lock)); in contract_destroy()
817 ASSERT(ct->ct_state != CTS_DEAD); in contract_destroy()
818 ASSERT(ct->ct_owner == NULL); in contract_destroy()
820 ct->ct_state = CTS_DEAD; in contract_destroy()
821 cte_queue_drain(&ct->ct_events, 1); in contract_destroy()
822 mutex_exit(&ct->ct_lock); in contract_destroy()
823 mutex_enter(&ct->ct_type->ct_type_events.ctq_lock); in contract_destroy()
824 cte_trim(&ct->ct_type->ct_type_events, ct); in contract_destroy()
825 mutex_exit(&ct->ct_type->ct_type_events.ctq_lock); in contract_destroy()
826 mutex_enter(&ct->ct_lock); in contract_destroy()
827 ct->ct_type->ct_type_ops->contop_destroy(ct); in contract_destroy()
828 mutex_exit(&ct->ct_lock); in contract_destroy()
829 contract_rele(ct); in contract_destroy()
840 contract_vnode_get(contract_t *ct, vfs_t *vfsp) in contract_vnode_get() argument
845 mutex_enter(&ct->ct_lock); in contract_vnode_get()
846 for (ctv = list_head(&ct->ct_vnodes); ctv != NULL; in contract_vnode_get()
847 ctv = list_next(&ct->ct_vnodes, ctv)) in contract_vnode_get()
853 mutex_exit(&ct->ct_lock); in contract_vnode_get()
866 contract_vnode_set(contract_t *ct, contract_vnode_t *ctv, vnode_t *vnode) in contract_vnode_set() argument
868 mutex_enter(&ct->ct_lock); in contract_vnode_set()
870 list_insert_head(&ct->ct_vnodes, ctv); in contract_vnode_set()
871 mutex_exit(&ct->ct_lock); in contract_vnode_set()
883 contract_vnode_clear(contract_t *ct, contract_vnode_t *ctv) in contract_vnode_clear() argument
888 mutex_enter(&ct->ct_lock); in contract_vnode_clear()
891 list_remove(&ct->ct_vnodes, ctv); in contract_vnode_clear()
898 mutex_exit(&ct->ct_lock); in contract_vnode_clear()
912 contract_t *ct; in contract_exit() local
926 while ((ct = avl_destroy_nodes(&p->p_ct_held, &cookie)) != NULL) in contract_exit()
927 VERIFY(contract_abandon(ct, p, 0) == 0); in contract_exit()
964 contract_status_common(contract_t *ct, zone_t *zone, void *status, in contract_status_common() argument
970 ASSERT(MUTEX_HELD(&ct->ct_lock)); in contract_status_common()
972 zone->zone_uniqid == ct->ct_czuniqid) { in contract_status_common()
981 if (zone->zone_uniqid == ct->ct_czuniqid || in contract_status_common()
982 ct->ct_czuniqid == GLOBAL_ZONEUNIQID) { in contract_status_common()
983 zoneid = ct->ct_zoneid; in contract_status_common()
984 } else if ((czone = zone_find_by_id(ct->ct_zoneid)) != NULL) { in contract_status_common()
985 if (czone->zone_uniqid == ct->ct_mzuniqid) in contract_status_common()
986 zoneid = ct->ct_zoneid; in contract_status_common()
992 (ct->ct_state == CTS_OWNED) ? ct->ct_owner->p_pid : in contract_status_common()
993 (ct->ct_state == CTS_INHERITED) ? ct->ct_regent->ct_id : 0); in contract_status_common()
994 STRUCT_FSET(lstatus, ctst_state, ct->ct_state); in contract_status_common()
1007 STRUCT_FSET(lstatus, ctst_holder, (ct->ct_state < CTS_ORPHAN) ? in contract_status_common()
1009 STRUCT_FSET(lstatus, ctst_state, (ct->ct_state < CTS_ORPHAN) ? in contract_status_common()
1010 CTS_OWNED : ct->ct_state); in contract_status_common()
1012 STRUCT_FSET(lstatus, ctst_nevents, ct->ct_evcnt); in contract_status_common()
1013 STRUCT_FSET(lstatus, ctst_ntime, get_time_left(&ct->ct_ntime)); in contract_status_common()
1014 STRUCT_FSET(lstatus, ctst_qtime, get_time_left(&ct->ct_qtime)); in contract_status_common()
1016 ct->ct_nevent ? ct->ct_nevent->cte_id : 0); in contract_status_common()
1017 STRUCT_FSET(lstatus, ctst_critical, ct->ct_ev_crit); in contract_status_common()
1018 STRUCT_FSET(lstatus, ctst_informative, ct->ct_ev_info); in contract_status_common()
1019 STRUCT_FSET(lstatus, ctst_cookie, ct->ct_cookie); in contract_status_common()
1020 STRUCT_FSET(lstatus, ctst_type, ct->ct_type->ct_type_index); in contract_status_common()
1021 STRUCT_FSET(lstatus, ctst_id, ct->ct_id); in contract_status_common()
1032 contract_checkcred(contract_t *ct, const cred_t *cr) in contract_checkcred() argument
1037 mutex_enter(&ct->ct_lock); in contract_checkcred()
1038 if ((p = ct->ct_owner) != NULL) { in contract_checkcred()
1043 mutex_exit(&ct->ct_lock); in contract_checkcred()
1057 contract_owned(contract_t *ct, const cred_t *cr, int locked) in contract_owned() argument
1063 ASSERT(locked || MUTEX_NOT_HELD(&ct->ct_lock)); in contract_owned()
1066 mzuniqid = contract_getzuniqid(ct); in contract_owned()
1077 owner = (ct->ct_owner == curproc); in contract_owned()
1078 cmatch = (zuniqid == ct->ct_czuniqid) && in contract_owned()
1079 ((ct->ct_cuid == euid) || (!locked && contract_checkcred(ct, cr))); in contract_owned()
1080 zmatch = (ct->ct_czuniqid != mzuniqid) && (zuniqid == mzuniqid) && in contract_owned()
1144 contract_t *ct; in contract_type_max() local
1148 ct = avl_last(&type->ct_type_avl); in contract_type_max()
1149 res = ct ? ct->ct_id : -1; in contract_type_max()
1163 contract_t *ct; in contract_max() local
1167 ct = avl_last(&contract_avl); in contract_max()
1168 res = ct ? ct->ct_id : -1; in contract_max()
1184 contract_t template, *ct; in contract_lookup_common() local
1189 ct = avl_find(tree, &template, &where); in contract_lookup_common()
1190 if (ct == NULL) in contract_lookup_common()
1191 ct = avl_nearest(tree, where, AVL_AFTER); in contract_lookup_common()
1193 while (ct && (contract_getzuniqid(ct) != zuniqid)) in contract_lookup_common()
1194 ct = AVL_NEXT(tree, ct); in contract_lookup_common()
1195 res = ct ? ct->ct_id : -1; in contract_lookup_common()
1247 contract_t template, *ct; in contract_plookup() local
1256 ct = avl_find(&contract_avl, &template, &where); in contract_plookup()
1257 if (ct == NULL) in contract_plookup()
1258 ct = avl_nearest(&contract_avl, where, AVL_AFTER); in contract_plookup()
1259 while (ct && !(ct->ct_state < CTS_ORPHAN && in contract_plookup()
1260 contract_getzuniqid(ct) == zuniqid && in contract_plookup()
1261 ct->ct_czuniqid == GLOBAL_ZONEUNIQID)) in contract_plookup()
1262 ct = AVL_NEXT(&contract_avl, ct); in contract_plookup()
1263 res = ct ? ct->ct_id : -1; in contract_plookup()
1267 ct = avl_find(&p->p_ct_held, &template, &where); in contract_plookup()
1268 if (ct == NULL) in contract_plookup()
1269 ct = avl_nearest(&p->p_ct_held, where, AVL_AFTER); in contract_plookup()
1270 res = ct ? ct->ct_id : -1; in contract_plookup()
1287 contract_t template, *ct; in contract_ptr_common() local
1290 ct = avl_find(tree, &template, NULL); in contract_ptr_common()
1291 if (ct == NULL || (zuniqid != GLOBAL_ZONEUNIQID && in contract_ptr_common()
1292 contract_getzuniqid(ct) != zuniqid)) { in contract_ptr_common()
1301 mutex_enter(&ct->ct_reflock); in contract_ptr_common()
1302 if (ct->ct_ref) { in contract_ptr_common()
1303 ct->ct_ref++; in contract_ptr_common()
1304 mutex_exit(&ct->ct_reflock); in contract_ptr_common()
1306 mutex_exit(&ct->ct_reflock); in contract_ptr_common()
1307 ct = NULL; in contract_ptr_common()
1310 return (ct); in contract_ptr_common()
1323 contract_t *ct; in contract_type_ptr() local
1326 ct = contract_ptr_common(&type->ct_type_avl, id, zuniqid); in contract_type_ptr()
1329 return (ct); in contract_type_ptr()
1342 contract_t *ct; in contract_ptr() local
1345 ct = contract_ptr_common(&contract_avl, id, zuniqid); in contract_ptr()
1348 return (ct); in contract_ptr()
1915 contract_t *ct = e->cte_contract; in cte_checkcred() local
1919 result = curproc->p_zone->zone_uniqid == ct->ct_czuniqid && in cte_checkcred()
1920 contract_checkcred(ct, cr); in cte_checkcred()
1939 contract_t *ct; in cte_qreadable() local
1949 ct = e->cte_contract; in cte_qreadable()
1957 zuniqid != contract_getzuniqid(ct))) { in cte_qreadable()
1969 } else if (cr != NULL && !contract_owned(ct, cr, B_TRUE)) { in cte_qreadable()
2120 cte_trim(ct_equeue_t *q, contract_t *ct) in cte_trim() argument
2135 (e->cte_contract == ct)) { in cte_trim()
2142 } else if ((e->cte_contract == ct) && !stopper) { in cte_trim()
2145 } else if (ct && !stopper) { in cte_trim()
2291 cte_publish_all(contract_t *ct, ct_kevent_t *e, nvlist_t *data, nvlist_t *gdata) in cte_publish_all() argument
2299 e->cte_contract = ct; in cte_publish_all()
2303 evid = e->cte_id = atomic_inc_64_nv(&ct->ct_type->ct_type_evid); in cte_publish_all()
2304 contract_hold(ct); in cte_publish_all()
2313 ct->ct_nevent = e; in cte_publish_all()
2325 mutex_enter(&ct->ct_evtlock); in cte_publish_all()
2331 mutex_enter(&ct->ct_lock); in cte_publish_all()
2332 mutex_enter(&ct->ct_events.ctq_lock); in cte_publish_all()
2334 if (ct->ct_state >= CTS_ORPHAN) in cte_publish_all()
2337 ct->ct_evcnt++; in cte_publish_all()
2339 mutex_exit(&ct->ct_lock); in cte_publish_all()
2340 cte_publish(&ct->ct_events, e, &ts, B_FALSE); in cte_publish_all()
2346 mutex_enter(&ct->ct_type->ct_type_events.ctq_lock); in cte_publish_all()
2347 cte_publish(&ct->ct_type->ct_type_events, e, &ts, B_FALSE); in cte_publish_all()
2353 mutex_enter(&ct->ct_lock); in cte_publish_all()
2354 if (ct->ct_owner) { in cte_publish_all()
2359 ASSERT(ct->ct_owner->p_ct_equeue); in cte_publish_all()
2360 ASSERT(ct->ct_owner->p_ct_equeue[ct->ct_type->ct_type_index]); in cte_publish_all()
2361 q = ct->ct_owner->p_ct_equeue[ct->ct_type->ct_type_index]; in cte_publish_all()
2363 mutex_exit(&ct->ct_lock); in cte_publish_all()
2373 mutex_exit(&ct->ct_lock); in cte_publish_all()
2378 mutex_enter(&ct->ct_lock); in cte_publish_all()
2379 negev = ct->ct_nevent; in cte_publish_all()
2380 ct->ct_nevent = NULL; in cte_publish_all()
2382 mutex_exit(&ct->ct_lock); in cte_publish_all()
2385 mutex_exit(&ct->ct_evtlock); in cte_publish_all()