@@ -195,6 +195,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
195
195
{
196
196
struct uart_port * uport = uart_port_check (state );
197
197
unsigned long page ;
198
+ unsigned long flags = 0 ;
198
199
int retval = 0 ;
199
200
200
201
if (uport -> type == PORT_UNKNOWN )
@@ -209,15 +210,18 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
209
210
* Initialise and allocate the transmit and temporary
210
211
* buffer.
211
212
*/
212
- if (!state -> xmit .buf ) {
213
- /* This is protected by the per port mutex */
214
- page = get_zeroed_page (GFP_KERNEL );
215
- if (!page )
216
- return - ENOMEM ;
213
+ page = get_zeroed_page (GFP_KERNEL );
214
+ if (!page )
215
+ return - ENOMEM ;
217
216
217
+ uart_port_lock (state , flags );
218
+ if (!state -> xmit .buf ) {
218
219
state -> xmit .buf = (unsigned char * ) page ;
219
220
uart_circ_clear (& state -> xmit );
221
+ } else {
222
+ free_page (page );
220
223
}
224
+ uart_port_unlock (uport , flags );
221
225
222
226
retval = uport -> ops -> startup (uport );
223
227
if (retval == 0 ) {
@@ -276,6 +280,7 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
276
280
{
277
281
struct uart_port * uport = uart_port_check (state );
278
282
struct tty_port * port = & state -> port ;
283
+ unsigned long flags = 0 ;
279
284
280
285
/*
281
286
* Set the TTY IO error marker
@@ -308,10 +313,12 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
308
313
/*
309
314
* Free the transmit buffer page.
310
315
*/
316
+ uart_port_lock (state , flags );
311
317
if (state -> xmit .buf ) {
312
318
free_page ((unsigned long )state -> xmit .buf );
313
319
state -> xmit .buf = NULL ;
314
320
}
321
+ uart_port_unlock (uport , flags );
315
322
}
316
323
317
324
/**
0 commit comments