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 Thu, 03 Oct 2002 15:30:56 -0700, Ulrich Drepper <drepper@redhat.com> said:

  Uli> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1


  >> Uli, do you have any other feedback or are you OK with it?

  Uli> The header still isn't right.  You cannot have the hidden
  Uli> macros in there.  And the function prototypes are missing
  Uli> __THROW.

OK, how is this?

	--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.

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

	* sysdeps/ia64/bzero.S: Rewritten by Sverre Jarp to tune for
	Itanium 2 (and Itanium).
	Fix unwind directives and make it fit in 80 columns.
	* sysdeps/ia64/memset.S: Ditto.
	* sysdeps/ia64/memcpy.S: Ditto.
	Move jump table to .rodata section.

Index: sysdeps/unix/sysv/linux/Makefile
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/Makefile,v
retrieving revision 1.121
diff -u -r1.121 Makefile
--- sysdeps/unix/sysv/linux/sysdeps/unix/sysv/linux/Makefile	15 Sep 2002 02:30:28 -0000	1.121
+++ sysdeps/unix/sysv/linux/sysdeps/unix/sysv/linux/Makefile	4 Oct 2002 05:45:31 -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	4 Oct 2002 05:45:31 -0000
@@ -102,6 +102,10 @@
     # r*
     readahead;
 
+    gethugepagesize;
+    alloc_hugepages;
+    free_hugepages;
+
     #errlist-compat	126
     _sys_errlist; sys_errlist; _sys_nerr; sys_nerr;
   }
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	4 Oct 2002 05:45:32 -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];
@@ -264,7 +261,7 @@
 	  while (fgets_unlocked (buffer, sizeof buffer, fp) != NULL)
 	    if (sscanf (buffer, format, &result) == 1)
 	      {
-		result /= (__getpagesize () / 1024);
+		result /= 1024;
 		break;
 	      }
 
@@ -279,6 +276,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 ();
+
+  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 +331,12 @@
 }
 weak_alias (__get_avphys_pages, get_avphys_pages)
 
+size_t
+__gethugepagesize ()
+{
+  return get_meminfo ("Hugepagesize: %lu kB");
+}
+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.94
diff -u -r1.94 syscalls.list
--- sysdeps/unix/sysv/linux/sysdeps/unix/sysv/linux/syscalls.list	15 Aug 2002 08:25:16 -0000	1.94
+++ sysdeps/unix/sysv/linux/sysdeps/unix/sysv/linux/syscalls.list	4 Oct 2002 05:45:32 -0000
@@ -80,3 +80,5 @@
 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	4 Oct 2002 05:45:36 -0000
@@ -0,0 +1,78 @@
+/* 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;
+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]