From 8c71ce8a4e11a0d674763ccbe129b4780ed4eed8 Mon Sep 17 00:00:00 2001 From: David Greenman Date: Fri, 16 Aug 2002 05:08:46 +0000 Subject: [PATCH] Rewrote the space check algorithm in sbreserve() so that the extremely expensive (!) 64bit multiply, divide, and comparison aren't necessary (this came in originally from rev 1.19 to fix an overflow with large sb_max or MCLBYTES). The 64bit math in this function was measured in some kernel profiles as being as much as 5-8% of the total overhead of the TCP/IP stack and is eliminated with this commit. There is a harmless rounding error (of about .4% with the standard values) introduced with this change, however this is in the conservative direction (downward toward a slightly smaller maximum socket buffer size). MFC after: 3 days --- sys/kern/uipc_sockbuf.c | 2 +- sys/kern/uipc_socket2.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c index 1c1a227a997..5995b06ac5f 100644 --- a/sys/kern/uipc_sockbuf.c +++ b/sys/kern/uipc_sockbuf.c @@ -392,7 +392,7 @@ sbreserve(sb, cc, so, td) * td will only be NULL when we're in an interrupt * (e.g. in tcp_input()) */ - if ((u_quad_t)cc > (u_quad_t)sb_max * MCLBYTES / (MSIZE + MCLBYTES)) + if (cc > sb_max / (MSIZE + MCLBYTES) * MCLBYTES) return (0); if (!chgsbsize(so->so_cred->cr_uidinfo, &sb->sb_hiwat, cc, td ? td->td_proc->p_rlimit[RLIMIT_SBSIZE].rlim_cur : RLIM_INFINITY)) { diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c index 1c1a227a997..5995b06ac5f 100644 --- a/sys/kern/uipc_socket2.c +++ b/sys/kern/uipc_socket2.c @@ -392,7 +392,7 @@ sbreserve(sb, cc, so, td) * td will only be NULL when we're in an interrupt * (e.g. in tcp_input()) */ - if ((u_quad_t)cc > (u_quad_t)sb_max * MCLBYTES / (MSIZE + MCLBYTES)) + if (cc > sb_max / (MSIZE + MCLBYTES) * MCLBYTES) return (0); if (!chgsbsize(so->so_cred->cr_uidinfo, &sb->sb_hiwat, cc, td ? td->td_proc->p_rlimit[RLIMIT_SBSIZE].rlim_cur : RLIM_INFINITY)) {