On Mon, 5 Sep 2016, Felipe Balbi wrote:

> >> [   34.123281] ==> bulk_out_complete 484
> >
> > received CBW. Now, bh->state is set to BUF_STATE_FULL, and ...
> >
> >> [   34.123283] ==> wakeup_thread 403: caller 
> >> usb_gadget_giveback_request+0x7/0x10: thread_wakeup_needed = 1
> >
> > wakeup_thread() is called, however ...
> >
> >> [   34.123283] ==> get_next_command 2251 -> state != full
> >
> > get_next_command() still sees bh->state != BUF_STATE_FULL.

Okay, that's very strange.  It suggests something may actively be 
changing bh->state back to BUF_STATE_EMPTY.  I can't imagine what.

> >> [   34.123286] ===> sleep_thread 634: caller fsg_main_thread+0xaa1/0xb00 
> >> [usb_f_mass_storage]: going to sleep
> >> [   34.123289] ===> sleep_thread 634: caller fsg_main_thread+0xaa1/0xb00 
> >> [usb_f_mass_storage]: going to sleep
> >
> > so it goes to sleep and never wakes up again.

It looks like the thread wakes up and goes back to sleep right away 
several times.  This wouldn't happen if the problem were that the CPU 
didn't see the update to bh->state.

> one thing that caught my attention is that not all accesses to bh->state
> are locked. Is that an oversight or is there a valid reason for that?

To the largest extent possible, I tried to write the driver so that the 
thread wouldn't have to do any locking, only the completion handlers 
would.  Looking back on it now, I realize that even less locking should 
be necessary, because for each IN buffer the thread is a producer and 
the completion handler is a consumer, and for each OUT buffer the 
handler is a producer and the thread is a consumer.  Producer/consumer 
patterns don't need locking, just proper ordering.

As for what ordering is needed, I'll discuss that in the other email 
thread.

> Considering that accessing bh->state would always guarantee a full
> barrier (at least on x86, per Peter Z), I'm wondering if we should make
> every access to bh->state locked. Or, perhaps, they should all be
> preceeded with a call to smp_mb() in order to guarantee that previous
> writes to bh->state are seen by current CPU?
> 
> I can test that out, but I'll wait for a proper patch from you as I
> cannot predict all memory ordering problems that could arise from
> current code. Still, f_mass_storage.c looks really odd :-s

It definitely could use some clean-up attention.

Alan Stern

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to