About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / pcmcia / locking.txt


Based on kernel version 4.16.1. Page generated on 2018-04-09 11:53 EST.

1	This file explains the locking and exclusion scheme used in the PCCARD
2	and PCMCIA subsystems.
3	
4	
5	A) Overview, Locking Hierarchy:
6	===============================
7	
8	pcmcia_socket_list_rwsem	- protects only the list of sockets
9	- skt_mutex			- serializes card insert / ejection
10	  - ops_mutex			- serializes socket operation
11	
12	
13	B) Exclusion
14	============
15	
16	The following functions and callbacks to struct pcmcia_socket must
17	be called with "skt_mutex" held:
18	
19		socket_detect_change()
20		send_event()
21		socket_reset()
22		socket_shutdown()
23		socket_setup()
24		socket_remove()
25		socket_insert()
26		socket_early_resume()
27		socket_late_resume()
28		socket_resume()
29		socket_suspend()
30	
31		struct pcmcia_callback	*callback
32	
33	The following functions and callbacks to struct pcmcia_socket must
34	be called with "ops_mutex" held:
35	
36		socket_reset()
37		socket_setup()
38	
39		struct pccard_operations	*ops
40		struct pccard_resource_ops	*resource_ops;
41	
42	Note that send_event() and struct pcmcia_callback *callback must not be
43	called with "ops_mutex" held.
44	
45	
46	C) Protection
47	=============
48	
49	1. Global Data:
50	---------------
51	struct list_head	pcmcia_socket_list;
52	
53	protected by pcmcia_socket_list_rwsem;
54	
55	
56	2. Per-Socket Data:
57	-------------------
58	The resource_ops and their data are protected by ops_mutex.
59	
60	The "main" struct pcmcia_socket is protected as follows (read-only fields
61	or single-use fields not mentioned):
62	
63	- by pcmcia_socket_list_rwsem:
64		struct list_head	socket_list;
65	
66	- by thread_lock:
67		unsigned int		thread_events;
68	
69	- by skt_mutex:
70		u_int			suspended_state;
71		void			(*tune_bridge);
72		struct pcmcia_callback	*callback;
73		int			resume_status;
74	
75	- by ops_mutex:
76		socket_state_t		socket;
77		u_int			state;
78		u_short			lock_count;
79		pccard_mem_map		cis_mem;
80		void __iomem 		*cis_virt;
81		struct { }		irq;
82		io_window_t		io[];
83		pccard_mem_map		win[];
84		struct list_head	cis_cache;
85		size_t			fake_cis_len;
86		u8			*fake_cis;
87		u_int			irq_mask;
88		void 			(*zoom_video);
89		int 			(*power_hook);
90		u8			resource...;
91		struct list_head	devices_list;
92		u8			device_count;
93		struct 			pcmcia_state;
94	
95	
96	3. Per PCMCIA-device Data:
97	--------------------------
98	
99	The "main" struct pcmcia_device is protected as follows (read-only fields
100	or single-use fields not mentioned):
101	
102	
103	- by pcmcia_socket->ops_mutex:
104		struct list_head	socket_device_list;
105		struct config_t		*function_config;
106		u16			_irq:1;
107		u16			_io:1;
108		u16			_win:4;
109		u16			_locked:1;
110		u16			allow_func_id_match:1;
111		u16			suspended:1;
112		u16			_removed:1;
113	
114	- by the PCMCIA driver:
115		io_req_t		io;
116		irq_req_t		irq;
117		config_req_t		conf;
118		window_handle_t		win;
Hide Line Numbers


About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog