List:Commits« Previous MessageNext Message »
From:Mikael Ronstrom Date:May 8 2009 1:52pm
Subject:bzr commit into mysql-5.1 branch (mikael:2847)
View as plain text  
#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 Ronstrom11 May