kernel/system_info: Avoid unnecessary usage of set_ac.
Instead add a second level to the loop and a small temporary array. Makes the code slightly simpler (and safer, as there is no risk of races now.) Also add a missing "firstCPU +" in the current_frequency calculation. It seems that has been broken since the frequency value was introduced...
This commit is contained in:
@@ -525,25 +525,20 @@ _get_cpu_info_etc(uint32 firstCPU, uint32 cpuCount, cpu_info* info, size_t size)
|
|||||||
|
|
||||||
// This function is called very often from userland by applications
|
// This function is called very often from userland by applications
|
||||||
// that display CPU usage information, so we want to keep this as
|
// that display CPU usage information, so we want to keep this as
|
||||||
// optimized and touch as little as possible. Hence, no use of
|
// optimized and touch as little as possible. Hence, we avoid use
|
||||||
// a temporary buffer.
|
// of an allocated temporary buffer.
|
||||||
|
|
||||||
if (IS_USER_ADDRESS(info)) {
|
cpu_info local_info[8];
|
||||||
if (user_memset(info, 0, sizeof(cpu_info) * count) != B_OK)
|
for (uint32 i = 0; i < count; ) {
|
||||||
|
uint32 j;
|
||||||
|
for (j = 0; i < count && j < B_COUNT_OF(local_info); i++, j++) {
|
||||||
|
local_info[j].active_time = cpu_get_active_time(firstCPU + i);
|
||||||
|
local_info[j].enabled = !gCPU[firstCPU + i].disabled;
|
||||||
|
local_info[j].current_frequency = cpu_frequency(firstCPU + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user_memcpy(info + (i - j), local_info, sizeof(cpu_info) * j) != B_OK)
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
set_ac();
|
|
||||||
} else {
|
|
||||||
memset(info, 0, sizeof(cpu_info) * count);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint32 i = 0; i < count; i++) {
|
|
||||||
info[i].active_time = cpu_get_active_time(firstCPU + i);
|
|
||||||
info[i].enabled = !gCPU[firstCPU + i].disabled;
|
|
||||||
info[i].current_frequency = cpu_frequency(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IS_USER_ADDRESS(info)) {
|
|
||||||
clear_ac();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|||||||
Reference in New Issue
Block a user