1#include "internal.h"
2#include <global.h>
3
4struct workqueue *workqueue_least_loaded_queue_except(int64_t except_core_num) {
5 uint64_t minimum_load = UINT64_MAX;
6
7 if (except_core_num == -1) {
8 /* don't avoid any core */
9 }
10
11 /* There will always be a 'core 0 thread' */
12 struct workqueue *least_loaded = global.workqueues[0];
13 for (int64_t i = 0; i < (int64_t) global.core_count; i++) {
14 if (WORKQUEUE_NUM_WORKS(global.workqueues[i]) < minimum_load &&
15 i != except_core_num) {
16 minimum_load = WORKQUEUE_NUM_WORKS(global.workqueues[i]);
17 least_loaded = global.workqueues[i];
18 }
19 }
20
21 return least_loaded;
22}
23
24struct workqueue *workqueue_get_least_loaded(void) {
25 return workqueue_least_loaded_queue_except(except_core_num: -1);
26}
27
28struct workqueue *workqueue_get_least_loaded_remote(void) {
29 return workqueue_least_loaded_queue_except(except_core_num: smp_core_id());
30}
31