@@ -195,6 +195,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
195195{
196196 struct uart_port * uport = uart_port_check (state );
197197 unsigned long page ;
198+ unsigned long flags = 0 ;
198199 int retval = 0 ;
199200
200201 if (uport -> type == PORT_UNKNOWN )
@@ -209,15 +210,18 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
209210 * Initialise and allocate the transmit and temporary
210211 * buffer.
211212 */
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 ;
217216
217+ uart_port_lock (state , flags );
218+ if (!state -> xmit .buf ) {
218219 state -> xmit .buf = (unsigned char * ) page ;
219220 uart_circ_clear (& state -> xmit );
221+ } else {
222+ free_page (page );
220223 }
224+ uart_port_unlock (uport , flags );
221225
222226 retval = uport -> ops -> startup (uport );
223227 if (retval == 0 ) {
@@ -276,6 +280,7 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
276280{
277281 struct uart_port * uport = uart_port_check (state );
278282 struct tty_port * port = & state -> port ;
283+ unsigned long flags = 0 ;
279284
280285 /*
281286 * Set the TTY IO error marker
@@ -308,10 +313,12 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
308313 /*
309314 * Free the transmit buffer page.
310315 */
316+ uart_port_lock (state , flags );
311317 if (state -> xmit .buf ) {
312318 free_page ((unsigned long )state -> xmit .buf );
313319 state -> xmit .buf = NULL ;
314320 }
321+ uart_port_unlock (uport , flags );
315322}
316323
317324/**
0 commit comments