@@ -172,6 +172,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
172172{
173173 struct uart_port * uport = uart_port_check (state );
174174 unsigned long page ;
175+ unsigned long flags = 0 ;
175176 int retval = 0 ;
176177
177178 if (uport -> type == PORT_UNKNOWN )
@@ -186,15 +187,18 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
186187 * Initialise and allocate the transmit and temporary
187188 * buffer.
188189 */
189- if (!state -> xmit .buf ) {
190- /* This is protected by the per port mutex */
191- page = get_zeroed_page (GFP_KERNEL );
192- if (!page )
193- return - ENOMEM ;
190+ page = get_zeroed_page (GFP_KERNEL );
191+ if (!page )
192+ return - ENOMEM ;
194193
194+ uart_port_lock (state , flags );
195+ if (!state -> xmit .buf ) {
195196 state -> xmit .buf = (unsigned char * ) page ;
196197 uart_circ_clear (& state -> xmit );
198+ } else {
199+ free_page (page );
197200 }
201+ uart_port_unlock (uport , flags );
198202
199203 retval = uport -> ops -> startup (uport );
200204 if (retval == 0 ) {
@@ -253,6 +257,7 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
253257{
254258 struct uart_port * uport = uart_port_check (state );
255259 struct tty_port * port = & state -> port ;
260+ unsigned long flags = 0 ;
256261
257262 /*
258263 * Set the TTY IO error marker
@@ -285,10 +290,12 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
285290 /*
286291 * Free the transmit buffer page.
287292 */
293+ uart_port_lock (state , flags );
288294 if (state -> xmit .buf ) {
289295 free_page ((unsigned long )state -> xmit .buf );
290296 state -> xmit .buf = NULL ;
291297 }
298+ uart_port_unlock (uport , flags );
292299}
293300
294301/**
0 commit comments