簡體   English   中英

當內核模塊在不禁用中斷的情況下持有 spin_lock 時,從用戶空間發出 IOCTL 時是否會發生上下文切換?

[英]Does context switching occurs when IOCTL is issued from user space while kernel module is holding a spin_lock without disabling interrupts?

我在內核模塊中有一個關鍵部分,它受spin_lock()保護。 我已經使用spin_lock()在不禁用 irq 或 softirqs 的情況下獲取鎖。 正如我們所知,IOCTL 是通過軟件中斷 128 (0x80) 進入內核的系統調用。 因此,如果在獲取spin_lock()的臨界區中間時從用戶空間發出 IOCTL,是否會發生上下文切換? 如果在 IOCTL 的后端也使用相同的spin_lock()會怎樣? 會導致死鎖嗎?

我已經使用 spin_lock() 在不禁用 irq 或 softirqs 的情況下獲取鎖

IRQ/SoftIRQ 與系統調用無關。 當受保護的數據結構可能在中斷上下文中使用時,需要禁用 IRQ 或 softIRQ 順便說一句,有一個特殊的spin_lock -API,如spin_lock_bh()/spin_unlock_bh()spin_lock_irq() / spin_unlock_irq()等。您應該閱讀本指南

會發生上下文切換嗎?

我沒有看到任何阻止它的東西(如果你的意思是系統調用上下文切換)。 當系統調用發生時,它在用戶上下文(進程上下文 - 例如引發系統調用的進程上下文)中進入內核模式(上下文切換),而不是中斷或軟中斷上下文。 因此,如果您的數據結構只能從用戶上下文中訪問 - 您應該為用戶上下文使用常規鎖定 API。
至於在持有自旋鎖時內核模式下的上下文切換 - 它不會發生,因為自旋鎖本身禁用了搶占:

static inline void __raw_spin_lock(raw_spinlock_t *lock)
{
    preempt_disable();
    spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
    LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);
}

那么只有更高優先級的代碼可以搶占(IRQ、softIRQ),但是如果“更高優先級的代碼”不會嘗試獲取您持有的鎖,則無需擔心(從死鎖的角度來看)。

如果在 IOCTL 的后端也使用相同的 spin_lock() 會怎樣?

在您釋放鎖之前,它肯定會“旋轉”。

會導致死鎖嗎?

取決於您將如何使用它。

PS互斥體有什么問題?


另請閱讀:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM