diff options
author | Noriko Hosoi <nhosoi@redhat.com> | 2008-10-22 20:24:37 +0000 |
---|---|---|
committer | Noriko Hosoi <nhosoi@redhat.com> | 2008-10-22 20:24:37 +0000 |
commit | c56e4415b2de4f72c0e6da144e4156b70912685d (patch) | |
tree | 034c42d7ccb75a406e32113a26ea5230ffbba2a6 | |
parent | b330c3504778b2ec6bae877ff63122653874a72c (diff) | |
download | ds-c56e4415b2de4f72c0e6da144e4156b70912685d.tar.gz ds-c56e4415b2de4f72c0e6da144e4156b70912685d.tar.xz ds-c56e4415b2de4f72c0e6da144e4156b70912685d.zip |
Resolves: 207457
Summary: (64bitcounters) rhds 7.1 - server stats use 32-bit integers -
entrycachehitratio 1503%
Change description:
1) Makefile.am: instead of the inline assembly langauge file .il, include an
independent .S file to the libslapd_la_SOURCES list.
2) add AM_PROG_AS to configure.ac to accept CCAS and CCASFLAGS.
3) slapi_counter.c: adjusted to slapi_counter_sunos_sparcv9.S.
4) add slapi_counter_sunos_sparcv9.S
5) remove slapi_counter_sunos_sparcv9.il
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | ldap/servers/slapd/slapi_counter.c | 14 | ||||
-rw-r--r-- | ldap/servers/slapd/slapi_counter_sunos_sparcv9.S | 134 | ||||
-rw-r--r-- | ldap/servers/slapd/slapi_counter_sunos_sparcv9.il | 124 |
5 files changed, 146 insertions, 129 deletions
diff --git a/Makefile.am b/Makefile.am index bd37fea2..ea9b2e63 100644 --- a/Makefile.am +++ b/Makefile.am @@ -535,7 +535,7 @@ libslapd_la_SOURCES = ldap/servers/slapd/add.c \ $(libavl_a_SOURCES) if SOLARIS -libslapd_la_SOURCES += ldap/servers/slapd/slapi_counter_sunos_sparcv9.il +libslapd_la_SOURCES += ldap/servers/slapd/slapi_counter_sunos_sparcv9.S endif libslapd_la_CPPFLAGS = $(PLUGIN_CPPFLAGS) @db_inc@ @svrcore_inc@ diff --git a/configure.ac b/configure.ac index ce0cf471..54d732d8 100644 --- a/configure.ac +++ b/configure.ac @@ -13,6 +13,7 @@ AC_CANONICAL_HOST AC_PROG_CXX AC_PROG_CC AM_PROG_CC_C_O +AM_PROG_AS # disable static libs by default - we only use a couple AC_DISABLE_STATIC AC_PROG_LIBTOOL diff --git a/ldap/servers/slapd/slapi_counter.c b/ldap/servers/slapd/slapi_counter.c index 1118d5b7..607ae1c5 100644 --- a/ldap/servers/slapd/slapi_counter.c +++ b/ldap/servers/slapd/slapi_counter.c @@ -41,6 +41,12 @@ #include "slap.h" +#ifdef SOLARIS +PRUint64 _sparcv9_AtomicSet_il(PRUint64 *address, PRUint64 newval); +PRUint64 _sparcv9_AtomicAdd_il(PRUint64 *address, PRUint64 val); +PRUint64 _sparcv9_AtomicSub_il(PRUint64 *address, PRUint64 val); +#endif + #ifdef HPUX #ifdef ATOMIC_64BIT_OPERATIONS #include <machine/sys/inline.h> @@ -157,7 +163,7 @@ PRUint64 slapi_counter_add(Slapi_Counter *counter, PRUint64 addvalue) #ifdef LINUX newvalue = __sync_add_and_fetch(&(counter->value), addvalue); #elif defined(SOLARIS) - newvalue = _sparcv9_AtomicAdd_il(&(counter->value), addvalue); + newvalue = _sparcv9_AtomicAdd(&(counter->value), addvalue); #elif defined(HPUX) /* fetchadd only works with values of 1, 4, 8, and 16. In addition, it requires * it's argument to be an integer constant. */ @@ -214,7 +220,7 @@ PRUint64 slapi_counter_subtract(Slapi_Counter *counter, PRUint64 subvalue) #ifdef LINUX newvalue = __sync_sub_and_fetch(&(counter->value), subvalue); #elif defined(SOLARIS) - newvalue = _sparcv9_AtomicSub_il(&(counter->value), subvalue); + newvalue = _sparcv9_AtomicSub(&(counter->value), subvalue); #elif defined(HPUX) /* fetchadd only works with values of -1, -4, -8, and -16. In addition, it requires * it's argument to be an integer constant. */ @@ -272,7 +278,7 @@ PRUint64 slapi_counter_set_value(Slapi_Counter *counter, PRUint64 newvalue) } } #elif defined(SOLARIS) - _sparcv9_AtomicSet_il(&(counter->value), newvalue); + _sparcv9_AtomicSet(&(counter->value), newvalue); return newvalue; #elif defined(HPUX) do { @@ -313,7 +319,7 @@ PRUint64 slapi_counter_get_value(Slapi_Counter *counter) #elif defined(SOLARIS) while (1) { value = counter->value; - if (value == _sparcv9_AtomicSet_il(&(counter->value), value)) { + if (value == _sparcv9_AtomicSet(&(counter->value), value)) { break; } } diff --git a/ldap/servers/slapd/slapi_counter_sunos_sparcv9.S b/ldap/servers/slapd/slapi_counter_sunos_sparcv9.S new file mode 100644 index 00000000..34dff541 --- /dev/null +++ b/ldap/servers/slapd/slapi_counter_sunos_sparcv9.S @@ -0,0 +1,134 @@ +! BEGIN COPYRIGHT BLOCK +! This Program is free software; you can redistribute it and/or modify it under +! the terms of the GNU General Public License as published by the Free Software +! Foundation; version 2 of the License. +! +! This Program is distributed in the hope that it will be useful, but WITHOUT +! ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +! FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License along with +! this Program; if not, write to the Free Software Foundation, Inc., 59 Temple +! Place, Suite 330, Boston, MA 02111-1307 USA. +! +! In addition, as a special exception, Red Hat, Inc. gives You the additional +! right to link the code of this Program with code not covered under the GNU +! General Public License ("Non-GPL Code") and to distribute linked combinations +! including the two, subject to the limitations in this paragraph. Non-GPL Code +! permitted under this exception must only link to the code of this Program +! through those well defined interfaces identified in the file named EXCEPTION +! found in the source code files (the "Approved Interfaces"). The files of +! Non-GPL Code may instantiate templates or use macros or inline functions from +! the Approved Interfaces without causing the resulting work to be covered by +! the GNU General Public License. Only Red Hat, Inc. may make changes or +! additions to the list of Approved Interfaces. You must obey the GNU General +! Public License in all respects for all of the Program code and other code used +! in conjunction with the Program except the Non-GPL Code covered by this +! exception. If you modify this file, you may extend this exception to your +! version of the file, but you are not obligated to do so. If you do not wish to +! provide this exception without modification, you must delete this exception +! statement from your version and license this file solely under the GPL without +! exception. +! +! +! The Original Code is the Netscape Portable Runtime (NSPR). +! +! The Initial Developer of the Original Code is +! Netscape Communications Corporation. +! Portions created by the Initial Developer are Copyright (C) 1998-2000 +! the Initial Developer. All Rights Reserved. +! +! The original code has been modified to support 64-bit atomic increments by +! Red Hat, Inc. These portions are Copyright (C) 2008 Red Hat, Inc. All Rights +! reserved. +! +! END COPYRIGHT BLOCK +! + +#include <sys/asm_linkage.h> + +! ====================================================================== +! +! Perform the sequence a = b atomically with respect to other +! fetch-and-stores to location a in a wait-free fashion. +! +! usage : old_val = PR_AtomicSet(address, newval) +! +! ----------------------- +! Note on REGISTER USAGE: +! as this is a LEAF procedure, a new stack frame is not created; +! we use the caller's stack frame so what would normally be %i (input) +! registers are actually %o (output registers). Also, we must not +! overwrite the contents of %l (local) registers as they are not +! assumed to be volatile during calls. +! ----------------------- + + ENTRY(_sparcv9_AtomicSet) ! standard assembler/ELF prologue + +retryAS: + ldx [%o0], %o2 ! set o2 to the current value + mov %o1, %o3 ! set up the new value + casx [%o0], %o2, %o3 ! atomically set if o0 hasn't changed + cmp %o2, %o3 ! see if we set the value + bne retryAS ! if not, try again + nop ! empty out the branch pipeline + retl ! return back to the caller + mov %o3, %o0 ! set the return code to the prev value + + SET_SIZE(_sparcv9_AtomicSet) ! standard assembler/ELF epilogue + +! +! end +! +! ====================================================================== +! +! Perform the sequence a = a + b atomically with respect to other +! fetch-and-adds to location a in a wait-free fashion. +! +! usage : newval = PR_AtomicAdd(address, val) +! return: the value after addition +! + ENTRY(_sparcv9_AtomicAdd) ! standard assembler/ELF prologue + +retryAA: + ldx [%o0], %o2 ! set o2 to the current value + addx %o2, %o1, %o3 ! calc the new value + mov %o3, %o4 ! save the return value + casx [%o0], %o2, %o3 ! atomically set if o0 hasn't changed + cmp %o2, %o3 ! see if we set the value + bne retryAA ! if not, try again + nop ! empty out the branch pipeline + retl ! return back to the caller + mov %o4, %o0 ! set the return code to the new value + + SET_SIZE(_sparcv9_AtomicAdd) ! standard assembler/ELF epilogue + +! +! end +! +! ====================================================================== +! +! Perform the sequence a = a - b atomically with respect to other +! fetch-and-subs to location a in a wait-free fashion. +! +! usage : newval = PR_AtomicSub(address, val) +! return: the value after addition +! + ENTRY(_sparcv9_AtomicSub) ! standard assembler/ELF prologue + +retryAU: + ldx [%o0], %o2 ! set o2 to the current value + subx %o2, %o1, %o3 ! calc the new value + mov %o3, %o4 ! save the return value + casx [%o0], %o2, %o3 ! atomically set if o0 hasn't changed + cmp %o2, %o3 ! see if we set the value + bne retryAU ! if not, try again + nop ! empty out the branch pipeline + retl ! return back to the caller + mov %o4, %o0 ! set the return code to the new value + + SET_SIZE(_sparcv9_AtomicSub) ! standard assembler/ELF epilogue + +! +! end +! diff --git a/ldap/servers/slapd/slapi_counter_sunos_sparcv9.il b/ldap/servers/slapd/slapi_counter_sunos_sparcv9.il deleted file mode 100644 index ca8bdb84..00000000 --- a/ldap/servers/slapd/slapi_counter_sunos_sparcv9.il +++ /dev/null @@ -1,124 +0,0 @@ -// BEGIN COPYRIGHT BLOCK -// This Program is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free Software -// Foundation; version 2 of the License. -// -// This Program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License along with -// this Program; if not, write to the Free Software Foundation, Inc., 59 Temple -// Place, Suite 330, Boston, MA 02111-1307 USA. -// -// In addition, as a special exception, Red Hat, Inc. gives You the additional -// right to link the code of this Program with code not covered under the GNU -// General Public License ("Non-GPL Code") and to distribute linked combinations -// including the two, subject to the limitations in this paragraph. Non-GPL Code -// permitted under this exception must only link to the code of this Program -// through those well defined interfaces identified in the file named EXCEPTION -// found in the source code files (the "Approved Interfaces"). The files of -// Non-GPL Code may instantiate templates or use macros or inline functions from -// the Approved Interfaces without causing the resulting work to be covered by -// the GNU General Public License. Only Red Hat, Inc. may make changes or -// additions to the list of Approved Interfaces. You must obey the GNU General -// Public License in all respects for all of the Program code and other code used -// in conjunction with the Program except the Non-GPL Code covered by this -// exception. If you modify this file, you may extend this exception to your -// version of the file, but you are not obligated to do so. If you do not wish to -// provide this exception without modification, you must delete this exception -// statement from your version and license this file solely under the GPL without -// exception. -// -// -// The Original Code is the Netscape Portable Runtime (NSPR). -// -// The Initial Developer of the Original Code is -// Netscape Communications Corporation. -// Portions created by the Initial Developer are Copyright (C) 1998-2000 -// the Initial Developer. All Rights Reserved. -// -// The original code has been modified to support 64-bit atomic increments by -// Red Hat, Inc. These portions are Copyright (C) 2008 Red Hat, Inc. All Rights -// reserved. -// -// END COPYRIGHT BLOCK -// - -// ====================================================================== -// -// Perform the sequence a = b atomically with respect to other -// fetch-and-stores to location a in a wait-free fashion. -// -// usage : newval = _sparcv9_AtomicSet(address, newval) -// -// ----------------------- -// Note on REGISTER USAGE: -// as this is a LEAF procedure, a new stack frame is not created; -// we use the caller's stack frame so what would normally be %i (input) -// registers are actually %o (output registers). Also, we must not -// overwrite the contents of %l (local) registers as they are not -// assumed to be volatile during calls. -// -// So, the registers used are: -// %o0 [input] - the address of the value to set -// %o1 [input] - the new value to set for [%o0] -// %o2 [local] - work register -// %o3 [local] - work register -// ----------------------- - -.inline _sparcv9_AtomicSet_il, 0 -retryAS: - ld [%o0], %o2 ! set o2 to the current value - mov %o1, %o3 ! set up the new value - casx [%o0], %o2, %o3 ! atomically set if o0 hasn't changed - cmp %o2, %o3 ! see if we set the value - bne retryAS ! if not, try again - nop ! empty out the branch pipeline - retl ! return back to the caller - mov %o3, %o0 ! set the return code to the new value -.end - -// ====================================================================== -// -// Perform the sequence a = a + b atomically with respect to other -// fetch-and-adds to location a in a wait-free fashion. -// -// usage : newval = _sparcv9_AtomicAdd(address, val) -// return: the value after addition -// - -.inline _sparcv9_AtomicAdd_il, 0 -retryAA: - ld [%o0], %o2 ! set o2 to the current value - addx %o2, %o1, %o3 ! calc the new value - mov %o3, %o4 ! save the return value - casx [%o0], %o2, %o3 ! atomically set if o0 hasn't changed - cmp %o2, %o3 ! see if we set the value - bne retryAA ! if not, try again - nop ! empty out the branch pipeline - retl ! return back to the caller - mov %o4, %o0 ! set the return code to the new value -.end - -// ====================================================================== -// -// Perform the sequence a = a - b atomically with respect to other -// fetch-and-subs to location a in a wait-free fashion. -// -// usage : newval = _sparcv9_AtomicSub(address, val) -// return: the value after addition -// - -.inline _sparcv9_AtomicSub_il, 0 -retryAU: - ld [%o0], %o2 ! set o2 to the current value - subx %o2, %o1, %o3 ! calc the new value - mov %o3, %o4 ! save the return value - casx [%o0], %o2, %o3 ! atomically set if o0 hasn't changed - cmp %o2, %o3 ! see if we set the value - bne retryAU ! if not, try again - nop ! empty out the branch pipeline - retl ! return back to the caller - mov %o4, %o0 ! set the return code to the new value -.end |