Question about socket timeouts

Daniel Eischen deischen at freebsd.org
Tue Aug 20 03:13:09 UTC 2013


On Mon, 19 Aug 2013, Adrian Chadd wrote:

> Yes! Please file a PR!

This sorta implies that both are acceptable (although,
the Linux behavior seems more desirable).

   http://austingroupbugs.net/view.php?id=369

> On 19 August 2013 12:33, Vitja Makarov <vitja.makarov at gmail.com> wrote:
>
>> Hi!
>>
>> Recently I was playing with small socket timeouts. setsockopt(2)
>> SO_RCVTIMEO and found a problem with it: if timeout is small enough
>> read(2) may return before timeout is actually expired.
>>
>> I was unable to reproduce this on linux box.
>>
>> I found that kernel uses a timer with 1/HZ precision so it converts
>> time in microseconds to ticks that's ok linux does it as well. The
>> problem is in details: freebsd uses floor() approach while linux uses
>> ceil():
>>
>> from FreeBSD's sys/kern/uipc_socket.c:
>> val = (u_long)(tv.tv_sec * hz) + tv.tv_usec / tick;
>> if (val == 0 && tv.tv_usec != 0)
>>      val = 1; /* at least one tick if tv > 0 */
>>
>> from Linux's net/core/sock.c:
>> *timeo_p = tv.tv_sec*HZ + (tv.tv_usec+(1000000/HZ-1))/(1000000/HZ);
>>
>> So, for instance, we have a freebsd system running with kern.hz set
>> 100 and set receive timeout to 25ms that is converted to 2 ticks which
>> is 20ms. In my test program read(2) returns with EAGAIN set in
>> 0.019ms.
>>
>> So the question is: is that a problem or not?
>>
>> --
>> vitja.

-- 
DE


More information about the freebsd-current mailing list