mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
2.5 KiB
133 lines
2.5 KiB
======= |
|
Locking |
|
======= |
|
|
|
This file explains the locking and exclusion scheme used in the PCCARD |
|
and 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 must |
|
be 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 must |
|
be called with "ops_mutex" held:: |
|
|
|
socket_reset() |
|
socket_setup() |
|
|
|
struct pccard_operations *ops |
|
struct pccard_resource_ops *resource_ops; |
|
|
|
Note that send_event() and `struct pcmcia_callback *callback` must not be |
|
called with "ops_mutex" held. |
|
|
|
|
|
C) Protection |
|
============= |
|
|
|
1. Global Data: |
|
--------------- |
|
struct list_head pcmcia_socket_list; |
|
|
|
protected by pcmcia_socket_list_rwsem; |
|
|
|
|
|
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 fields |
|
or 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 fields |
|
or 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;
|
|
|