0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2025-01-03 07:31:54 +00:00

IO loop picker fixed

Now if the thread finds out that it actually isn't busy,
it unsets the business status and picks something up right away.
This commit is contained in:
Maria Matejka 2024-06-09 00:43:14 +02:00
parent 4bca3b9f86
commit 8ad9c946e1

View File

@ -573,6 +573,7 @@ sockets_fire(struct birdloop *loop)
*/ */
static void bird_thread_start_event(void *_data); static void bird_thread_start_event(void *_data);
static void bird_thread_busy_update(struct bird_thread *thr, int timeout_ms);
struct birdloop_pickup_group { struct birdloop_pickup_group {
DOMAIN(attrs) domain; DOMAIN(attrs) domain;
@ -671,18 +672,16 @@ birdloop_take(struct birdloop_pickup_group *group)
struct birdloop *loop = NULL; struct birdloop *loop = NULL;
LOCK_DOMAIN(attrs, group->domain); LOCK_DOMAIN(attrs, group->domain);
int drop =
this_thread->busy_active &&
(group->thread_busy_count < group->thread_count) &&
(this_thread->loop_count > 1);
int take = !EMPTY_LIST(group->loops);
if (drop) if (this_thread->busy_active &&
(group->thread_busy_count < group->thread_count) &&
(this_thread->loop_count > 1))
{ {
THREAD_TRACE(DL_SCHEDULING, "Loop drop requested (tbc=%d, tc=%d, lc=%d)", THREAD_TRACE(DL_SCHEDULING, "Loop drop requested (tbc=%d, tc=%d, lc=%d)",
group->thread_busy_count, group->thread_count, this_thread->loop_count); group->thread_busy_count, group->thread_count, this_thread->loop_count);
UNLOCK_DOMAIN(attrs, group->domain); UNLOCK_DOMAIN(attrs, group->domain);
int dropped = 0;
node *n; node *n;
WALK_LIST2(loop, n, this_thread->loops, n) WALK_LIST2(loop, n, this_thread->loops, n)
{ {
@ -702,15 +701,20 @@ birdloop_take(struct birdloop_pickup_group *group)
LOCK_DOMAIN(attrs, group->domain); LOCK_DOMAIN(attrs, group->domain);
bird_thread_pickup_next(group); bird_thread_pickup_next(group);
UNLOCK_DOMAIN(attrs, group->domain); UNLOCK_DOMAIN(attrs, group->domain);
dropped = 1;
break; break;
} }
birdloop_leave(loop); birdloop_leave(loop);
} }
if (dropped)
return; return;
bird_thread_busy_update(this_thread, -1);
LOCK_DOMAIN(attrs, group->domain);
} }
if (take) if (!EMPTY_LIST(group->loops))
{ {
THREAD_TRACE(DL_SCHEDULING, "Loop take requested"); THREAD_TRACE(DL_SCHEDULING, "Loop take requested");