mirror of
https://github.com/MariaDB/server.git
synced 2025-04-12 02:05:34 +02:00
Some POWER specific optimizations
Bug#18842925 : SET THREAD PRIORITY IN INNODB MUTEX SPINLOOP
Like "pause" instruction for hyper-threading at Intel CPUs,
POWER has special instructions only for hinting priority of hardware-threads.
Approved by Sunny in rb#6256
Backport of the 5.7 fix - c92102a6ef
(excluded cache line size patch)
Suggestion by Stewart Smith
This commit is contained in:
parent
2275640deb
commit
d4ba50477e
6 changed files with 35 additions and 0 deletions
|
@ -225,6 +225,7 @@
|
|||
#cmakedefine HAVE_PREAD 1
|
||||
#cmakedefine HAVE_PAUSE_INSTRUCTION 1
|
||||
#cmakedefine HAVE_FAKE_PAUSE_INSTRUCTION 1
|
||||
#cmakedefine HAVE_HMT_PRIORITY_INSTRUCTION 1
|
||||
#cmakedefine HAVE_RDTSCLL 1
|
||||
#cmakedefine HAVE_READ_REAL_TIME 1
|
||||
#cmakedefine HAVE_PTHREAD_ATTR_CREATE 1
|
||||
|
|
|
@ -855,6 +855,16 @@ IF(NOT CMAKE_CROSSCOMPILING AND NOT MSVC)
|
|||
}
|
||||
" HAVE_FAKE_PAUSE_INSTRUCTION)
|
||||
ENDIF()
|
||||
IF (NOT HAVE_PAUSE_INSTRUCTION)
|
||||
CHECK_C_SOURCE_COMPILES("
|
||||
int main()
|
||||
{
|
||||
__asm__ __volatile__ (\"or 1,1,1\");
|
||||
__asm__ __volatile__ (\"or 2,2,2\");
|
||||
return 0;
|
||||
}
|
||||
" HAVE_HMT_PRIORITY_INSTRUCTION)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
CHECK_SYMBOL_EXISTS(tcgetattr "termios.h" HAVE_TCGETATTR 1)
|
||||
|
|
|
@ -92,6 +92,14 @@ private:
|
|||
# define UT_RELAX_CPU() __asm__ __volatile__ ("":::"memory")
|
||||
# endif
|
||||
|
||||
# if defined(HAVE_HMT_PRIORITY_INSTRUCTION)
|
||||
# define UT_LOW_PRIORITY_CPU() __asm__ __volatile__ ("or 1,1,1")
|
||||
# define UT_RESUME_PRIORITY_CPU() __asm__ __volatile__ ("or 2,2,2")
|
||||
# else
|
||||
# define UT_LOW_PRIORITY_CPU() ((void)0)
|
||||
# define UT_RESUME_PRIORITY_CPU() ((void)0)
|
||||
# endif
|
||||
|
||||
/*********************************************************************//**
|
||||
Delays execution for at most max_wait_us microseconds or returns earlier
|
||||
if cond becomes true.
|
||||
|
|
|
@ -401,6 +401,8 @@ ut_delay(
|
|||
{
|
||||
ulint i, j;
|
||||
|
||||
UT_LOW_PRIORITY_CPU();
|
||||
|
||||
j = 0;
|
||||
|
||||
for (i = 0; i < delay * 50; i++) {
|
||||
|
@ -408,6 +410,8 @@ ut_delay(
|
|||
UT_RELAX_CPU();
|
||||
}
|
||||
|
||||
UT_RESUME_PRIORITY_CPU();
|
||||
|
||||
return(j);
|
||||
}
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
|
|
@ -89,6 +89,14 @@ private:
|
|||
# define UT_RELAX_CPU() __asm__ __volatile__ ("":::"memory")
|
||||
# endif
|
||||
|
||||
# if defined(HAVE_HMT_PRIORITY_INSTRUCTION)
|
||||
# define UT_LOW_PRIORITY_CPU() __asm__ __volatile__ ("or 1,1,1")
|
||||
# define UT_RESUME_PRIORITY_CPU() __asm__ __volatile__ ("or 2,2,2")
|
||||
# else
|
||||
# define UT_LOW_PRIORITY_CPU() ((void)0)
|
||||
# define UT_RESUME_PRIORITY_CPU() ((void)0)
|
||||
# endif
|
||||
|
||||
/*********************************************************************//**
|
||||
Delays execution for at most max_wait_us microseconds or returns earlier
|
||||
if cond becomes true.
|
||||
|
|
|
@ -402,6 +402,8 @@ ut_delay(
|
|||
{
|
||||
ulint i, j;
|
||||
|
||||
UT_LOW_PRIORITY_CPU();
|
||||
|
||||
j = 0;
|
||||
|
||||
for (i = 0; i < delay * 50; i++) {
|
||||
|
@ -409,6 +411,8 @@ ut_delay(
|
|||
UT_RELAX_CPU();
|
||||
}
|
||||
|
||||
UT_RESUME_PRIORITY_CPU();
|
||||
|
||||
return(j);
|
||||
}
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
|
Loading…
Add table
Reference in a new issue