This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] add alloc_pages/free_pages support


>>>>> On Fri, 04 Oct 2002 09:11:09 +0200, Andreas Jaeger <aj@suse.de> said:

  >> + gethugepagesize; + alloc_hugepages; + free_hugepages; +

  Andreas> With glibc 2.3 out of the door, this has to be added with
  Andreas> version glibc 2.3.1.

OK, I made this change.

  Andreas> The header installed in the user level include should not
  Andreas> have the __gethugepagesize.  If you need the prototype, we
  Andreas> add it to an internal header.

Ditto.

If it looks OK, please apply the attached patch.

Thanks,

	--david

2002-10-03  David Mosberger  <davidm@hpl.hp.com>

	* sysdeps/unix/sysv/linux/getsysstats.c (get_meminfo): New function.
	(phys_pages_info): Implementing on the basis of get_meminfo().
	(__gethugepagesize): New function.

	* sysdeps/unix/sysv/linux/Versions: Mention gethugepagesize().

2002-10-02  David Mosberger  <davidm@hpl.hp.com>

	* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Mention
	sys/hugepage.h.

	* sysdeps/unix/sysv/linux/syscalls.list: Make alloc_hugepages and
	free_hugepages weak symbols.

	* sysdeps/unix/sysv/linux/Versions: Mention alloc_hugepages and
	free_hugepages.

2002-10-01  Rohit Seth <rohit.seth@intel.com>,
	    David Mosberger <davidm@hpl.hp.com>

	* sysdeps/unix/sysv/linux/syscalls.list: Add alloc_hugepages and
	free_hugepages.
	* sysdeps/unix/sysv/linux/sys/hugepage.h: New file.

Index: sysdeps/unix/sysv/linux/Makefile
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/Makefile,v
retrieving revision 1.123
diff -u -r1.123 Makefile
--- sysdeps/unix/sysv/linux/sysdeps/unix/sysv/linux/Makefile	16 Oct 2002 03:02:50 -0000	1.123
+++ sysdeps/unix/sysv/linux/sysdeps/unix/sysv/linux/Makefile	23 Oct 2002 01:42:58 -0000
@@ -20,7 +20,7 @@
 		  sys/kd.h sys/soundcard.h sys/vt.h \
 		  sys/quota.h sys/fsuid.h \
 		  scsi/sg.h scsi/scsi.h scsi/scsi_ioctl.h sys/pci.h \
-		  sys/ultrasound.h sys/raw.h sys/personality.h
+		  sys/ultrasound.h sys/raw.h sys/personality.h sys/hugepage.h
 
 install-others += $(inst_includedir)/bits/syscall.h
 
Index: sysdeps/unix/sysv/linux/Versions
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/Versions,v
retrieving revision 1.18
diff -u -r1.18 Versions
--- sysdeps/unix/sysv/linux/sysdeps/unix/sysv/linux/Versions	30 Aug 2002 01:30:55 -0000	1.18
+++ sysdeps/unix/sysv/linux/sysdeps/unix/sysv/linux/Versions	23 Oct 2002 01:42:58 -0000
@@ -105,6 +105,11 @@
     #errlist-compat	126
     _sys_errlist; sys_errlist; _sys_nerr; sys_nerr;
   }
+  GLIBC_2.3.1 {
+    gethugepagesize;
+    alloc_hugepages;
+    free_hugepages;
+  }
   GLIBC_PRIVATE {
     # needed by libpthread.
     __libc_sigaction;
Index: sysdeps/unix/sysv/linux/getsysstats.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/getsysstats.c,v
retrieving revision 1.22
diff -u -r1.22 getsysstats.c
--- sysdeps/unix/sysv/linux/sysdeps/unix/sysv/linux/getsysstats.c	21 Sep 2002 05:26:12 -0000	1.22
+++ sysdeps/unix/sysv/linux/sysdeps/unix/sysv/linux/getsysstats.c	23 Oct 2002 01:42:58 -0000
@@ -230,11 +230,8 @@
 #endif
 weak_alias (__get_nprocs_conf, get_nprocs_conf)
 
-/* General function to get information about memory status from proc
-   filesystem.  */
 static long int
-internal_function
-phys_pages_info (const char *format)
+get_meminfo (const char *format)
 {
   FILE *fp;
   char buffer[8192];
@@ -263,10 +260,7 @@
 	     bytes are really enough.  */
 	  while (fgets_unlocked (buffer, sizeof buffer, fp) != NULL)
 	    if (sscanf (buffer, format, &result) == 1)
-	      {
-		result /= (__getpagesize () / 1024);
-		break;
-	      }
+	      break;
 
 	  fclose (fp);
 	}
@@ -279,6 +273,20 @@
   return result;
 }
 
