Re: [PATCH 03/10] staging:iio:ad7476: Avoid alloc/free for each sample in buffered mode

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

 



On 09/08/2012 06:20 PM, Lars-Peter Clausen wrote:
> On 09/08/2012 11:40 AM, Jonathan Cameron wrote:
>> On 09/07/2012 05:37 PM, Lars-Peter Clausen wrote:
>>> On 09/07/2012 02:44 PM, Lars-Peter Clausen wrote:
>>>> The ad7476 driver has only support for 1 channel ADCs. So the upper limit for
>>>> the buffer size is the size of one sample plus the size of the timestamp.
>>>> Preallocate a buffer large enough to hold this to avoid having to allocate and
>>>> free a new buffer for each sample being captured.
>> Sensible move...
>>>>
>>>> Signed-off-by: Lars-Peter Clausen <lars@xxxxxxxxxx>
>>>> ---
>>>>  drivers/staging/iio/adc/ad7476.h      |    5 ++++-
>>>>  drivers/staging/iio/adc/ad7476_ring.c |   13 +++----------
>>>>  2 files changed, 7 insertions(+), 11 deletions(-)
>>>>
> [...]
>>>>  enum ad7476_supported_device_ids {
>>>> diff --git a/drivers/staging/iio/adc/ad7476_ring.c b/drivers/staging/iio/adc/ad7476_ring.c
>>>> index 940681f..185cfde 100644
>>>> --- a/drivers/staging/iio/adc/ad7476_ring.c
>>>> +++ b/drivers/staging/iio/adc/ad7476_ring.c
>>>> @@ -26,14 +26,9 @@ static irqreturn_t ad7476_trigger_handler(int irq, void  *p)
>>>>  	struct iio_dev *indio_dev = pf->indio_dev;
>>>>  	struct ad7476_state *st = iio_priv(indio_dev);
>>>>  	s64 time_ns;
>>>> -	__u8 *rxbuf;
>>>>  	int b_sent;
>>>>  
>>>> -	rxbuf = kzalloc(indio_dev->scan_bytes, GFP_KERNEL);
>>>> -	if (rxbuf == NULL)
>>>> -		goto done;
>>>> -
>>>> -	b_sent = spi_read(st->spi, rxbuf,
>>>> +	b_sent = spi_read(st->spi, st->data,
>>>>  			  st->chip_info->channel[0].scan_type.storagebits / 8);
>>>
>>> I just noticed this can even more be simplified by using the prepared SPI
>>> message. Unfortunately this will require regeneration of a few more patches.
>>> I'll resend the whole series next week, after it had some exposure to review.
>>
>> Hmm. Guess that would be a marginal improvement.  Actually from code
>> readability I'd be tempted to drop the prepared SPI message and
>> just do the spi_read as you have it here where that message is currently used.
>>
>> Obviously it'll have some overhead though so up to you which way you go.
> 
> I think the overhead is actually negligible. But there is a pattern that
> emerges. For SPI based devices we usually first send the spi message which
> fills the transfer buffer, then store the timestamp in the last element of the
> transfer buffer and then send the transfer buffer to the iio buffer using
> iio_push_to_buffer. What differs for different devices is how exactly the
> message looks, but the rest of the pattern is identical. So if we define the
> the message outside of the trigger handler, e.g. at device init or the
> update_scan_mode callback we get the opportunity to have a common trigger
> function between a wide range of different SPI devices. Obviously it wont work
> for all, because some need special handling, but it will provide a good default
> implementation. So that's one reason why I'd like to use spi_sync here, since
> it will make the migration later on more obvious.
Fair enough.
> 
> - Lars
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux