@@ -182,6 +182,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
182
182
{
183
183
struct uart_port * uport = uart_port_check (state );
184
184
unsigned long page ;
185
+ unsigned long flags = 0 ;
185
186
int retval = 0 ;
186
187
187
188
if (uport -> type == PORT_UNKNOWN )
@@ -196,15 +197,18 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
196
197
* Initialise and allocate the transmit and temporary
197
198
* buffer.
198
199
*/
199
- if (!state -> xmit .buf ) {
200
- /* This is protected by the per port mutex */
201
- page = get_zeroed_page (GFP_KERNEL );
202
- if (!page )
203
- return - ENOMEM ;
200
+ page = get_zeroed_page (GFP_KERNEL );
201
+ if (!page )
202
+ return - ENOMEM ;
204
203
204
+ uart_port_lock (state , flags );
205
+ if (!state -> xmit .buf ) {
205
206
state -> xmit .buf = (unsigned char * ) page ;
206
207
uart_circ_clear (& state -> xmit );
208
+ } else {
209
+ free_page (page );
207
210
}
211
+ uart_port_unlock (uport , flags );
208
212
209
213
retval = uport -> ops -> startup (uport );
210
214
if (retval == 0 ) {
@@ -263,6 +267,7 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
263
267
{
264
268
struct uart_port * uport = uart_port_check (state );
265
269
struct tty_port * port = & state -> port ;
270
+ unsigned long flags = 0 ;
266
271
267
272
/*
268
273
* Set the TTY IO error marker
@@ -295,10 +300,12 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
295
300
/*
296
301
* Free the transmit buffer page.
297
302
*/
303
+ uart_port_lock (state , flags );
298
304
if (state -> xmit .buf ) {
299
305
free_page ((unsigned long )state -> xmit .buf );
300
306
state -> xmit .buf = NULL ;
301
307
}
308
+ uart_port_unlock (uport , flags );
302
309
}
303
310
304
311
/**
0 commit comments