Re: serial/ftdi_sio byte loss / performance regression

2013-06-12 Thread Johan Hovold
  a37025b USB: ftdi_sio: fix chars_in_buffer overhead
  c413364 USB: ftdi_sio: clean up get_modem_status
  dcf0105 USB: serial: add generic wait_until_sent implementation
  
  These three are also needed in 3.9 (and also 3.8).
 
 I have these three. 3.8-stable is dead as far as I'm concerned, so I
 can't do anything about it :)

Yeah, I know. I just put it in parenthesis for reference. Feels like
every kernel version is being picked up by someone these days. :)

Johan
--
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


Re: serial/ftdi_sio byte loss / performance regression

2013-06-11 Thread Greg KH
On Thu, Jun 06, 2013 at 11:21:54AM -0700, Greg KH wrote:
 On Thu, Jun 06, 2013 at 11:58:56AM +0200, Johan Hovold wrote:
  On Thu, Jun 06, 2013 at 10:50:36AM +0200, Tomaž Šolc wrote:
   Hi
   
   I have noticed that the ftdi_sio serial driver in recent kernel versions
   has very bad performance when used through the Python's serial library.
   
   As a test case I have a custom device that will send a continuous block
   of 5k characters once every few seconds over a RS-232 line (115200 baud)
   to an Olimex programmer (based on FT2232C, also tried one with FT2232H).
   
   Programmer is connected to a Linux system where a simple Python script
   reads the device:
   
   import serial
   comm = serial.Serial(/dev/ttyUSB0, 115200)
   while True:
 line = comm.readline()
   
   With kernels before 3.7.0 the script reads uncorrupted data while using
   newer kernels (including 3.9.4) the Python script sees heavy byte loss.
   top shows an 95% idle CPU. Only very slow transmissions (on the
   order of tens of bytes per second) will come through uncorrupted.
   
   Using git-bisect, I have found the commit that introduced this problem:
   
   6f602912c9d0c84c2edbd446dd9f72660b701605
   usb: serial: ftdi_sio: Add missing chars_in_buffer function
   
   This might also be related with the unusual way Python serial library
   reads the device. It uses select() with no timeout and single byte
   read()s in a loop. strace output:
   
   select(4, [3], [], [], NULL)= 1 (in [3])
   read(3, D, 1) = 1
   select(4, [3], [], [], NULL)= 1 (in [3])
   read(3, E, 1) = 1
   ...
   
   With sufficiently large read()s the byte loss can be eliminated.
   
   With the commit above, each select() now causes an additional round trip
   over USB to read the state of the hardware buffer. It's possible that
   constant status querying triggers some bug in the hardware or the query
   is simply too slow and causes overflows in the hardware buffer.
  
  You're absolutely right. This is a known issue (the select overhead)
  that was just recently fixed by commit a37025b5c7 (USB: ftdi_sio: fix
  chars_in_buffer overhead) in v3.10-rc3. Care to give v3.10-rc4 a try?
  
  Greg, perhaps we should consider backporting the wait-until-sent
  patches (i.e. 0693196fe..4746b6c6e)?
 
 Yes, that's a good idea, I'll do that for the next round of stable
 updates, after this next release tomorrow.

I applied these, plus a few others in order to get them all to apply and
build properly.

But the last patch, 4746b6c6e, didn't apply, and I don't think we really
need it for the 3.9 kernel, do we?

thanks,

greg k-h
--
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


Re: serial/ftdi_sio byte loss / performance regression

2013-06-11 Thread Johan Hovold
On Mon, Jun 10, 2013 at 02:39:06PM -0700, Greg KH wrote:
 On Thu, Jun 06, 2013 at 11:21:54AM -0700, Greg KH wrote:
  On Thu, Jun 06, 2013 at 11:58:56AM +0200, Johan Hovold wrote:

   Greg, perhaps we should consider backporting the wait-until-sent
   patches (i.e. 0693196fe..4746b6c6e)?
  
  Yes, that's a good idea, I'll do that for the next round of stable
  updates, after this next release tomorrow.
 
 I applied these, plus a few others in order to get them all to apply and
 build properly.
 
 But the last patch, 4746b6c6e, didn't apply, and I don't think we really
 need it for the 3.9 kernel, do we?

