Các mã gốc trong kernel linux là:Nhân Linux: Spinlock SMP: Tại sao có một preempt_disable() trong phiên bản SMP spin_lock_irq?
static inline void __raw_spin_lock_irq(raw_spinlock_t *lock)
{
local_irq_disable();
preempt_disable();
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);
}
Tôi nghĩ rằng không có con đường thực hiện có thể chặn trước đường dẫn hiện tại sau khi IRQ địa phương bị vô hiệu hóa.
Vì tất cả các IRQ cứng thường gặp đều bị vô hiệu hóa, nên không có softirq nào xảy ra và cũng không có dấu chọn để chạy bánh xe theo lịch trình. Tôi nghĩ con đường hiện tại là an toàn. Vậy tại sao có một preempt_disable()?
Cảm ơn bạn.
@ cnicutar.Bạn có chắc không? Tôi không nghĩ vậy. Mỗi lõi CPU sử dụng lịch biểu() để chọn một công việc để chạy. Trong một hệ thống SMP với nhiều lõi, mỗi lõi có một đường dẫn thực hiện chuyên dụng giống như hệ thống UP. Trong trường hợp này, IRQ cục bộ bị vô hiệu hóa, vì vậy lịch trình bánh xe trên lõi này bị chặn. Việc sử dụng trước sẽ xảy ra ở một CPU khác, nhưng điều đó sẽ không ảnh hưởng đến đường dẫn thực hiện trên nó, tôi nghĩ chúng được dành riêng ở mức thực thi. –