@@ -182,6 +182,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
182182{
183183 struct uart_port * uport = uart_port_check (state );
184184 unsigned long page ;
185+ unsigned long flags = 0 ;
185186 int retval = 0 ;
186187
187188 if (uport -> type == PORT_UNKNOWN )
@@ -196,15 +197,18 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
196197 * Initialise and allocate the transmit and temporary
197198 * buffer.
198199 */
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 ;
204203
204+ uart_port_lock (state , flags );
205+ if (!state -> xmit .buf ) {
205206 state -> xmit .buf = (unsigned char * ) page ;
206207 uart_circ_clear (& state -> xmit );
208+ } else {
209+ free_page (page );
207210 }
211+ uart_port_unlock (uport , flags );
208212
209213 retval = uport -> ops -> startup (uport );
210214 if (retval == 0 ) {
@@ -263,6 +267,7 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
263267{
264268 struct uart_port * uport = uart_port_check (state );
265269 struct tty_port * port = & state -> port ;
270+ unsigned long flags = 0 ;
266271
267272 /*
268273 * Set the TTY IO error marker
@@ -295,10 +300,12 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
295300 /*
296301 * Free the transmit buffer page.
297302 */
303+ uart_port_lock (state , flags );
298304 if (state -> xmit .buf ) {
299305 free_page ((unsigned long )state -> xmit .buf );
300306 state -> xmit .buf = NULL ;
301307 }
308+ uart_port_unlock (uport , flags );
302309}
303310
304311/**
0 commit comments