No, you're right. It's merely a clean up and slight optimisation as no
chars_in_buffer needs the disconnect mutex after the other changes. Not
sure why it wouldn't apply, though.

I was a bit sloppy when I gave the commit refs above -- it should have
been

0693196^..b16634a

More specifically:

4746b6c USB: serial: clean up chars_in_buffer

This one is not strictly necessary, but should apply to v3.9.

ff93b19 USB: ti_usb_3410_5052: fix chars_in_buffer overhead

This should not be applied to v3.9 as the problem it fixes
wasn't introduced until v3.10-rc1.

It seems you had to add two other patches to get this one to
apply. They should be dropped as well.

b16634a USB: io_ti: fix chars_in_buffer overhead

Needed in 3.9.

a37025b USB: ftdi_sio: fix chars_in_buffer overhead
c413364 USB: ftdi_sio: clean up get_modem_status
dcf0105 USB: serial: add generic wait_until_sent implementation

These three are also needed in 3.9 (and also 3.8).

0693196 USB: serial: add wait_until_sent operation

Needed in 3.9 (and 3.8). (You noticed my refspec did not include
it and added it.)

Sorry about the confusion.

Johan
--
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


Re: serial/ftdi_sio byte loss / performance regression

2013-06-11 Thread Greg KH
On Tue, Jun 11, 2013 at 12:43:25PM +0200, Johan Hovold wrote:
 On Mon, Jun 10, 2013 at 02:39:06PM -0700, Greg KH wrote:
  On Thu, Jun 06, 2013 at 11:21:54AM -0700, Greg KH wrote:
   On Thu, Jun 06, 2013 at 11:58:56AM +0200, Johan Hovold wrote:
 
Greg, perhaps we should consider backporting the wait-until-sent
patches (i.e. 0693196fe..4746b6c6e)?
   
   Yes, that's a good idea, I'll do that for the next round of stable
   updates, after this next release tomorrow.
  
  I applied these, plus a few others in order to get them all to apply and
  build properly.
  
  But the last patch, 4746b6c6e, didn't apply, and I don't think we really
  need it for the 3.9 kernel, do we?
 
 No, you're right. It's merely a clean up and slight optimisation as no
 chars_in_buffer needs the disconnect mutex after the other changes. Not
 sure why it wouldn't apply, though.
 
 I was a bit sloppy when I gave the commit refs above -- it should have
 been
 
   0693196^..b16634a
 
 More specifically:
 
 4746b6c USB: serial: clean up chars_in_buffer
 
   This one is not strictly necessary, but should apply to v3.9.

It doesn't apply to 3.9 at all, so it being not really necessary, I'll
not include it :)

 ff93b19 USB: ti_usb_3410_5052: fix chars_in_buffer overhead
 
   This should not be applied to v3.9 as the problem it fixes
   wasn't introduced until v3.10-rc1.
 
   It seems you had to add two other patches to get this one to
   apply. They should be dropped as well.

Ok, I've dropped all 3 of these now.

 b16634a USB: io_ti: fix chars_in_buffer overhead
 
   Needed in 3.9.

Good, I have that one.

 a37025b USB: ftdi_sio: fix chars_in_buffer overhead
 c413364 USB: ftdi_sio: clean up get_modem_status
 dcf0105 USB: serial: add generic wait_until_sent implementation
 
   These three are also needed in 3.9 (and also 3.8).

I have these three. 3.8-stable is dead as far as I'm concerned, so I
can't do anything about it :)

 0693196 USB: serial: add wait_until_sent operation
 
   Needed in 3.9 (and 3.8). (You noticed my refspec did not include
   it and added it.)

Yes, other things were breaking without it.

 Sorry about the confusion.

No worries, I've dropped the three patches listed above, so we should be
all good to go.  I'll do a 3.9.6-rc1 release today to get these all out
to people to test.

thanks,

greg k-h
--
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


Re: serial/ftdi_sio byte loss / performance regression

