sched-arch.rst 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. =================================================================
  2. CPU Scheduler implementation hints for architecture specific code
  3. =================================================================
  4. Nick Piggin, 2005
  5. Context switch
  6. ==============
  7. 1. Runqueue locking
  8. By default, the switch_to arch function is called with the runqueue
  9. locked. This is usually not a problem unless switch_to may need to
  10. take the runqueue lock. This is usually due to a wake up operation in
  11. the context switch. See arch/ia64/include/asm/switch_to.h for an example.
  12. To request the scheduler call switch_to with the runqueue unlocked,
  13. you must `#define __ARCH_WANT_UNLOCKED_CTXSW` in a header file
  14. (typically the one where switch_to is defined).
  15. Unlocked context switches introduce only a very minor performance
  16. penalty to the core scheduler implementation in the CONFIG_SMP case.
  17. CPU idle
  18. ========
  19. Your cpu_idle routines need to obey the following rules:
  20. 1. Preempt should now disabled over idle routines. Should only
  21. be enabled to call schedule() then disabled again.
  22. 2. need_resched/TIF_NEED_RESCHED is only ever set, and will never
  23. be cleared until the running task has called schedule(). Idle
  24. threads need only ever query need_resched, and may never set or
  25. clear it.
  26. 3. When cpu_idle finds (need_resched() == 'true'), it should call
  27. schedule(). It should not call schedule() otherwise.
  28. 4. The only time interrupts need to be disabled when checking
  29. need_resched is if we are about to sleep the processor until
  30. the next interrupt (this doesn't provide any protection of
  31. need_resched, it prevents losing an interrupt):
  32. 4a. Common problem with this type of sleep appears to be::
  33. local_irq_disable();
  34. if (!need_resched()) {
  35. local_irq_enable();
  36. *** resched interrupt arrives here ***
  37. __asm__("sleep until next interrupt");
  38. }
  39. 5. TIF_POLLING_NRFLAG can be set by idle routines that do not
  40. need an interrupt to wake them up when need_resched goes high.
  41. In other words, they must be periodically polling need_resched,
  42. although it may be reasonable to do some background work or enter
  43. a low CPU priority.
  44. - 5a. If TIF_POLLING_NRFLAG is set, and we do decide to enter
  45. an interrupt sleep, it needs to be cleared then a memory
  46. barrier issued (followed by a test of need_resched with
  47. interrupts disabled, as explained in 3).
  48. arch/x86/kernel/process.c has examples of both polling and
  49. sleeping idle functions.
  50. Possible arch/ problems
  51. =======================
  52. Possible arch problems I found (and either tried to fix or didn't):
  53. ia64 - is safe_halt call racy vs interrupts? (does it sleep?) (See #4a)
  54. sh64 - Is sleeping racy vs interrupts? (See #4a)
  55. sparc - IRQs on at this point(?), change local_irq_save to _disable.
  56. - TODO: needs secondary CPUs to disable preempt (See #1)