Author: davide
Date: Sun Sep  1 23:34:53 2013
New Revision: 255138
URL: http://svnweb.freebsd.org/changeset/base/255138

Log:
  Fix socket buffer timeouts precision using the new sbintime_t KPI instead
  of relying on the tvtohz() workaround. The latter has been introduced
  lately by jhb@ (r254699) in order to have a fix that can be backported
  to STABLE.
  
  Reported by:  Vitja Makarov <vitja.makarov at gmail dot com>
  Reviewed by:  jhb (earlier version)

Modified:
  head/sys/kern/uipc_debug.c
  head/sys/kern/uipc_sockbuf.c
  head/sys/kern/uipc_socket.c
  head/sys/sys/sockbuf.h

Modified: head/sys/kern/uipc_debug.c
==============================================================================
--- head/sys/kern/uipc_debug.c  Sun Sep  1 23:06:28 2013        (r255137)
+++ head/sys/kern/uipc_debug.c  Sun Sep  1 23:34:53 2013        (r255138)
@@ -411,7 +411,7 @@ db_print_sockbuf(struct sockbuf *sb, con
        db_print_indent(indent);
        db_printf("sb_ctl: %u   ", sb->sb_ctl);
        db_printf("sb_lowat: %d   ", sb->sb_lowat);
-       db_printf("sb_timeo: %d\n", sb->sb_timeo);
+       db_printf("sb_timeo: %jd\n", sb->sb_timeo);
 
        db_print_indent(indent);
        db_printf("sb_flags: 0x%x (", sb->sb_flags);

Modified: head/sys/kern/uipc_sockbuf.c
==============================================================================
--- head/sys/kern/uipc_sockbuf.c        Sun Sep  1 23:06:28 2013        
(r255137)
+++ head/sys/kern/uipc_sockbuf.c        Sun Sep  1 23:34:53 2013        
(r255138)
@@ -127,9 +127,9 @@ sbwait(struct sockbuf *sb)
        SOCKBUF_LOCK_ASSERT(sb);
 
        sb->sb_flags |= SB_WAIT;
-       return (msleep(&sb->sb_cc, &sb->sb_mtx,
+       return (msleep_sbt(&sb->sb_cc, &sb->sb_mtx,
            (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK | PCATCH, "sbwait",
-           sb->sb_timeo));
+           sb->sb_timeo, 0, 0));
 }
 
 int

Modified: head/sys/kern/uipc_socket.c
==============================================================================
--- head/sys/kern/uipc_socket.c Sun Sep  1 23:06:28 2013        (r255137)
+++ head/sys/kern/uipc_socket.c Sun Sep  1 23:34:53 2013        (r255138)
@@ -2541,7 +2541,7 @@ sosetopt(struct socket *so, struct socko
        int     error, optval;
        struct  linger l;
        struct  timeval tv;
-       u_long  val;
+       sbintime_t val;
        uint32_t val32;
 #ifdef MAC
        struct mac extmac;
@@ -2703,7 +2703,7 @@ sosetopt(struct socket *so, struct socko
                                error = EDOM;
                                goto bad;
                        }
-                       val = tvtohz(&tv);
+                       val = tvtosbt(tv);
 
                        switch (sopt->sopt_name) {
                        case SO_SNDTIMEO:
@@ -2857,8 +2857,7 @@ integer:
                        optval = (sopt->sopt_name == SO_SNDTIMEO ?
                                  so->so_snd.sb_timeo : so->so_rcv.sb_timeo);
 
-                       tv.tv_sec = optval / hz;
-                       tv.tv_usec = (optval % hz) * tick;
+                       tv = sbttotv(optval);
 #ifdef COMPAT_FREEBSD32
                        if (SV_CURPROC_FLAG(SV_ILP32)) {
                                struct timeval32 tv32;

Modified: head/sys/sys/sockbuf.h
==============================================================================
--- head/sys/sys/sockbuf.h      Sun Sep  1 23:06:28 2013        (r255137)
+++ head/sys/sys/sockbuf.h      Sun Sep  1 23:34:53 2013        (r255138)
@@ -97,7 +97,7 @@ struct        sockbuf {
        u_int   sb_mbmax;       /* (c/d) max chars of mbufs to use */
        u_int   sb_ctl;         /* (c/d) non-data chars in buffer */
        int     sb_lowat;       /* (c/d) low water mark */
-       int     sb_timeo;       /* (c/d) timeout for read/write */
+       sbintime_t      sb_timeo;       /* (c/d) timeout for read/write */
        short   sb_flags;       /* (c/d) flags, see below */
        int     (*sb_upcall)(struct socket *, void *, int); /* (c/d) */
        void    *sb_upcallarg;  /* (c/d) */
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to