diff options
author | Kaleb S. KEITHLEY <kkeithle@redhat.com> | 2019-03-28 09:36:33 -0400 |
---|---|---|
committer | Amar Tumballi <amarts@redhat.com> | 2019-04-03 04:40:15 +0000 |
commit | 024cafea8965086267645be0eae86bcdf5a5d106 (patch) | |
tree | 440b86b81dd67f4cc071ccfd2ba97ae285deb5bd /rpc | |
parent | cada4b432e9373c3ff8423a23c41a455aba4fc4a (diff) |
rpclib: slow floating point math and libm
In release-6 rpc/rpc-lib (libgfrpc) added the function
get_rightmost_set_bit() which calls log2(3), a call that takes
a floating point parameter.
It's used thusly:
right_most_unset_bit = get_rightmost_set_bit(...);
(So is it really the right-most unset bit, or the right-most set bit?)
It's unclear to me whether this is in the data path or not. If it is,
it's rather scary to think about integer-to-float conversions and slow
calls to libm functions in the data path.
gcc and clang have __builtin_ctz() which returns the same result as
get_rightmost_set_bit(), and does it substantially faster. Approx
20M iterations of get_rightmost_set_bit() took ~33sec of wall clock
time on my devel machine, while 20M iterations of __builtin_ctz()
took < 9sec; get_rightmost_set_bit() is 3x slower than __builtin_ctz().
And as a side benefit, we can again eliminate the need to link libgfrpc
with libm.
Change-Id: If9e7e80874577c52223f8125b385fc930de20699
updates: bz#1193929
Signed-off-by: Kaleb S. KEITHLEY <kkeithle@redhat.com>
Diffstat (limited to 'rpc')
-rw-r--r-- | rpc/rpc-lib/src/Makefile.am | 2 | ||||
-rw-r--r-- | rpc/rpc-lib/src/rpcsvc.c | 10 |
2 files changed, 3 insertions, 9 deletions
diff --git a/rpc/rpc-lib/src/Makefile.am b/rpc/rpc-lib/src/Makefile.am index c7171a260b5..81a96476883 100644 --- a/rpc/rpc-lib/src/Makefile.am +++ b/rpc/rpc-lib/src/Makefile.am @@ -8,7 +8,7 @@ libgfrpc_la_SOURCES = auth-unix.c rpcsvc-auth.c rpcsvc.c auth-null.c \ EXTRA_DIST = libgfrpc.sym libgfrpc_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \ - $(top_builddir)/rpc/xdr/src/libgfxdr.la $(MATH_LIB) + $(top_builddir)/rpc/xdr/src/libgfxdr.la libgfrpc_la_LDFLAGS = -version-info $(LIBGFRPC_LT_VERSION) $(GF_LDFLAGS) \ -export-symbols $(top_srcdir)/rpc/rpc-lib/src/libgfrpc.sym diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c index d62e06cb187..b3916eb54c2 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -36,7 +36,6 @@ #include <fnmatch.h> #include <stdarg.h> #include <stdio.h> -#include <math.h> #include <dlfcn.h> #ifdef IPV6_DEFAULT @@ -89,12 +88,6 @@ rpcsvc_toggle_queue_status(rpcsvc_program_t *prog, return; } -static int -get_rightmost_set_bit(int n) -{ - return log2(n & -n); -} - int rpcsvc_get_free_queue_index(rpcsvc_program_t *prog) { @@ -109,7 +102,8 @@ rpcsvc_get_free_queue_index(rpcsvc_program_t *prog) right_most_unset_bit = 0; break; } else { - right_most_unset_bit = get_rightmost_set_bit( + /* get_rightmost_set_bit (sic)*/ + right_most_unset_bit = __builtin_ctz( ~prog->request_queue_status[i]); if (right_most_unset_bit < 8) { break; |