Lines Matching +full:throttle +full:- +full:period +full:- +full:us

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
84 static int rctl_throttle_min = -1;
85 static int rctl_throttle_max = -1;
86 static int rctl_throttle_pct = -1;
87 static int rctl_throttle_pct2 = -1;
144 { NULL, -1 }};
172 { NULL, -1 }};
209 { "throttle", RCTL_ACTION_THROTTLE },
210 { NULL, -1 }};
228 if (error || !req->newptr) in rctl_throttle_min_sysctl()
245 if (error || !req->newptr) in rctl_throttle_max_sysctl()
262 if (error || !req->newptr) in rctl_throttle_pct_sysctl()
279 if (error || !req->newptr) in rctl_throttle_pct2_sysctl()
333 struct ucred *cred = p->p_ucred; in rctl_proc_rule_to_racct()
338 switch (rule->rr_per) { in rctl_proc_rule_to_racct()
340 return (p->p_racct); in rctl_proc_rule_to_racct()
342 return (cred->cr_ruidinfo->ui_racct); in rctl_proc_rule_to_racct()
344 return (cred->cr_loginclass->lc_racct); in rctl_proc_rule_to_racct()
346 return (cred->cr_prison->pr_prison_racct->prr_racct); in rctl_proc_rule_to_racct()
348 panic("%s: unknown per %d", __func__, rule->rr_per); in rctl_proc_rule_to_racct()
366 available = rule->rr_amount - racct->r_resources[rule->rr_resource]; in rctl_available_resource()
376 * period.
390 LIST_FOREACH(link, &racct->r_rule_links, rrl_next) { in rctl_throttle_decay()
391 rule = link->rrl_rule; in rctl_throttle_decay()
393 if (rule->rr_resource != resource) in rctl_throttle_decay()
395 if (rule->rr_action != RCTL_ACTION_THROTTLE) in rctl_throttle_decay()
398 if (rule->rr_amount < minavailable) in rctl_throttle_decay()
399 minavailable = rule->rr_amount; in rctl_throttle_decay()
402 if (racct->r_resources[resource] < minavailable) { in rctl_throttle_decay()
403 racct->r_resources[resource] = 0; in rctl_throttle_decay()
411 if (racct->r_resources[resource] > minavailable * 10) in rctl_throttle_decay()
412 racct->r_resources[resource] = minavailable * 10; in rctl_throttle_decay()
414 racct->r_resources[resource] -= minavailable; in rctl_throttle_decay()
434 LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next) { in rctl_pcpu_available()
435 rule = link->rrl_rule; in rctl_pcpu_available()
436 if (rule->rr_resource != RACCT_PCTCPU) in rctl_pcpu_available()
438 if (rule->rr_action != RCTL_ACTION_DENY) in rctl_pcpu_available()
443 limit = rule->rr_amount; in rctl_pcpu_available()
450 * and lets us act sooner than the limits are already exceeded. in rctl_pcpu_available()
454 minavailable -= RCTL_PCPU_SHIFT; in rctl_pcpu_available()
456 minavailable -= (limit / 2); in rctl_pcpu_available()
490 * to what it keeps allocated now. Returns non-zero if the allocation should
513 LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next) { in rctl_enforce()
514 rule = link->rrl_rule; in rctl_enforce()
515 if (rule->rr_resource != resource) in rctl_enforce()
520 link->rrl_exceeded = 0; in rctl_enforce()
524 switch (rule->rr_action) { in rctl_enforce()
533 if (link->rrl_exceeded != 0) in rctl_enforce()
539 * p->p_comm. This happens when called from fork1(). in rctl_enforce()
543 if (p->p_state != PRS_NORMAL) in rctl_enforce()
560 p->p_pid, p->p_comm, p->p_ucred->cr_uid, in rctl_enforce()
561 p->p_ucred->cr_prison->pr_prison_racct->prr_name); in rctl_enforce()
564 link->rrl_exceeded = 1; in rctl_enforce()
567 if (link->rrl_exceeded != 0) in rctl_enforce()
570 if (p->p_state != PRS_NORMAL) in rctl_enforce()
586 p->p_pid, p->p_ucred->cr_ruid, in rctl_enforce()
587 p->p_ucred->cr_prison->pr_prison_racct->prr_name); in rctl_enforce()
593 link->rrl_exceeded = 1; in rctl_enforce()
596 if (p->p_state != PRS_NORMAL) in rctl_enforce()
599 if (rule->rr_amount == 0) { in rctl_enforce()
616 * sleep_ms = hz * p->p_racct->r_resources[resource] / in rctl_enforce()
617 * rule->rr_amount; in rctl_enforce()
623 sleep_ms = xmul(hz, p->p_racct->r_resources[resource]); in rctl_enforce()
625 if (sleep_ms < rctl_throttle_min * rule->rr_amount) in rctl_enforce()
626 sleep_ms = rctl_throttle_min * rule->rr_amount; in rctl_enforce()
638 sleep_ratio = -available / rule->rr_amount; in rctl_enforce()
648 sleep_ms /= rule->rr_amount; in rctl_enforce()
654 __func__, p->p_pid, p->p_comm, in rctl_enforce()
655 p->p_racct->r_resources[resource], in rctl_enforce()
656 rule->rr_amount, (uintmax_t)sleep_ms, in rctl_enforce()
665 if (link->rrl_exceeded != 0) in rctl_enforce()
668 if (p->p_state != PRS_NORMAL) in rctl_enforce()
671 KASSERT(rule->rr_action > 0 && in rctl_enforce()
672 rule->rr_action <= RCTL_ACTION_SIGNAL_MAX, in rctl_enforce()
674 rule->rr_action)); in rctl_enforce()
680 kern_psignal(p, rule->rr_action); in rctl_enforce()
681 link->rrl_exceeded = 1; in rctl_enforce()
689 * into one proper for the situation - EFSIZ, ENOMEM etc. in rctl_enforce()
711 LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next) { in rctl_get_limit()
712 rule = link->rrl_rule; in rctl_get_limit()
713 if (rule->rr_resource != resource) in rctl_get_limit()
715 if (rule->rr_action != RCTL_ACTION_DENY) in rctl_get_limit()
717 if (rule->rr_amount < amount) in rctl_get_limit()
718 amount = rule->rr_amount; in rctl_get_limit()
740 LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next) { in rctl_get_available()
741 rule = link->rrl_rule; in rctl_get_available()
742 if (rule->rr_resource != resource) in rctl_get_available()
744 if (rule->rr_action != RCTL_ACTION_DENY) in rctl_get_available()
754 allocated = p->p_racct->r_resources[resource]; in rctl_get_available()
755 if (minavailable < INT64_MAX - allocated) in rctl_get_available()
769 if (filter->rr_subject_type != RCTL_SUBJECT_TYPE_UNDEFINED) { in rctl_rule_matches()
770 if (rule->rr_subject_type != filter->rr_subject_type) in rctl_rule_matches()
773 switch (filter->rr_subject_type) { in rctl_rule_matches()
775 if (filter->rr_subject.rs_proc != NULL && in rctl_rule_matches()
776 rule->rr_subject.rs_proc != in rctl_rule_matches()
777 filter->rr_subject.rs_proc) in rctl_rule_matches()
781 if (filter->rr_subject.rs_uip != NULL && in rctl_rule_matches()
782 rule->rr_subject.rs_uip != in rctl_rule_matches()
783 filter->rr_subject.rs_uip) in rctl_rule_matches()
787 if (filter->rr_subject.rs_loginclass != NULL && in rctl_rule_matches()
788 rule->rr_subject.rs_loginclass != in rctl_rule_matches()
789 filter->rr_subject.rs_loginclass) in rctl_rule_matches()
793 if (filter->rr_subject.rs_prison_racct != NULL && in rctl_rule_matches()
794 rule->rr_subject.rs_prison_racct != in rctl_rule_matches()
795 filter->rr_subject.rs_prison_racct) in rctl_rule_matches()
800 filter->rr_subject_type); in rctl_rule_matches()
804 if (filter->rr_resource != RACCT_UNDEFINED) { in rctl_rule_matches()
805 if (rule->rr_resource != filter->rr_resource) in rctl_rule_matches()
809 if (filter->rr_action != RCTL_ACTION_UNDEFINED) { in rctl_rule_matches()
810 if (rule->rr_action != filter->rr_action) in rctl_rule_matches()
814 if (filter->rr_amount != RCTL_AMOUNT_UNDEFINED) { in rctl_rule_matches()
815 if (rule->rr_amount != filter->rr_amount) in rctl_rule_matches()
819 if (filter->rr_per != RCTL_SUBJECT_TYPE_UNDEFINED) { in rctl_rule_matches()
820 if (rule->rr_per != filter->rr_per) in rctl_rule_matches()
854 if ((size_t)(end - str) != strlen(str)) in str2id()
869 if ((size_t)(end - str) != strlen(str)) in str2int64()
891 link->rrl_rule = rule; in rctl_racct_add_rule()
892 link->rrl_exceeded = 0; in rctl_racct_add_rule()
895 LIST_INSERT_HEAD(&racct->r_rule_links, link, rrl_next); in rctl_racct_add_rule()
912 link->rrl_rule = rule; in rctl_racct_add_rule_locked()
913 link->rrl_exceeded = 0; in rctl_racct_add_rule_locked()
915 LIST_INSERT_HEAD(&racct->r_rule_links, link, rrl_next); in rctl_racct_add_rule_locked()
935 LIST_FOREACH_SAFE(link, &racct->r_rule_links, rrl_next, linktmp) { in rctl_racct_remove_rules()
936 if (!rctl_rule_matches(link->rrl_rule, filter)) in rctl_racct_remove_rules()
940 rctl_rule_release(link->rrl_rule); in rctl_racct_remove_rules()
953 switch (rule->rr_subject_type) { in rctl_rule_acquire_subject()
958 if (rule->rr_subject.rs_prison_racct != NULL) in rctl_rule_acquire_subject()
959 prison_racct_hold(rule->rr_subject.rs_prison_racct); in rctl_rule_acquire_subject()
962 if (rule->rr_subject.rs_uip != NULL) in rctl_rule_acquire_subject()
963 uihold(rule->rr_subject.rs_uip); in rctl_rule_acquire_subject()
966 if (rule->rr_subject.rs_loginclass != NULL) in rctl_rule_acquire_subject()
967 loginclass_hold(rule->rr_subject.rs_loginclass); in rctl_rule_acquire_subject()
971 rule->rr_subject_type); in rctl_rule_acquire_subject()
981 switch (rule->rr_subject_type) { in rctl_rule_release_subject()
986 if (rule->rr_subject.rs_prison_racct != NULL) in rctl_rule_release_subject()
987 prison_racct_free(rule->rr_subject.rs_prison_racct); in rctl_rule_release_subject()
990 if (rule->rr_subject.rs_uip != NULL) in rctl_rule_release_subject()
991 uifree(rule->rr_subject.rs_uip); in rctl_rule_release_subject()
994 if (rule->rr_subject.rs_loginclass != NULL) in rctl_rule_release_subject()
995 loginclass_free(rule->rr_subject.rs_loginclass); in rctl_rule_release_subject()
999 rule->rr_subject_type); in rctl_rule_release_subject()
1013 rule->rr_subject_type = RCTL_SUBJECT_TYPE_UNDEFINED; in rctl_rule_alloc()
1014 rule->rr_subject.rs_proc = NULL; in rctl_rule_alloc()
1015 rule->rr_subject.rs_uip = NULL; in rctl_rule_alloc()
1016 rule->rr_subject.rs_loginclass = NULL; in rctl_rule_alloc()
1017 rule->rr_subject.rs_prison_racct = NULL; in rctl_rule_alloc()
1018 rule->rr_per = RCTL_SUBJECT_TYPE_UNDEFINED; in rctl_rule_alloc()
1019 rule->rr_resource = RACCT_UNDEFINED; in rctl_rule_alloc()
1020 rule->rr_action = RCTL_ACTION_UNDEFINED; in rctl_rule_alloc()
1021 rule->rr_amount = RCTL_AMOUNT_UNDEFINED; in rctl_rule_alloc()
1022 refcount_init(&rule->rr_refcount, 1); in rctl_rule_alloc()
1037 copy->rr_subject_type = rule->rr_subject_type; in rctl_rule_duplicate()
1038 copy->rr_subject.rs_proc = rule->rr_subject.rs_proc; in rctl_rule_duplicate()
1039 copy->rr_subject.rs_uip = rule->rr_subject.rs_uip; in rctl_rule_duplicate()
1040 copy->rr_subject.rs_loginclass = rule->rr_subject.rs_loginclass; in rctl_rule_duplicate()
1041 copy->rr_subject.rs_prison_racct = rule->rr_subject.rs_prison_racct; in rctl_rule_duplicate()
1042 copy->rr_per = rule->rr_per; in rctl_rule_duplicate()
1043 copy->rr_resource = rule->rr_resource; in rctl_rule_duplicate()
1044 copy->rr_action = rule->rr_action; in rctl_rule_duplicate()
1045 copy->rr_amount = rule->rr_amount; in rctl_rule_duplicate()
1046 refcount_init(&copy->rr_refcount, 1); in rctl_rule_duplicate()
1057 KASSERT(rule->rr_refcount > 0, ("rule->rr_refcount <= 0")); in rctl_rule_acquire()
1059 refcount_acquire(&rule->rr_refcount); in rctl_rule_acquire()
1070 KASSERT(rule->rr_refcount == 0, ("rule->rr_refcount != 0")); in rctl_rule_free()
1085 KASSERT(rule->rr_refcount > 0, ("rule->rr_refcount <= 0")); in rctl_rule_release()
1087 if (refcount_release(&rule->rr_refcount)) { in rctl_rule_release()
1095 TASK_INIT(&rule->rr_task, 0, rctl_rule_free, rule); in rctl_rule_release()
1096 taskqueue_enqueue(taskqueue_thread, &rule->rr_task); in rctl_rule_release()
1106 switch (rule->rr_subject_type) { in rctl_rule_fully_specified()
1110 if (rule->rr_subject.rs_proc == NULL) in rctl_rule_fully_specified()
1114 if (rule->rr_subject.rs_uip == NULL) in rctl_rule_fully_specified()
1118 if (rule->rr_subject.rs_loginclass == NULL) in rctl_rule_fully_specified()
1122 if (rule->rr_subject.rs_prison_racct == NULL) in rctl_rule_fully_specified()
1127 rule->rr_subject_type); in rctl_rule_fully_specified()
1129 if (rule->rr_resource == RACCT_UNDEFINED) in rctl_rule_fully_specified()
1131 if (rule->rr_action == RCTL_ACTION_UNDEFINED) in rctl_rule_fully_specified()
1133 if (rule->rr_amount == RCTL_AMOUNT_UNDEFINED) in rctl_rule_fully_specified()
1135 if (rule->rr_per == RCTL_SUBJECT_TYPE_UNDEFINED) in rctl_rule_fully_specified()
1162 rule->rr_subject_type = RCTL_SUBJECT_TYPE_UNDEFINED; in rctl_string_to_rule()
1164 error = str2value(subjectstr, &rule->rr_subject_type, subjectnames); in rctl_string_to_rule()
1170 rule->rr_subject.rs_proc = NULL; in rctl_string_to_rule()
1171 rule->rr_subject.rs_uip = NULL; in rctl_string_to_rule()
1172 rule->rr_subject.rs_loginclass = NULL; in rctl_string_to_rule()
1173 rule->rr_subject.rs_prison_racct = NULL; in rctl_string_to_rule()
1175 switch (rule->rr_subject_type) { in rctl_string_to_rule()
1184 rule->rr_subject.rs_proc = pfind(id); in rctl_string_to_rule()
1185 if (rule->rr_subject.rs_proc == NULL) { in rctl_string_to_rule()
1189 PROC_UNLOCK(rule->rr_subject.rs_proc); in rctl_string_to_rule()
1195 rule->rr_subject.rs_uip = uifind(id); in rctl_string_to_rule()
1198 rule->rr_subject.rs_loginclass = in rctl_string_to_rule()
1200 if (rule->rr_subject.rs_loginclass == NULL) { in rctl_string_to_rule()
1206 rule->rr_subject.rs_prison_racct = in rctl_string_to_rule()
1208 if (rule->rr_subject.rs_prison_racct == NULL) { in rctl_string_to_rule()
1215 rule->rr_subject_type); in rctl_string_to_rule()
1220 rule->rr_resource = RACCT_UNDEFINED; in rctl_string_to_rule()
1222 error = str2value(resourcestr, &rule->rr_resource, in rctl_string_to_rule()
1229 rule->rr_action = RCTL_ACTION_UNDEFINED; in rctl_string_to_rule()
1231 error = str2value(actionstr, &rule->rr_action, actionnames); in rctl_string_to_rule()
1237 rule->rr_amount = RCTL_AMOUNT_UNDEFINED; in rctl_string_to_rule()
1239 error = str2int64(amountstr, &rule->rr_amount); in rctl_string_to_rule()
1242 if (RACCT_IS_IN_MILLIONS(rule->rr_resource)) { in rctl_string_to_rule()
1243 if (rule->rr_amount > INT64_MAX / 1000000) { in rctl_string_to_rule()
1247 rule->rr_amount *= 1000000; in rctl_string_to_rule()
1252 rule->rr_per = RCTL_SUBJECT_TYPE_UNDEFINED; in rctl_string_to_rule()
1254 error = str2value(perstr, &rule->rr_per, subjectnames); in rctl_string_to_rule()
1288 * resource. The exception are the RSS and %CPU resources - they are in rctl_rule_add()
1292 if (rule->rr_action == RCTL_ACTION_DENY && in rctl_rule_add()
1293 !RACCT_IS_DENIABLE(rule->rr_resource) && in rctl_rule_add()
1294 rule->rr_resource != RACCT_RSS && in rctl_rule_add()
1295 rule->rr_resource != RACCT_PCTCPU) { in rctl_rule_add()
1299 if (rule->rr_action == RCTL_ACTION_THROTTLE && in rctl_rule_add()
1300 !RACCT_IS_DECAYING(rule->rr_resource)) { in rctl_rule_add()
1304 if (rule->rr_action == RCTL_ACTION_THROTTLE && in rctl_rule_add()
1305 rule->rr_resource == RACCT_PCTCPU) { in rctl_rule_add()
1309 if (rule->rr_per == RCTL_SUBJECT_TYPE_PROCESS && in rctl_rule_add()
1310 RACCT_IS_SLOPPY(rule->rr_resource)) { in rctl_rule_add()
1318 if (rule->rr_action == RCTL_ACTION_DENY) { in rctl_rule_add()
1320 rule2->rr_amount = RCTL_AMOUNT_UNDEFINED; in rctl_rule_add()
1326 switch (rule->rr_subject_type) { in rctl_rule_add()
1328 p = rule->rr_subject.rs_proc; in rctl_rule_add()
1331 rctl_racct_add_rule(p->p_racct, rule); in rctl_rule_add()
1333 * In case of per-process rule, we don't have anything more in rctl_rule_add()
1339 uip = rule->rr_subject.rs_uip; in rctl_rule_add()
1341 rctl_racct_add_rule(uip->ui_racct, rule); in rctl_rule_add()
1345 lc = rule->rr_subject.rs_loginclass; in rctl_rule_add()
1347 rctl_racct_add_rule(lc->lc_racct, rule); in rctl_rule_add()
1351 prr = rule->rr_subject.rs_prison_racct; in rctl_rule_add()
1353 rctl_racct_add_rule(prr->prr_racct, rule); in rctl_rule_add()
1358 rule->rr_subject_type); in rctl_rule_add()
1367 cred = p->p_ucred; in rctl_rule_add()
1368 switch (rule->rr_subject_type) { in rctl_rule_add()
1370 if (cred->cr_uidinfo == rule->rr_subject.rs_uip || in rctl_rule_add()
1371 cred->cr_ruidinfo == rule->rr_subject.rs_uip) in rctl_rule_add()
1375 if (cred->cr_loginclass == rule->rr_subject.rs_loginclass) in rctl_rule_add()
1380 for (pr = cred->cr_prison; pr != NULL; pr = pr->pr_parent) { in rctl_rule_add()
1381 if (pr->pr_prison_racct == rule->rr_subject.rs_prison_racct) { in rctl_rule_add()
1391 rule->rr_subject_type); in rctl_rule_add()
1394 rctl_racct_add_rule(p->p_racct, rule); in rctl_rule_add()
1439 if (filter->rr_subject_type == RCTL_SUBJECT_TYPE_PROCESS && in rctl_rule_remove()
1440 filter->rr_subject.rs_proc != NULL) { in rctl_rule_remove()
1441 p = filter->rr_subject.rs_proc; in rctl_rule_remove()
1443 found = rctl_racct_remove_rules(p->p_racct, filter); in rctl_rule_remove()
1463 found += rctl_racct_remove_rules(p->p_racct, filter); in rctl_rule_remove()
1482 sbuf_printf(sb, "%s:", rctl_subject_type_name(rule->rr_subject_type)); in rctl_rule_to_sbuf()
1484 switch (rule->rr_subject_type) { in rctl_rule_to_sbuf()
1486 if (rule->rr_subject.rs_proc == NULL) in rctl_rule_to_sbuf()
1490 rule->rr_subject.rs_proc->p_pid); in rctl_rule_to_sbuf()
1493 if (rule->rr_subject.rs_uip == NULL) in rctl_rule_to_sbuf()
1497 rule->rr_subject.rs_uip->ui_uid); in rctl_rule_to_sbuf()
1500 if (rule->rr_subject.rs_loginclass == NULL) in rctl_rule_to_sbuf()
1504 rule->rr_subject.rs_loginclass->lc_name); in rctl_rule_to_sbuf()
1507 if (rule->rr_subject.rs_prison_racct == NULL) in rctl_rule_to_sbuf()
1511 rule->rr_subject.rs_prison_racct->prr_name); in rctl_rule_to_sbuf()
1515 rule->rr_subject_type); in rctl_rule_to_sbuf()
1518 amount = rule->rr_amount; in rctl_rule_to_sbuf()
1520 RACCT_IS_IN_MILLIONS(rule->rr_resource)) in rctl_rule_to_sbuf()
1524 rctl_resource_name(rule->rr_resource), in rctl_rule_to_sbuf()
1525 rctl_action_name(rule->rr_action), in rctl_rule_to_sbuf()
1528 if (rule->rr_per != rule->rr_subject_type) in rctl_rule_to_sbuf()
1529 sbuf_printf(sb, "/%s", rctl_subject_type_name(rule->rr_per)); in rctl_rule_to_sbuf()
1598 amount = racct->r_resources[i]; in rctl_racct_to_sbuf()
1604 sbuf_setpos(sb, sbuf_len(sb) - 1); in rctl_racct_to_sbuf()
1627 error = rctl_read_inbuf(&inputstr, uap->inbufp, uap->inbuflen); in sys_rctl_get_racct()
1639 switch (filter->rr_subject_type) { in sys_rctl_get_racct()
1641 p = filter->rr_subject.rs_proc; in sys_rctl_get_racct()
1646 outputsbuf = rctl_racct_to_sbuf(p->p_racct, 0); in sys_rctl_get_racct()
1649 uip = filter->rr_subject.rs_uip; in sys_rctl_get_racct()
1654 outputsbuf = rctl_racct_to_sbuf(uip->ui_racct, 1); in sys_rctl_get_racct()
1657 lc = filter->rr_subject.rs_loginclass; in sys_rctl_get_racct()
1662 outputsbuf = rctl_racct_to_sbuf(lc->lc_racct, 1); in sys_rctl_get_racct()
1665 prr = filter->rr_subject.rs_prison_racct; in sys_rctl_get_racct()
1670 outputsbuf = rctl_racct_to_sbuf(prr->prr_racct, 1); in sys_rctl_get_racct()
1681 error = rctl_write_outbuf(outputsbuf, uap->outbufp, uap->outbuflen); in sys_rctl_get_racct()
1696 LIST_FOREACH(link, &racct->r_rule_links, rrl_next) { in rctl_get_rules_callback()
1697 if (!rctl_rule_matches(link->rrl_rule, filter)) in rctl_get_rules_callback()
1699 rctl_rule_to_sbuf(sb, link->rrl_rule); in rctl_get_rules_callback()
1722 error = rctl_read_inbuf(&inputstr, uap->inbufp, uap->inbuflen); in sys_rctl_get_rules()
1734 bufsize = uap->outbuflen; in sys_rctl_get_rules()
1746 LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next) { in sys_rctl_get_rules()
1748 * Non-process rules will be added to the buffer later. in sys_rctl_get_rules()
1751 if (link->rrl_rule->rr_subject_type != in sys_rctl_get_rules()
1754 if (!rctl_rule_matches(link->rrl_rule, filter)) in sys_rctl_get_rules()
1756 rctl_rule_to_sbuf(sb, link->rrl_rule); in sys_rctl_get_rules()
1780 sbuf_setpos(sb, sbuf_len(sb) - 1); in sys_rctl_get_rules()
1782 error = rctl_write_outbuf(sb, uap->outbufp, uap->outbuflen); in sys_rctl_get_rules()
1807 error = rctl_read_inbuf(&inputstr, uap->inbufp, uap->inbuflen); in sys_rctl_get_limits()
1819 if (filter->rr_subject_type == RCTL_SUBJECT_TYPE_UNDEFINED) { in sys_rctl_get_limits()
1824 if (filter->rr_subject_type != RCTL_SUBJECT_TYPE_PROCESS) { in sys_rctl_get_limits()
1829 if (filter->rr_subject.rs_proc == NULL) { in sys_rctl_get_limits()
1835 bufsize = uap->outbuflen; in sys_rctl_get_limits()
1847 LIST_FOREACH(link, &filter->rr_subject.rs_proc->p_racct->r_rule_links, in sys_rctl_get_limits()
1849 rctl_rule_to_sbuf(sb, link->rrl_rule); in sys_rctl_get_limits()
1863 sbuf_setpos(sb, sbuf_len(sb) - 1); in sys_rctl_get_limits()
1865 error = rctl_write_outbuf(sb, uap->outbufp, uap->outbuflen); in sys_rctl_get_limits()
1887 error = rctl_read_inbuf(&inputstr, uap->inbufp, uap->inbuflen); in sys_rctl_add_rule()
1901 if (rule->rr_per == RCTL_SUBJECT_TYPE_UNDEFINED && in sys_rctl_add_rule()
1902 rule->rr_subject_type != RCTL_SUBJECT_TYPE_UNDEFINED) in sys_rctl_add_rule()
1903 rule->rr_per = rule->rr_subject_type; in sys_rctl_add_rule()
1932 error = rctl_read_inbuf(&inputstr, uap->inbufp, uap->inbuflen); in sys_rctl_remove_rule()
1969 newuip = newcred->cr_ruidinfo; in rctl_proc_ucred_changed()
1970 newlc = newcred->cr_loginclass; in rctl_proc_ucred_changed()
1971 newprr = newcred->cr_prison->pr_prison_racct; in rctl_proc_ucred_changed()
1982 LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next) { in rctl_proc_ucred_changed()
1983 if (link->rrl_rule->rr_subject_type == in rctl_proc_ucred_changed()
1987 LIST_FOREACH(link, &newuip->ui_racct->r_rule_links, rrl_next) in rctl_proc_ucred_changed()
1989 LIST_FOREACH(link, &newlc->lc_racct->r_rule_links, rrl_next) in rctl_proc_ucred_changed()
1991 LIST_FOREACH(link, &newprr->prr_racct->r_rule_links, rrl_next) in rctl_proc_ucred_changed()
2001 newlink->rrl_rule = NULL; in rctl_proc_ucred_changed()
2002 newlink->rrl_exceeded = 0; in rctl_proc_ucred_changed()
2012 LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next) { in rctl_proc_ucred_changed()
2013 if (link->rrl_rule->rr_subject_type == in rctl_proc_ucred_changed()
2017 rctl_rule_acquire(link->rrl_rule); in rctl_proc_ucred_changed()
2018 newlink->rrl_rule = link->rrl_rule; in rctl_proc_ucred_changed()
2019 newlink->rrl_exceeded = link->rrl_exceeded; in rctl_proc_ucred_changed()
2021 rulecnt--; in rctl_proc_ucred_changed()
2025 LIST_FOREACH(link, &newuip->ui_racct->r_rule_links, rrl_next) { in rctl_proc_ucred_changed()
2028 rctl_rule_acquire(link->rrl_rule); in rctl_proc_ucred_changed()
2029 newlink->rrl_rule = link->rrl_rule; in rctl_proc_ucred_changed()
2030 newlink->rrl_exceeded = link->rrl_exceeded; in rctl_proc_ucred_changed()
2032 rulecnt--; in rctl_proc_ucred_changed()
2035 LIST_FOREACH(link, &newlc->lc_racct->r_rule_links, rrl_next) { in rctl_proc_ucred_changed()
2038 rctl_rule_acquire(link->rrl_rule); in rctl_proc_ucred_changed()
2039 newlink->rrl_rule = link->rrl_rule; in rctl_proc_ucred_changed()
2040 newlink->rrl_exceeded = link->rrl_exceeded; in rctl_proc_ucred_changed()
2042 rulecnt--; in rctl_proc_ucred_changed()
2045 LIST_FOREACH(link, &newprr->prr_racct->r_rule_links, rrl_next) { in rctl_proc_ucred_changed()
2048 rctl_rule_acquire(link->rrl_rule); in rctl_proc_ucred_changed()
2049 newlink->rrl_rule = link->rrl_rule; in rctl_proc_ucred_changed()
2050 newlink->rrl_exceeded = link->rrl_exceeded; in rctl_proc_ucred_changed()
2052 rulecnt--; in rctl_proc_ucred_changed()
2059 while (!LIST_EMPTY(&p->p_racct->r_rule_links)) { in rctl_proc_ucred_changed()
2060 link = LIST_FIRST(&p->p_racct->r_rule_links); in rctl_proc_ucred_changed()
2062 rctl_rule_release(link->rrl_rule); in rctl_proc_ucred_changed()
2075 LIST_INSERT_HEAD(&p->p_racct->r_rule_links, in rctl_proc_ucred_changed()
2094 if (newlink->rrl_rule != NULL) in rctl_proc_ucred_changed()
2095 rctl_rule_release(newlink->rrl_rule); in rctl_proc_ucred_changed()
2114 KASSERT(parent->p_racct != NULL, ("process without racct; p = %p", parent)); in rctl_proc_fork()
2116 LIST_INIT(&child->p_racct->r_rule_links); in rctl_proc_fork()
2123 LIST_FOREACH(link, &parent->p_racct->r_rule_links, rrl_next) { in rctl_proc_fork()
2124 if (link->rrl_rule->rr_subject_type == in rctl_proc_fork()
2126 rule = rctl_rule_duplicate(link->rrl_rule, M_NOWAIT); in rctl_proc_fork()
2129 KASSERT(rule->rr_subject.rs_proc == parent, in rctl_proc_fork()
2130 ("rule->rr_subject.rs_proc != parent")); in rctl_proc_fork()
2131 rule->rr_subject.rs_proc = child; in rctl_proc_fork()
2132 error = rctl_racct_add_rule_locked(child->p_racct, in rctl_proc_fork()
2138 error = rctl_racct_add_rule_locked(child->p_racct, in rctl_proc_fork()
2139 link->rrl_rule); in rctl_proc_fork()
2148 while (!LIST_EMPTY(&child->p_racct->r_rule_links)) { in rctl_proc_fork()
2149 link = LIST_FIRST(&child->p_racct->r_rule_links); in rctl_proc_fork()
2151 rctl_rule_release(link->rrl_rule); in rctl_proc_fork()
2169 while (!LIST_EMPTY(&racct->r_rule_links)) { in rctl_racct_release()
2170 link = LIST_FIRST(&racct->r_rule_links); in rctl_racct_release()
2172 rctl_rule_release(link->rrl_rule); in rctl_racct_release()
2193 * declaration, except for the rctl_throttle_max - we cannot in rctl_init()