2013-06-07 Thread Tomaž Šolc
On 06/06/2013 11:58 AM, Johan Hovold wrote:
 On Thu, Jun 06, 2013 at 10:50:36AM +0200, Tomaž Šolc wrote:
 I have noticed that the ftdi_sio serial driver in recent kernel versions
 has very bad performance when used through the Python's serial library.

 As a test case I have a custom device that will send a continuous block
 of 5k characters once every few seconds over a RS-232 line (115200 baud)
 to an Olimex programmer (based on FT2232C, also tried one with FT2232H).

 Programmer is connected to a Linux system where a simple Python script
 reads the device:

 import serial
 comm = serial.Serial(/dev/ttyUSB0, 115200)
 while True:
  line = comm.readline()

 With kernels before 3.7.0 the script reads uncorrupted data while using
 newer kernels (including 3.9.4) the Python script sees heavy byte loss.
 top shows an 95% idle CPU. Only very slow transmissions (on the
 order of tens of bytes per second) will come through uncorrupted.

 Using git-bisect, I have found the commit that introduced this problem:

 6f602912c9d0c84c2edbd446dd9f72660b701605
 usb: serial: ftdi_sio: Add missing chars_in_buffer function

 This might also be related with the unusual way Python serial library
 reads the device. It uses select() with no timeout and single byte
 read()s in a loop. strace output:

 select(4, [3], [], [], NULL)= 1 (in [3])
 read(3, D, 1) = 1
 select(4, [3], [], [], NULL)= 1 (in [3])
 read(3, E, 1) = 1
 ...

 With sufficiently large read()s the byte loss can be eliminated.

 With the commit above, each select() now causes an additional round trip
 over USB to read the state of the hardware buffer. It's possible that
 constant status querying triggers some bug in the hardware or the query
 is simply too slow and causes overflows in the hardware buffer.
 
 You're absolutely right. This is a known issue (the select overhead)
 that was just recently fixed by commit a37025b5c7 (USB: ftdi_sio: fix
 chars_in_buffer overhead) in v3.10-rc3. Care to give v3.10-rc4 a try?

Johan, thanks for the prompt reply. I have tried v3.10-rc4 and indeed
the issue is fixed.

Best regards
Tomaž
--
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


serial/ftdi_sio byte loss / performance regression

2013-06-06 Thread Tomaž Šolc
Hi

I have noticed that the ftdi_sio serial driver in recent kernel versions
has very bad performance when used through the Python's serial library.

As a test case I have a custom device that will send a continuous block
of 5k characters once every few seconds over a RS-232 line (115200 baud)
to an Olimex programmer (based on FT2232C, also tried one with FT2232H).

Programmer is connected to a Linux system where a simple Python script
reads the device:

import serial
comm = serial.Serial(/dev/ttyUSB0, 115200)
while True:
line = comm.readline()

With kernels before 3.7.0 the script reads uncorrupted data while using
newer kernels (including 3.9.4) the Python script sees heavy byte loss.
top shows an 95% idle CPU. Only very slow transmissions (on the
order of tens of bytes per second) will come through uncorrupted.

Using git-bisect, I have found the commit that introduced this problem:

6f602912c9d0c84c2edbd446dd9f72660b701605
usb: serial: ftdi_sio: Add missing chars_in_buffer function

This might also be related with the unusual way Python serial library
reads the device. It uses select() with no timeout and single byte
read()s in a loop. strace output:

select(4, [3], [], [], NULL)= 1 (in [3])
read(3, D, 1) = 1
select(4, [3], [], [], NULL)= 1 (in [3])
read(3, E, 1) = 1
...

With sufficiently large read()s the byte loss can be eliminated.

With the commit above, each select() now causes an additional round trip
over USB to read the state of the hardware buffer. It's possible that
constant status querying triggers some bug in the hardware or the query
is simply too slow and causes overflows in the hardware buffer.

Thanks for your help
Tomaž
--
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


Re: serial/ftdi_sio byte loss / performance regression

