On Tue, Jun 12, 2018 at 09:53:01AM +0800, Peter Chen wrote: > The port->logbuffer_head may be wrong if the two processes enters > _tcpm_log at the mostly same time. The 2nd process enters _tcpm_log > before the 1st process update the index, then the 2nd process will > not allocate logbuffer, when the 2nd process tries to use log buffer, > the index has already updated by the 1st process, so it will get > NULL pointer for updated logbuffer, the error message like below: > > tcpci 0-0050: Log buffer index 6 is NULL > > Cc: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > Cc: Guenter Roeck <linux@xxxxxxxxxxxx> > Cc: Jun Li <jun.li@xxxxxxx> > Signed-off-by: Peter Chen <peter.chen@xxxxxxx> Reviewed-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > --- > drivers/usb/typec/tcpm.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c > index 0ccd2ce1eb59..2ed07d0bf364 100644 > --- a/drivers/usb/typec/tcpm.c > +++ b/drivers/usb/typec/tcpm.c > @@ -418,17 +418,18 @@ static void _tcpm_log(struct tcpm_port *port, const char *fmt, va_list args) > u64 ts_nsec = local_clock(); > unsigned long rem_nsec; > > + mutex_lock(&port->logbuffer_lock); > if (!port->logbuffer[port->logbuffer_head]) { > port->logbuffer[port->logbuffer_head] = > kzalloc(LOG_BUFFER_ENTRY_SIZE, GFP_KERNEL); > - if (!port->logbuffer[port->logbuffer_head]) > + if (!port->logbuffer[port->logbuffer_head]) { > + mutex_unlock(&port->logbuffer_lock); > return; > + } > } > > vsnprintf(tmpbuffer, sizeof(tmpbuffer), fmt, args); > > - mutex_lock(&port->logbuffer_lock); > - > if (tcpm_log_full(port)) { > port->logbuffer_head = max(port->logbuffer_head - 1, 0); > strcpy(tmpbuffer, "overflow"); Thanks, -- heikki -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html