Why disabling interrupts disables kernel preemption and how spin lock disables preemption

前端 未结 4 1892
梦谈多话
梦谈多话 2020-12-13 10:55

I am reading Linux Kernel Development recently, and I have a few questions related to disabling preemption.

  1. In the \"Interrupt Control\" section of

4条回答
  •  死守一世寂寞
    2020-12-13 11:40

    I am not a scheduler guru, but I would like to explain how I see it. Here are several things.

    1. preempt_disable() doesn't disable IRQ. It just increases a thread_info->preempt_count variable.
    2. Disabling interrupts also disables preemption because scheduler isn't working after that - but only on a single-CPU machine. On the SMP it isn't enough because when you close the interrupts on one CPU the other / others still does / do something asynchronously.
    3. The Big Lock (means - closing all interrupts on all CPUs) is slowing the system down dramatically - so it is why it not anymore in use. This is also the reason why preempt_disable() doesn't close the IRQ.

    You can see what is preempt_disable(). Try this: 1. Get a spinlock. 2. Call schedule()

    In the dmesg you will see something like "BUG: scheduling while atomic". This happens when scheduler detects that your process in atomic (not preemptive) context but it schedules itself.

    Good luck.

提交回复
热议问题