PageRenderTime 73ms CodeModel.GetById 20ms app.highlight 27ms RepoModel.GetById 14ms app.codeStats 0ms

/Documentation/pcmcia/locking.txt

https://bitbucket.org/sammyz/iscream_thunderc-2.6.35-rebase
Plain Text | 118 lines | 89 code | 29 blank | 0 comment | 0 complexity | 413407365d20e03127a114cc86d48929 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1This file explains the locking and exclusion scheme used in the PCCARD
  2and PCMCIA subsystems.
  3
  4
  5A) Overview, Locking Hierarchy:
  6===============================
  7
  8pcmcia_socket_list_rwsem	- protects only the list of sockets
  9- skt_mutex			- serializes card insert / ejection
 10  - ops_mutex			- serializes socket operation
 11
 12
 13B) Exclusion
 14============
 15
 16The following functions and callbacks to struct pcmcia_socket must
 17be 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
 33The following functions and callbacks to struct pcmcia_socket must
 34be 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
 42Note that send_event() and struct pcmcia_callback *callback must not be
 43called with "ops_mutex" held.
 44
 45
 46C) Protection
 47=============
 48
 491. Global Data:
 50---------------
 51struct list_head	pcmcia_socket_list;
 52
 53protected by pcmcia_socket_list_rwsem;
 54
 55
 562. Per-Socket Data:
 57-------------------
 58The resource_ops and their data are protected by ops_mutex.
 59
 60The "main" struct pcmcia_socket is protected as follows (read-only fields
 61or 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
 963. Per PCMCIA-device Data:
 97--------------------------
 98
 99The "main" struct pcmcia_devie is protected as follows (read-only fields
100or 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;