Lines Matching refs:ledger

33 #include <kern/ledger.h>
47 * ledger actions (LEDGER_ACTION_BLOCK, etc).
53 #define LF_REFILL_INPROGRESS 0x0800 /* the ledger is being refilled */
58 /* Determine whether a ledger entry exists and has been initialized and active */
127 * Use 2 "tocks" to track the rolling maximum balance of a ledger entry.
156 struct ledger {
165 /* ledger ast helper functions */
175 printf("ledger: resource exhausted [%s] for task %p\n",
203 lck_grp_init(&ledger_lck_grp, "ledger", LCK_GRP_ATTR_NULL);
244 * Add a new entry to the list of entries in a ledger template. There is
302 ledger_entry_setactive(ledger_t ledger, int entry)
306 if ((ledger == NULL) || (entry < 0) || (entry >= ledger->l_size))
309 le = &ledger->l_entries[entry];
336 * Create a new ledger based on the specified template. As part of the
337 * ledger creation we need to allocate space for a table of ledger entries.
339 * the ledger is created. If additional entries are added to the template
340 * after the ledger is created, they will not be tracked in this ledger.
345 ledger_t ledger;
349 ledger = (ledger_t)kalloc(sizeof (struct ledger));
350 if (ledger == NULL)
353 ledger->l_template = template;
354 ledger->l_id = ledger_cnt++;
355 ledger->l_refs = 1;
359 ledger->l_size = template->lt_cnt;
362 sz = ledger->l_size * sizeof (struct ledger_entry);
363 ledger->l_entries = kalloc(sz);
364 if (sz && (ledger->l_entries == NULL)) {
366 kfree(ledger, sizeof(struct ledger));
371 assert(ledger->l_size <= template->lt_cnt);
372 for (i = 0; i < ledger->l_size; i++) {
373 struct ledger_entry *le = &ledger->l_entries[i];
395 return (ledger);
411 * Take a reference on a ledger
414 ledger_reference(ledger_t ledger)
416 if (!LEDGER_VALID(ledger))
418 OSIncrementAtomic(&ledger->l_refs);
423 ledger_reference_count(ledger_t ledger)
425 if (!LEDGER_VALID(ledger))
428 return (ledger->l_refs);
432 * Remove a reference on a ledger. If this is the last reference,
433 * deallocate the unused ledger.
436 ledger_dereference(ledger_t ledger)
440 if (!LEDGER_VALID(ledger))
443 v = OSDecrementAtomic(&ledger->l_refs);
448 kfree(ledger->l_entries,
449 ledger->l_size * sizeof (struct ledger_entry));
450 kfree(ledger, sizeof (*ledger));
496 entry_get_callback(ledger_t ledger, int entry)
501 TEMPLATE_INUSE(s, ledger->l_template);
502 callback = ledger->l_template->lt_entries[entry].et_callback;
503 TEMPLATE_IDLE(s, ledger->l_template);
509 * If the ledger value is positive, wake up anybody waiting on it.
530 ledger_refill(uint64_t now, ledger_t ledger, int entry)
536 le = &ledger->l_entries[entry];
550 * last refill, then someone else has already refilled this ledger
616 * ledger rolling maximum calculations. The effective lookback window will be this times
654 ledger_check_new_balance(ledger_t ledger, int entry)
658 le = &ledger->l_entries[entry];
684 ledger_refill(now, ledger, entry);
700 entry_get_callback(ledger, entry))) {
716 * the ledger's balance crosses into or out of the warning
721 * This ledger's balance is above the warning level.
734 * This ledger's balance is below the warning level.
741 * know the ledger balance is now back below
752 * Add value to an entry in a ledger.
755 ledger_credit(ledger_t ledger, int entry, ledger_amount_t amount)
760 if (!ENTRY_VALID(ledger, entry) || (amount < 0))
766 le = &ledger->l_entries[entry];
771 ledger_check_new_balance(ledger, entry);
777 * Zero the balance of a ledger by adding to its credit or debit, whichever is smaller.
782 ledger_zero_balance(ledger_t ledger, int entry)
786 if (!ENTRY_VALID(ledger, entry))
789 le = &ledger->l_entries[entry];
806 ledger_get_limit(ledger_t ledger, int entry, ledger_amount_t *limit)
810 if (!ENTRY_VALID(ledger, entry))
813 le = &ledger->l_entries[entry];
830 ledger_set_limit(ledger_t ledger, int entry, ledger_amount_t limit,
835 if (!ENTRY_VALID(ledger, entry))
839 le = &ledger->l_entries[entry];
847 ledger_disable_refill(ledger, entry);
869 ledger_get_maximum(ledger_t ledger, int entry,
876 le = &ledger->l_entries[entry];
878 if (!ENTRY_VALID(ledger, entry) || !(le->le_flags & LF_TRACKING_MAX)) {
905 * Enable tracking of periodic maximums for this ledger entry.
958 * Disable callback notification for a specific ledger entry.
960 * Otherwise, if using a ledger template which specified a
965 ledger_disable_callback(ledger_t ledger, int entry)
967 if (!ENTRY_VALID(ledger, entry))
971 * le_warn_level is used to indicate *if* this ledger has a warning configured,
976 ledger->l_entries[entry].le_warn_level = LEDGER_LIMIT_INFINITY;
977 flag_clear(&ledger->l_entries[entry].le_flags, LEDGER_ACTION_CALLBACK);
982 * Enable callback notification for a specific ledger entry.
989 ledger_enable_callback(ledger_t ledger, int entry)
991 if (!ENTRY_VALID(ledger, entry))
994 assert(entry_get_callback(ledger, entry) != NULL);
996 flag_set(&ledger->l_entries[entry].le_flags, LEDGER_ACTION_CALLBACK);
1001 * Query the automatic refill period for this ledger entry.
1006 ledger_get_period(ledger_t ledger, int entry, uint64_t *period)
1010 if (!ENTRY_VALID(ledger, entry))
1013 le = &ledger->l_entries[entry];
1023 ledger_set_period(ledger_t ledger, int entry, uint64_t period)
1028 if (!ENTRY_VALID(ledger, entry))
1031 le = &ledger->l_entries[entry];
1034 * A refill period refills the ledger in multiples of the limit,
1055 ledger_zero_balance(ledger, entry);
1066 ledger_disable_refill(ledger_t ledger, int entry)
1070 if (!ENTRY_VALID(ledger, entry))
1073 le = &ledger->l_entries[entry];
1081 ledger_get_actions(ledger_t ledger, int entry, int *actions)
1083 if (!ENTRY_VALID(ledger, entry))
1086 *actions = ledger->l_entries[entry].le_flags & LEDGER_ACTION_MASK;
1092 ledger_set_action(ledger_t ledger, int entry, int action)
1095 if (!ENTRY_VALID(ledger, entry))
1098 flag_set(&ledger->l_entries[entry].le_flags, action);
1126 ledger_debit(ledger_t ledger, int entry, ledger_amount_t amount)
1131 if (!ENTRY_VALID(ledger, entry) || (amount < 0))
1137 le = &ledger->l_entries[entry];
1143 ledger_check_new_balance(ledger, entry);
1151 struct ledger *l = thread->t_ledger;
1152 struct ledger *thl;
1364 ledger_get_entries(ledger_t ledger, int entry, ledger_amount_t *credit,
1369 if (!ENTRY_VALID(ledger, entry))
1372 le = &ledger->l_entries[entry];
1381 ledger_get_balance(ledger_t ledger, int entry, ledger_amount_t *balance)
1385 if (!ENTRY_VALID(ledger, entry))
1388 le = &ledger->l_entries[entry];
1406 * Since all tasks share a ledger template, we'll just use the
1409 l = current_task()->ledger;
1464 if ((*len < 0) || ((l = task->ledger) == NULL))
1486 ledger_get_entry_info(ledger_t ledger,
1492 assert(ledger != NULL);
1494 assert(entry < ledger->l_size);
1496 struct ledger_entry *le = &ledger->l_entries[entry];
1506 if ((l = task->ledger) == NULL)
1525 if ((l = task->ledger) == NULL)
1535 * units. For now I'll handwave and say that the ledger() system