2013-07-11 48 views
5

Tôi đang phát triển một mô-đun hạt nhân chia sẻ cấu trúc dữ liệu giữa softirq (móc nối trước định tuyến netfilter) và ngữ cảnh người dùng (trong cuộc gọi ioctl).Chia sẻ dữ liệu giữa softirq và bối cảnh quá trình

Sau khi đọc số link, tôi biết mình cần vô hiệu hóa phần mềm gián đoạn trong ngữ cảnh người dùng khi sửa đổi dữ liệu (sử dụng spin_lock_bh hoặc spin_lock_irqsave) và bật lại sau khi hoàn thành các thao tác trên dữ liệu chia sẻ.

Tuy nhiên, tôi không chắc chắn liệu tôi có cần lấy khóa trong chức năng xử lý softirq hay không. Tôi có cần lấy khóa ở đây không (với spin_lock)?

Tôi hiểu rằng tôi chỉ cần sử dụng khóa xoay trong trình xử lý softirq nếu chia sẻ dữ liệu với softirq hoặc hardirq khác. Tôi hiểu có đúng không?

Trả lời

4

Bạn phải có khóa nếu bạn chia sẻ dữ liệu với bất kỳ mã nào, có thể được thực hiện cùng một lúc. Hạt nhân có thể thực thi cả softirq và trình xử lý ioctl của bạn, vì vậy bạn phải lấy khóa.

Khi bạn tắt ngắt với spin_lock_bh hoặc spin_lock_irqsave, ngắt chỉ bị tắt trên bộ xử lý hiện tại. Vì vậy, nó là OK để xử lý ngắt trên một số khác.