Re: [PATCH v3 3/4] staging: greybus: loopback: convert loopback to use generic async operations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jan 04, 2017 at 12:11:20AM +0000, Bryan O'Donoghue wrote:
> Loopback has its own internal method for tracking and timing out
> asynchronous operations however previous patches make it possible to use
> functionality provided by operation.c to do this instead. Using the code in
> operation.c means we can completely subtract the timer, the work-queue, the
> kref and the cringe-worthy 'pending' flag. The completion callback
> triggered by operation.c will provide an authoritative result code -
> including -ETIMEDOUT for asynchronous operations. Tested to ensure the
> existing stats given by loopback for synchronous, asynchronous and
> asynchronous+timeout still hold.

Good that you verified and mention that here, but not sure adding all
the numbers below is needed. What test setup are you using by the way?

Also note that this one no longer applies due to a trivial clean up
patch in staging-next.

A couple of comments below.

> Before:
> gb_loopback_test -i 1000 -s 128 -t sink -p
> 1970-1-1 7:30:8
>  test:			sink
>  path:			gb_loopback0
>  size:			128
>  iterations:		1000
>  errors:		0
>  async:			Disabled
>  requests per-sec:	min=432, max=436, average=434.662994, jitter=4
>  ap-throughput B/s:	min=67535 max=68036 average=67807.421875 jitter=501
>  ap-latency usec:	min=1626 max=3559 average=2287.077881 jitter=1933
>  apbridge-latency usec:	min=0 max=0 average=0.000000 jitter=0
>  gbphy-latency usec:	min=0 max=0 average=0.000000 jitter=0

[...]

> Signed-off-by: Bryan O'Donoghue <pure.logic@xxxxxxxxxxxxxxxxx>
> Signed-off-by: Mitchell Tasman <tasman@xxxxxxxxxxxx>
> ---
>  drivers/staging/greybus/loopback.c | 167 +++++++------------------------------
>  1 file changed, 32 insertions(+), 135 deletions(-)

> @@ -615,32 +513,29 @@ static int gb_loopback_async_operation(struct gb_loopback *gb, int type,
>  	if (request_size)
>  		memcpy(operation->request->payload, request, request_size);
>  
> +	gb_operation_set_data(operation, op_async);
> +
>  	op_async->gb = gb;
>  	op_async->operation = operation;
>  	op_async->completion = completion;
>  
> -	spin_lock_irqsave(&gb_dev.lock, flags);
> -	list_add_tail(&op_async->entry, &gb_dev.list_op_async);
> -	spin_unlock_irqrestore(&gb_dev.lock, flags);
> -
>  	do_gettimeofday(&op_async->ts);
> -	op_async->pending = true;
> +
>  	atomic_inc(&gb->outstanding_operations);
> +
>  	mutex_lock(&gb->mutex);

Do you still need this lock?

> -	ret = gb_operation_request_send(operation,
> +	ret = gb_operation_request_send_timeout(operation,
> +					jiffies_to_msecs(gb->jiffy_timeout),
>  					gb_loopback_async_operation_callback,
>  					GFP_KERNEL);
>  	if (ret)
>  		goto error;
>  
> -	setup_timer(&op_async->timer, gb_loopback_async_operation_timeout,
> -			(unsigned long)operation->id);
> -	op_async->timer.expires = jiffies + gb->jiffy_timeout;
> -	add_timer(&op_async->timer);
> -
>  	goto done;
>  error:
> -	gb_loopback_async_operation_put(op_async);
> +	atomic_dec(&gb->outstanding_operations);
> +	gb_operation_put(operation);
> +	kfree(op_async);
>  done:
>  	mutex_unlock(&gb->mutex);
>  	return ret;
> @@ -1045,8 +940,10 @@ static int gb_loopback_fn(void *data)
>  				error = gb_loopback_async_sink(gb, size);
>  			}
>  
> -			if (error)
> +			if (error) {
>  				gb->error++;
> +				gb->iteration_count++;
> +			}

This is an unrelated bug fix that should go in it's own patch, right?

The iteration count should be incremented on errors regardless of this
change.

>  		} else {
>  			/* We are effectively single threaded here */
>  			if (type == GB_LOOPBACK_TYPE_PING)

Thanks,
Johan
_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel



[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux