static int dump_info(int argc, char **argv) { kprintf("kernel build: %s %s (gcc%d %s)\n", __DATE__, __TIME__, __GNUC__, __VERSION__); kprintf("revision: %s\n\n", get_haiku_revision()); kprintf("cpu count: %" B_PRId32 "\n", smp_get_num_cpus()); for (int32 i = 0; i < smp_get_num_cpus(); i++) kprintf(" [%" B_PRId32 "] active time: %10" B_PRId64 ", interrupt" " time: %10" B_PRId64 ", irq time: %10" B_PRId64 "\n", i + 1, gCPU[i].active_time, gCPU[i].interrupt_time, gCPU[i].irq_time); // ToDo: Add page_faults kprintf("pages:\t\t%" B_PRIuPHYSADDR " (%" B_PRIuPHYSADDR " max)\n", vm_page_num_pages() - vm_page_num_free_pages(), vm_page_num_pages()); kprintf("sems:\t\t%" B_PRId32 " (%" B_PRId32 " max)\n", sem_used_sems(), sem_max_sems()); kprintf("ports:\t\t%" B_PRId32 " (%" B_PRId32 " max)\n", port_used_ports(), port_max_ports()); kprintf("threads:\t%" B_PRId32 " (%" B_PRId32 " max)\n", thread_used_threads(), thread_max_threads()); kprintf("teams:\t\t%" B_PRId32 " (%" B_PRId32 " max)\n", team_used_teams(), team_max_teams()); return 0; }
static status_t low_resource_manager(void*) { bigtime_t timeout = kLowResourceInterval; while (true) { int32 state = low_resource_state_no_update(B_ALL_KERNEL_RESOURCES); if (state != B_LOW_RESOURCE_CRITICAL) { acquire_sem_etc(sLowResourceWaitSem, 1, B_RELATIVE_TIMEOUT, timeout); } RecursiveLocker _(&sLowResourceLock); compute_state(); state = low_resource_state_no_update(B_ALL_KERNEL_RESOURCES); TRACE(("low_resource_manager: state = %ld, %ld free pages, %lld free " "memory, %lu free semaphores\n", state, vm_page_num_free_pages(), vm_available_not_needed_memory(), sem_max_sems() - sem_used_sems())); if (state < B_LOW_RESOURCE_NOTE) continue; call_handlers(sLowResources); if (state == B_LOW_RESOURCE_WARNING) timeout = kWarnResourceInterval; else timeout = kLowResourceInterval; sLowResourceWaiterCondition.NotifyAll(); } return 0; }
status_t get_system_info(system_info* info) { memset(info, 0, sizeof(system_info)); info->boot_time = rtc_boot_time(); info->cpu_count = smp_get_num_cpus(); vm_page_get_stats(info); vm_get_info(info); info->used_threads = thread_used_threads(); info->max_threads = thread_max_threads(); info->used_teams = team_used_teams(); info->max_teams = team_max_teams(); info->used_ports = port_used_ports(); info->max_ports = port_max_ports(); info->used_sems = sem_used_sems(); info->max_sems = sem_max_sems(); info->kernel_version = kKernelVersion; strlcpy(info->kernel_name, kKernelName, B_FILE_NAME_LENGTH); strlcpy(info->kernel_build_date, __DATE__, B_OS_NAME_LENGTH); strlcpy(info->kernel_build_time, __TIME__, B_OS_NAME_LENGTH); info->abi = B_HAIKU_ABI; return B_OK; }
static void compute_state(void) { sLastMeasurement = system_time(); sLowResources = B_ALL_KERNEL_RESOURCES; // free pages state uint32 freePages = vm_page_num_free_pages(); if (freePages < kCriticalPagesLimit) { sLowPagesState = B_LOW_RESOURCE_CRITICAL; } else if (freePages < kWarnPagesLimit) { sLowPagesState = B_LOW_RESOURCE_WARNING; } else if (freePages < kNotePagesLimit) { sLowPagesState = B_LOW_RESOURCE_NOTE; } else { sLowPagesState = B_NO_LOW_RESOURCE; sLowResources &= ~B_KERNEL_RESOURCE_PAGES; } // free memory state off_t freeMemory = vm_available_not_needed_memory(); if (freeMemory < sCriticalMemoryLimit) { sLowMemoryState = B_LOW_RESOURCE_CRITICAL; } else if (freeMemory < sWarnMemoryLimit) { sLowMemoryState = B_LOW_RESOURCE_WARNING; } else if (freeMemory < sNoteMemoryLimit) { sLowMemoryState = B_LOW_RESOURCE_NOTE; } else { sLowMemoryState = B_NO_LOW_RESOURCE; sLowResources &= ~B_KERNEL_RESOURCE_MEMORY; } // free semaphores state uint32 maxSems = sem_max_sems(); uint32 freeSems = maxSems - sem_used_sems(); if (freeSems < maxSems >> 16) { sLowSemaphoresState = B_LOW_RESOURCE_CRITICAL; } else if (freeSems < maxSems >> 8) { sLowSemaphoresState = B_LOW_RESOURCE_WARNING; } else if (freeSems < maxSems >> 4) { sLowSemaphoresState = B_LOW_RESOURCE_NOTE; } else { sLowSemaphoresState = B_NO_LOW_RESOURCE; sLowResources &= ~B_KERNEL_RESOURCE_SEMAPHORES; } // free kernel address space state // TODO: this should take fragmentation into account size_t maxSpace = KERNEL_SIZE; size_t freeSpace = vm_kernel_address_space_left(); if (freeSpace < maxSpace >> 16) sLowSpaceState = B_LOW_RESOURCE_CRITICAL; if (freeSpace < maxSpace >> 8) sLowSpaceState = B_LOW_RESOURCE_WARNING; if (freeSpace < maxSpace >> 4) sLowSpaceState = B_LOW_RESOURCE_NOTE; else { sLowSpaceState = B_NO_LOW_RESOURCE; sLowResources &= ~B_KERNEL_RESOURCE_ADDRESS_SPACE; } }