2013-06-06 Thread Johan Hovold
On Thu, Jun 06, 2013 at 10:50:36AM +0200, Tomaž Šolc wrote:
 Hi
 
 I have noticed that the ftdi_sio serial driver in recent kernel versions
 has very bad performance when used through the Python's serial library.
 
 As a test case I have a custom device that will send a continuous block
 of 5k characters once every few seconds over a RS-232 line (115200 baud)
 to an Olimex programmer (based on FT2232C, also tried one with FT2232H).
 
 Programmer is connected to a Linux system where a simple Python script
 reads the device:
 
 import serial
 comm = serial.Serial(/dev/ttyUSB0, 115200)
 while True:
   line = comm.readline()
 
 With kernels before 3.7.0 the script reads uncorrupted data while using
 newer kernels (including 3.9.4) the Python script sees heavy byte loss.
 top shows an 95% idle CPU. Only very slow transmissions (on the
 order of tens of bytes per second) will come through uncorrupted.
 
 Using git-bisect, I have found the commit that introduced this problem:
 
 6f602912c9d0c84c2edbd446dd9f72660b701605
 usb: serial: ftdi_sio: Add missing chars_in_buffer function
 
 This might also be related with the unusual way Python serial library
 reads the device. It uses select() with no timeout and single byte
 read()s in a loop. strace output:
 
 select(4, [3], [], [], NULL)= 1 (in [3])
 read(3, D, 1) = 1
 select(4, [3], [], [], NULL)= 1 (in [3])
 read(3, E, 1) = 1
 ...
 
 With sufficiently large read()s the byte loss can be eliminated.
 
 With the commit above, each select() now causes an additional round trip
 over USB to read the state of the hardware buffer. It's possible that
 constant status querying triggers some bug in the hardware or the query
 is simply too slow and causes overflows in the hardware buffer.

You're absolutely right. This is a known issue (the select overhead)
that was just recently fixed by commit a37025b5c7 (USB: ftdi_sio: fix
chars_in_buffer overhead) in v3.10-rc3. Care to give v3.10-rc4 a try?

Greg, perhaps we should consider backporting the wait-until-sent
patches (i.e. 0693196fe..4746b6c6e)?

Thanks,
Johan
--
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


Re: serial/ftdi_sio byte loss / performance regression

2013-06-06 Thread Greg KH
On Thu, Jun 06, 2013 at 11:58:56AM +0200, Johan Hovold wrote:
 On Thu, Jun 06, 2013 at 10:50:36AM +0200, Tomaž Šolc wrote:
  Hi
  
  I have noticed that the ftdi_sio serial driver in recent kernel versions
  has very bad performance when used through the Python's serial library.
  
  As a test case I have a custom device that will send a continuous block
  of 5k characters once every few seconds over a RS-232 line (115200 baud)
  to an Olimex programmer (based on FT2232C, also tried one with FT2232H).
  
  Programmer is connected to a Linux system where a simple Python script
  reads the device:
  
  import serial
  comm = serial.Serial(/dev/ttyUSB0, 115200)
  while True:
  line = comm.readline()
  
  With kernels before 3.7.0 the script reads uncorrupted data while using
  newer kernels (including 3.9.4) the Python script sees heavy byte loss.
  top shows an 95% idle CPU. Only very slow transmissions (on the
  order of tens of bytes per second) will come through uncorrupted.
  
  Using git-bisect, I have found the commit that introduced this problem:
  
  6f602912c9d0c84c2edbd446dd9f72660b701605
  usb: serial: ftdi_sio: Add missing chars_in_buffer function
  
  This might also be related with the unusual way Python serial library
  reads the device. It uses select() with no timeout and single byte
  read()s in a loop. strace output:
  
  select(4, [3], [], [], NULL)= 1 (in [3])
  read(3, D, 1) = 1
  select(4, [3], [], [], NULL)= 1 (in [3])
  read(3, E, 1) = 1
  ...
  
  With sufficiently large read()s the byte loss can be eliminated.
  
  With the commit above, each select() now causes an additional round trip
  over USB to read the state of the hardware buffer. It's possible that
  constant status querying triggers some bug in the hardware or the query
  is simply too slow and causes overflows in the hardware buffer.
 
 You're absolutely right. This is a known issue (the select overhead)
 that was just recently fixed by commit a37025b5c7 (USB: ftdi_sio: fix
 chars_in_buffer overhead) in v3.10-rc3. Care to give v3.10-rc4 a try?
 
 Greg, perhaps we should consider backporting the wait-until-sent
 patches (i.e. 0693196fe..4746b6c6e)?

Yes, that's a good idea, I'll do that for the next round of stable
updates, after this next release tomorrow.

thanks,

greg k-h
--
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