鎖定¶
此檔案解釋了 PCCARD 和 PCMCIA 子系統中使用的鎖定和互斥方案。
A) 概述,鎖定層次結構:¶
- pcmcia_socket_list_rwsem
僅保護套接字列表
- skt_mutex
序列化卡插入/彈出
- ops_mutex
序列化套接字操作
B) 互斥¶
以下函式和對 struct pcmcia_socket 的回撥必須在持有 “skt_mutex” 的情況下呼叫
socket_detect_change()
send_event()
socket_reset()
socket_shutdown()
socket_setup()
socket_remove()
socket_insert()
socket_early_resume()
socket_late_resume()
socket_resume()
socket_suspend()
struct pcmcia_callback *callback
以下函式和對 struct pcmcia_socket 的回撥必須在持有 “ops_mutex” 的情況下呼叫
socket_reset()
socket_setup()
struct pccard_operations *ops
struct pccard_resource_ops *resource_ops;
請注意,send_event() 和 struct pcmcia_callback *callback 不得在持有 “ops_mutex” 的情況下呼叫。
C) 保護¶
1. 全域性資料:¶
struct list_head pcmcia_socket_list;
受 pcmcia_socket_list_rwsem 保護;
2. 每個套接字的資料:¶
resource_ops 及其資料受 ops_mutex 保護。
“主” struct pcmcia_socket 的保護方式如下(未提及只讀欄位或單次使用欄位)
由 pcmcia_socket_list_rwsem 保護
struct list_head socket_list;
由 thread_lock 保護
unsigned int thread_events;
由 skt_mutex 保護
u_int suspended_state; void (*tune_bridge); struct pcmcia_callback *callback; int resume_status;
由 ops_mutex 保護
socket_state_t socket; u_int state; u_short lock_count; pccard_mem_map cis_mem; void __iomem *cis_virt; struct { } irq; io_window_t io[]; pccard_mem_map win[]; struct list_head cis_cache; size_t fake_cis_len; u8 *fake_cis; u_int irq_mask; void (*zoom_video); int (*power_hook); u8 resource...; struct list_head devices_list; u8 device_count; struct pcmcia_state;
3. 每個 PCMCIA 裝置的資料:¶
“主” struct pcmcia_device 的保護方式如下(未提及只讀欄位或單次使用欄位)
由 pcmcia_socket->ops_mutex 保護
struct list_head socket_device_list; struct config_t *function_config; u16 _irq:1; u16 _io:1; u16 _win:4; u16 _locked:1; u16 allow_func_id_match:1; u16 suspended:1; u16 _removed:1;
由 PCMCIA 驅動程式保護
io_req_t io; irq_req_t irq; config_req_t conf; window_handle_t win;