+/* General function to get information about memory status from proc
+   filesystem.  */
+static long int
+internal_function
+phys_pages_info (const char *format)
+{
+  long int result = get_meminfo (format);
+
+  if (result != -1)
+    result /= __getpagesize () / 1024;
+
+  return result;
+}
+
 
 /* Return the number of pages of physical memory in the system.  There
    is currently (as of version 2.0.21) no system call to determine the
@@ -320,6 +328,17 @@
 }
 weak_alias (__get_avphys_pages, get_avphys_pages)
 
+size_t
+__gethugepagesize ()
+{
+  long int result = get_meminfo ("Hugepagesize: %lu kB");
+
+  if (result != -1)
+    result *= 1024;
+
+  return result;
+}
+weak_alias (__gethugepagesize, gethugepagesize);
 
 static void
 free_mem (void)
Index: sysdeps/unix/sysv/linux/syscalls.list
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/syscalls.list,v
retrieving revision 1.96
diff -u -r1.96 syscalls.list
--- sysdeps/unix/sysv/linux/sysdeps/unix/sysv/linux/syscalls.list	14 Oct 2002 01:03:01 -0000	1.96
+++ sysdeps/unix/sysv/linux/sysdeps/unix/sysv/linux/syscalls.list	23 Oct 2002 01:42:59 -0000
@@ -82,3 +82,6 @@
 removexattr	EXTRA	removexattr	i:ss	removexattr
 lremovexattr	EXTRA	lremovexattr	i:ss	lremovexattr
 fremovexattr	EXTRA	fremovexattr	i:is	fremovexattr
+
+alloc_hugepages EXTRA	alloc_hugepages	b:ianii __alloc_hugepages	alloc_hugepages
+free_hugepages  EXTRA	free_hugepages	i:a 	__free_hugepages	free_hugepages
Index: sysdeps/unix/sysv/linux/sys/hugepage.h
===================================================================
RCS file: sysdeps/unix/sysv/linux/sys/hugepage.h
diff -N sysdeps/unix/sysv/linux/sys/hugepage.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/unix/sysv/linux/sys/sysdeps/unix/sysv/linux/sys/hugepage.h	23 Oct 2002 01:43:01 -0000
@@ -0,0 +1,77 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _SYS_HUGEPAGE_H
+#define _SYS_HUGEPAGE_H 1
+
+/* This header file defines the huge page interface.  A huge page is a
+   non-swappable (pinned) page of virtual memory.  As the name
+   suggests, the size of a huge page is typically orders of magnitudes
+   bigger than the value returned by getpagesize().  For example,
+   depending on kernel configuration, on x86 it may be 2MBytes or
+   4MBytes and on ia64 it is typically one of 16MB, 256MBytes, or
+   4GBytes.  Note that because huge pages are never swapped, they are
+   a relatively rare commodity and applications are expected to fall
+   back to allocating regular pages if a huge page cannot be
+   allocated.  */
+
+#include <features.h>
+
+#define __need_size_t
+#include <stddef.h>
+
+__BEGIN_DECLS
+
+/* Return the size of a huge page.  */
+
+extern size_t gethugepagesize (void) __attribute__ ((__const__)) __THROW;
+
+/* Allocate LEN bytes worth of huge pages.  LEN must be an integer
+   multiple of the huge page size.  ADDR is the preferred starting
+   address for the memory.  PROT is a mask of protection bits that
+   specify how the memory is to be mapped (PROT_NONE or any
+   combination of PROT_READ, PROT_WRITE, or PROT_EXEC).  If KEY has is
+   a positive number, FLAG can be set to IPC_CREAT to request the
+   creation of a new shared memory segment or to zero to request
+   attaching to an existing shared memory segment.
+
+   Return value: On success, alloc_hugepages() returns a pointer to
+   the allocated memory.  On error, MAP_FAILED ((void *) -1) is
+   returned and ERRNO is set appropriately.
+
+   Errors:
+	EINVAL	LEN is not a integer multiple of gethugepagesize()
+		or KEY is a negative value.
+
+	ENOENT	No shared segment matching KEY was found and FLAGS
+		was zero.  */
+
+extern void *alloc_hugepages (int __key, void *__addr, size_t __len,
+			      int __prot, int __flag) __THROW;
+
+/* Free the huge page resources from the current process's address
+   space.  ADDR must be an address returned by a previous call to
+   alloc_hugepages ().  Note that for shared memory segments, the
+   underlying physical memory will be freed only after the last
+   process using them has freed them up or has exited.  */
+
+extern int free_hugepages (void *__addr) __THROW;
+
+__END_DECLS
+
+#endif	/* sys/hugepage.h */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]