driver ring buffer overrun and printf usage

Dave Hylands dhylands at gmail.com
Thu Jul 14 13:02:10 EDT 2011


Hi Amit,

On Thu, Jul 14, 2011 at 5:20 AM, Amit Nagal <helloin.amit at gmail.com> wrote:
> Hi ,
>
> In my embedded linux-arm target , in a userspace thread , i am reading
> hid events over usb-hiddev interface (/dev/hiddev) .
>
> basically what i do  is this :
>
> read_thread(){
> while(1){
> ret = read( "/dev/hiddev" , user_buffer , bytes_to_read);
> printf("bytes received =%d" , ret ) ;  // (printf prints debug message
> to serial console  );
> }
> }
>
> now whenever i use the printf statement in read thread ,  kernel space
> ring buffer  in usb-hid driver is overrun frequently , which results
> in loss of data send by usb device .
> if i remove printf in read thread , no overruns are reported in
> usb-hid driver . that means if  printf is used , application
> read_thread is not able to
> read data in time which leads to driver ring buffer overrun .
>
> does this behaviour of printf points to some problem in embedded
> linux's  scheduler  ( printf prints data to debug serial port , and
> consecutive read() calls in  read_thread() are  scheduled lately due
> to that ) ?

No - It points to the fact that you're trying to generate more
bandwidth than the serial port can process.

> do the actual implementation of printf  involves any kind of sleeps ?

Absolutely. Let's say that your serial port is running at 115K baud.
That means that you can send approximately 11,500 characters/second.
If you try to generate higher bandwidth than this then you will
eventually fill whatever buffers exist, and then you'll sleep waiting
for space to become available in the buffer.

> kindly share necessary insight wrt above printf usage and driver ring
> buffer overrun .

For situations like this, you typically need to log to a memory buffer
(I normally use a circular buffer of some type and have new entries
overwrite old entries).

Then when you're finished, you can dump information from the memory buffer.

-- 
Dave Hylands
Shuswap, BC, Canada
http://www.davehylands.com



More information about the Kernelnewbies mailing list