On 20/12/16 10:28, Johan Hovold wrote:
> On Tue, Dec 20, 2016 at 01:12:08AM +0000, Bryan O'Donoghue wrote:
>> Currently the greybus-loopback thread logic spins around waiting for
>> send_count == iteration_max which on real hardware doesn't make a
>> difference to us but in simulation is excruciatingly slow, anti-social and
>> bad manners. Use the existing gb_loopback_async_wait_all() function to gate
>> continuing when the send_count == iteration_max and go to sleep until
>> there's something worthwhile to-do.
>>
>> Signed-off-by: Bryan O'Donoghue <pure.lo...@nexus-software.ie>
> 
> You forgot to CC me and Alex.
> 
>> ---
>>  drivers/staging/greybus/loopback.c | 12 ++++++++++++
>>  1 file changed, 12 insertions(+)
>>
>> diff --git a/drivers/staging/greybus/loopback.c 
>> b/drivers/staging/greybus/loopback.c
>> index 7882306..d6302ef 100644
>> --- a/drivers/staging/greybus/loopback.c
>> +++ b/drivers/staging/greybus/loopback.c
>> @@ -1008,11 +1008,23 @@ static int gb_loopback_fn(void *data)
>>  
>>              /* Optionally terminate */
>>              if (gb->send_count == gb->iteration_max) {
>> +                    mutex_unlock(&gb->mutex);
>> +
>> +                    /* Wait for synchronous and asynchronus completion */
>> +                    gb_loopback_async_wait_all(gb);
> 
> This introduces a non-interruptible wait here, which should be ok given
> that all outstanding operations will be cancelled by core as part of
> connection disable before stopping the kthread during disconnect.
> 
> But this driver is full of such subtleties and really needs a clean up
> (or rewrite).

A rewrite is on the bucket list at some point.

>> +
>> +                    /* Mark complete unless user-space has poked us */
>> +                    mutex_lock(&gb->mutex);
>>                      if (gb->iteration_count == gb->iteration_max) {
>>                              gb->type = 0;
>>                              gb->send_count = 0;
>>                              sysfs_notify(&gb->dev->kobj,  NULL,
>>                                              "iteration_count");
>> +                            dev_dbg(&gb->connection->bundle->dev,
> 
> You have a pointer to the bundle you should use here and below.

Will do.

> 
>> +                                    "load test complete\n");
>> +                    } else {
>> +                            dev_dbg(&gb->connection->bundle->dev,
>> +                                    "continuing on with new test set\n");
> 
> The fact that user-space can reset test counters and change parameters
> while a test is running is really another bug.

Agreed will be done on the rewrite.

---
bod
_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to