Changeset 286da52 in mainline for kernel/generic/src/proc/scheduler.c
- Timestamp:
- 2024-01-20T15:56:45Z (4 months ago)
- Branches:
- master
- Children:
- efed95a3
- Parents:
- 6a0e568
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2023-03-27 17:37:59)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2024-01-20 15:56:45)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/scheduler.c
r6a0e568 r286da52 311 311 312 312 irq_spinlock_lock(&THREAD->lock, false); 313 assert(THREAD->cpu == CPU); 314 313 315 THREAD->state = Running; 314 THREAD->cpu = CPU;315 316 THREAD->priority = rq_index; /* Correct rq index */ 316 317 … … 365 366 } 366 367 368 static void add_to_rq(thread_t *thread, cpu_t *cpu, int i) 369 { 370 /* Add to the appropriate runqueue. */ 371 runq_t *rq = &cpu->rq[i]; 372 373 irq_spinlock_lock(&rq->lock, false); 374 list_append(&thread->rq_link, &rq->rq); 375 rq->n++; 376 irq_spinlock_unlock(&rq->lock, false); 377 378 atomic_inc(&nrdy); 379 atomic_inc(&cpu->nrdy); 380 } 381 382 /** Requeue a thread that was just preempted on this CPU. 383 */ 384 static void thread_requeue_preempted(thread_t *thread) 385 { 386 irq_spinlock_lock(&thread->lock, false); 387 388 assert(thread->state == Running); 389 assert(thread->cpu == CPU); 390 391 int i = (thread->priority < RQ_COUNT - 1) ? 392 ++thread->priority : thread->priority; 393 394 thread->state = Ready; 395 396 irq_spinlock_unlock(&thread->lock, false); 397 398 add_to_rq(thread, CPU, i); 399 } 400 401 void thread_requeue_sleeping(thread_t *thread) 402 { 403 ipl_t ipl = interrupts_disable(); 404 405 irq_spinlock_lock(&thread->lock, false); 406 407 assert(thread->state == Sleeping || thread->state == Entering); 408 409 thread->priority = 0; 410 thread->state = Ready; 411 412 /* Prefer the CPU on which the thread ran last */ 413 if (!thread->cpu) 414 thread->cpu = CPU; 415 416 cpu_t *cpu = thread->cpu; 417 418 irq_spinlock_unlock(&thread->lock, false); 419 420 add_to_rq(thread, cpu, 0); 421 422 interrupts_restore(ipl); 423 } 424 367 425 static void cleanup_after_thread(thread_t *thread, state_t out_state) 368 426 { … … 374 432 switch (out_state) { 375 433 case Running: 376 thread_re ady(thread);434 thread_requeue_preempted(thread); 377 435 break; 378 436 … … 398 456 assert(expected == SLEEP_WOKE); 399 457 /* The thread has already been woken up, requeue immediately. */ 400 thread_re ady(thread);458 thread_requeue_sleeping(thread); 401 459 } 402 460 break; … … 447 505 */ 448 506 after_thread_ran_arch(); 449 450 if (new_state == Sleeping) {451 /* Prefer the thread after it's woken up. */452 THREAD->priority = -1;453 }454 507 455 508 irq_spinlock_unlock(&THREAD->lock, false);
Note:
See TracChangeset
for help on using the changeset viewer.