Locking¶
This file explains the locking and exclusion scheme used in the PCCARDand PCMCIA subsystems.
A) Overview, Locking Hierarchy:¶
- pcmcia_socket_list_rwsem
- protects only the list of sockets
- skt_mutex
- serializes card insert / ejection
- ops_mutex
- serializes socket operation
B) Exclusion¶
The following functions and callbacks to struct pcmcia_socket mustbe called with “skt_mutex” held:
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
The following functions and callbacks to struct pcmcia_socket mustbe called with “ops_mutex” held:
socket_reset()socket_setup()struct pccard_operations *opsstruct pccard_resource_ops *resource_ops;
Note that send_event() andstruct pcmcia_callback *callback must not becalled with “ops_mutex” held.
C) Protection¶
2. Per-Socket Data:¶
The resource_ops and their data are protected by ops_mutex.
The “main” struct pcmcia_socket is protected as follows (read-only fieldsor single-use fields not mentioned):
by pcmcia_socket_list_rwsem:
struct list_head socket_list;
by thread_lock:
unsigned int thread_events;
by skt_mutex:
u_int suspended_state;void (*tune_bridge);struct pcmcia_callback *callback;int resume_status;
by 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. Per PCMCIA-device Data:¶
The “main” struct pcmcia_device is protected as follows (read-only fieldsor single-use fields not mentioned):
by 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;
by the PCMCIA driver:
io_req_t io;irq_req_t irq;config_req_t conf;window_handle_t win;