#At file:///home/mikael/mysql_clones/ISM_usage/
2847 Mikael Ronstrom 2009-05-08
When using large pages on Solaris, make use of ISM for this, means we lock buffer pool to memory, can be used in conjunction with --opt-super-large-pages which sets the page size to 256M or more
modified:
include/my_sys.h
mysys/my_largepage.c
mysys/my_static.c
sql/mysqld.cc
storage/innobase/include/os0proc.h
storage/innobase/os/os0proc.c
=== modified file 'include/my_sys.h'
--- a/include/my_sys.h 2009-02-05 06:16:00 +0000
+++ b/include/my_sys.h 2009-05-08 13:49:04 +0000
@@ -171,7 +171,7 @@ extern char *my_strndup(const char *from
#define TRASH(A,B) /* nothing */
#endif
-#ifdef HAVE_LARGE_PAGES
+#if defined(HAVE_LARGE_PAGES) || defined(HAVE_SOLARIS_LARGE_PAGES)
extern uint my_get_large_page_size(void);
extern uchar * my_large_malloc(size_t size, myf my_flags);
extern void my_large_free(uchar * ptr, myf my_flags);
@@ -215,7 +215,7 @@ extern int (*fatal_error_handler_hook)(u
extern uint my_file_limit;
extern ulong my_thread_stack_size;
-#ifdef HAVE_LARGE_PAGES
+#if defined(HAVE_LARGE_PAGES) || defined(HAVE_SOLARIS_LARGE_PAGES)
extern my_bool my_use_large_pages;
extern uint my_large_page_size;
#endif
=== modified file 'mysys/my_largepage.c'
--- a/mysys/my_largepage.c 2007-10-02 07:32:33 +0000
+++ b/mysys/my_largepage.c 2009-05-08 13:49:04 +0000
@@ -15,7 +15,7 @@
#include "mysys_priv.h"
-#ifdef HAVE_LARGE_PAGES
+#if defined(HAVE_LARGE_PAGES) || defined(HAVE_SOLARIS_LARGE_PAGES)
#ifdef HAVE_SYS_IPC_H
#include <sys/ipc.h>
@@ -31,6 +31,7 @@ static my_bool my_large_free_int(uchar*
/* Gets the size of large pages from the OS */
+#if defined(UNIV_LINUX)
uint my_get_large_page_size(void)
{
uint size;
@@ -41,6 +42,7 @@ uint my_get_large_page_size(void)
DBUG_RETURN(size);
}
+#endif
/*
General large pages allocator.
@@ -89,7 +91,7 @@ void my_large_free(uchar* ptr, myf my_fl
#ifdef HUGETLB_USE_PROC_MEMINFO
/* Linux-specific function to determine the size of large pages */
-uint my_get_large_page_size_int(void)
+static uint my_get_large_page_size_int(void)
{
FILE *f;
uint size = 0;
@@ -111,9 +113,18 @@ finish:
#endif /* HUGETLB_USE_PROC_MEMINFO */
#if HAVE_DECL_SHM_HUGETLB
-/* Linux-specific large pages allocator */
+ #define SHMGET_FLAG SHM_HUGETLB /* Linux way of getting large pages */
+#else
+ #define SHMGET_FLAG 0
+#endif
+
+#if HAVE_DECL_SHM_SHARE_MMU
+ #define SHMMAT_FLAG SHM_SHARE_MMU /* Solaris ISM */
+#else
+ #define SHMMAT_FLAG 0
+#endif
-uchar* my_large_malloc_int(size_t size, myf my_flags)
+static uchar* my_large_malloc_int(size_t size, myf my_flags)
{
int shmid;
uchar* ptr;
@@ -123,7 +134,7 @@ uchar* my_large_malloc_int(size_t size,
/* Align block size to my_large_page_size */
size = ((size - 1) & ~(my_large_page_size - 1)) + my_large_page_size;
- shmid = shmget(IPC_PRIVATE, size, SHM_HUGETLB | SHM_R | SHM_W);
+ shmid = shmget(IPC_PRIVATE, size, SHMGET_FLAG | SHM_R | SHM_W);
if (shmid < 0)
{
if (my_flags & MY_WME)
@@ -134,7 +145,8 @@ uchar* my_large_malloc_int(size_t size,
DBUG_RETURN(NULL);
}
- ptr = (uchar*) shmat(shmid, NULL, 0);
+ ptr = (uchar*) shmat(shmid, NULL, SHMMAT_FLAG);
+
if (ptr == (uchar *) -1)
{
if (my_flags& MY_WME)
@@ -161,6 +173,4 @@ my_bool my_large_free_int(uchar *ptr, my
DBUG_ENTER("my_large_free_int");
DBUG_RETURN(shmdt(ptr) == 0);
}
-#endif /* HAVE_DECL_SHM_HUGETLB */
-
-#endif /* HAVE_LARGE_PAGES */
+#endif /* HAVE_LARGE_PAGES || HAVE_SOLARIS_LARGE_PAGES */
=== modified file 'mysys/my_static.c'
--- a/mysys/my_static.c 2008-08-19 13:56:41 +0000
+++ b/mysys/my_static.c 2009-05-08 13:49:04 +0000
@@ -60,7 +60,7 @@ USED_MEM* my_once_root_block=0; /* poi
uint my_once_extra=ONCE_ALLOC_INIT; /* Memory to alloc / block */
/* from my_largepage.c */
-#ifdef HAVE_LARGE_PAGES
+#if defined(HAVE_LARGE_PAGES) || defined(HAVE_SOLARIS_LARGE_PAGES)
my_bool my_use_large_pages= 0;
uint my_large_page_size= 0;
#endif
=== modified file 'sql/mysqld.cc'
--- a/sql/mysqld.cc 2009-03-06 11:51:51 +0000
+++ b/sql/mysqld.cc 2009-05-08 13:49:04 +0000
@@ -3306,6 +3306,9 @@ static int init_common_variables(const c
memcntl(NULL, 0, MC_HAT_ADVISE, (caddr_t)&mpss, 0, 0);
mpss.mha_cmd= MHA_MAPSIZE_STACK;
memcntl(NULL, 0, MC_HAT_ADVISE, (caddr_t)&mpss, 0, 0);
+
+ my_use_large_pages= 1;
+ my_large_page_size = max_page_size;
}
}
}
=== modified file 'storage/innobase/include/os0proc.h'
--- a/storage/innobase/include/os0proc.h 2006-03-10 16:22:21 +0000
+++ b/storage/innobase/include/os0proc.h 2009-05-08 13:49:04 +0000
@@ -12,7 +12,7 @@ Created 9/30/1995 Heikki Tuuri
#include "univ.i"
-#ifdef UNIV_LINUX
+#if defined(UNIV_LINUX) ||defined(UNIV_SOLARIS)
#include <sys/ipc.h>
#include <sys/shm.h>
#endif
=== modified file 'storage/innobase/os/os0proc.c'
--- a/storage/innobase/os/os0proc.c 2006-09-05 01:52:15 +0000
+++ b/storage/innobase/os/os0proc.c 2009-05-08 13:49:04 +0000
@@ -567,7 +567,7 @@ os_mem_alloc_large(
ibool assert_on_error)/* in: if TRUE, we crash mysqld if
the memory cannot be allocated */
{
-#ifdef HAVE_LARGE_PAGES
+#if defined(HAVE_LARGE_PAGES) || defined(HAVE_SOLARIS_LARGE_PAGES)
ulint size;
int shmid;
void *ptr = NULL;
@@ -577,16 +577,30 @@ os_mem_alloc_large(
goto skip;
}
-#ifdef UNIV_LINUX
+#if defined(UNIV_LINUX) || defined(UNIV_SOLARIS)
+
+ #if HAVE_DECL_SHM_HUGETLB
+ #define SHMGET_FLAG SHM_HUGETLB /* Linux way of getting large pages */
+ #else
+ #define SHMGET_FLAG 0
+ #endif
+
+ #if HAVE_DECL_SHM_SHARE_MMU
+ #define SHMMAT_FLAG SHM_SHARE_MMU /* Solaris ISM */
+ #else
+ #define SHMMAT_FLAG 0
+ #endif
+
+
/* Align block size to os_large_page_size */
size = ((n - 1) & ~(os_large_page_size - 1)) + os_large_page_size;
- shmid = shmget(IPC_PRIVATE, (size_t)size, SHM_HUGETLB | SHM_R | SHM_W);
+ shmid = shmget(IPC_PRIVATE, (size_t)size, SHMGET_FLAG | SHM_R | SHM_W);
if (shmid < 0) {
fprintf(stderr, "InnoDB: HugeTLB: Warning: Failed to allocate"
" %lu bytes. errno %d\n", n, errno);
} else {
- ptr = shmat(shmid, NULL, 0);
+ ptr = shmat(shmid, NULL, SHMMAT_FLAG);
if (ptr == (void *)-1) {
fprintf(stderr, "InnoDB: HugeTLB: Warning: Failed to"
" attach shared memory segment, errno %d\n",
@@ -613,7 +627,7 @@ os_mem_alloc_large(
fprintf(stderr, "InnoDB HugeTLB: Warning: Using conventional"
" memory pool\n");
skip:
-#endif /* HAVE_LARGE_PAGES */
+#endif /* HAVE_LARGE_PAGES || HAVE_SOLARIS_LARGE_PAGES */
return(ut_malloc_low(n, set_to_zero, assert_on_error));
}
@@ -626,9 +640,9 @@ os_mem_free_large(
/*==============*/
void *ptr) /* in: number of bytes */
{
-#ifdef HAVE_LARGE_PAGES
+#if defined(HAVE_LARGE_PAGES) || defined(HAVE_SOLARIS_LARGE_PAGES)
if (os_use_large_pages && os_large_page_size
-#ifdef UNIV_LINUX
+#if defined(UNIV_LINUX) || defined(UNIV_SOLARIS)
&& !shmdt(ptr)
#endif
) {
| Thread |
|---|
| • bzr commit into mysql-5.1 branch (mikael:2847) | Mikael Ronstrom | 11 May |