2012-09-25 16 views
6

Nếu mã như sauNested spin_lock_irqsave

void test(void) 
{ 
    spin_lock_irqsave(&lock1, flag); 
    ... 
    func1(); 
    ... 
    spin_unlock_irqrestore(&lock1, flag); 
} 

void func1(void) 
{ 
    spin_lock_irqsave(&lock2, flag); 
    ... 
    spin_unlock_irqrestore(&lock2, flag); 
} 

Sẽ có bất kỳ vấn đề với mã? khi spin_unlock_irqrestore được gọi trong func1, thì ngắt sẽ được bật chưa? Những gì tôi muốn đạt được là test() thường trình có thể được thực hiện mà không bị gián đoạn bởi bộ lập lịch hoặc ngắt. Cảm ơn rất nhiều

+1

Thực ra, đó là toàn bộ điểm có 'spin_lock_irqsave()/spin_unlock_irq_restore()' ngoài 'spin_lock_irq()/spin_unlock_irq()'. – ninjalj

Trả lời

6

Theo như tôi đã tìm thấy trong tài liệu và tôi chưa hoàn toàn cạn kiệt tìm kiếm của mình, flag sẽ lưu trạng thái của các bit đặt cờ khác nhau rồi tắt ngắt, sau đó khôi phục nó kết thúc. Nếu ngắt đã được tắt bởi cuộc gọi đầu tiên test và sau đó bạn thực hiện một cuộc gọi khác, tôi sẽ giả định (và không có gì chỉ ra rằng tôi đã tìm thấy) rằng nó sẽ tắt các ngắt, lưu trữ flags và khôi phục chúng bên trong func() và sau đó khôi phục chúng trở lại trạng thái flag có trong test.

Ngắt chỉ nên được bật lại sau hàm test của bạn.

Tôi có thể nói rằng bạn chỉ có thể sử dụng cùng một biến số flag trong cả hai hàm, nếu không bạn sẽ ghi đè số đầu tiên trong cuộc gọi bên trong và sau đó đặt lại và nếu có bất kỳ cờ nào thay đổi giữa các cuộc gọi của bạn, bạn có thể đặt lại trạng thái bên ngoài về trạng thái sai.

+1

Điều này là chính xác. Nested spin_lock_irqsave() hoàn toàn ổn, miễn là bạn sử dụng các biến "flags" khác nhau. – Roland