From: David Mosberger <davidm@napali.hpl.hp.com>
To: Ulrich Drepper <drepper@redhat.com>
Cc: davidm@hpl.hp.com, libc-hacker@sources.redhat.com
Subject: Re: [patch] add alloc_pages/free_pages support
Date: Thu, 03 Oct 2002 12:37:00 -0000 [thread overview]
Message-ID: <15772.40078.639559.955906@napali.hpl.hp.com> (raw)
In-Reply-To: <3D9BEF31.7050101@redhat.com>
>>>>> On Thu, 03 Oct 2002 00:18:09 -0700, Ulrich Drepper <drepper@redhat.com> said:
Uli> - - no copyright comment
Uli> - - parameters have no leading __
Uli> - - no comment for the functions explaining the purpose and the
Uli> parameters
OK, how about the attached patch? It takes care of the above comments
and also adds a gethugepage() function.
--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 3 Oct 2002 19:34:12 -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 3 Oct 2002 19:34:12 -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 3 Oct 2002 19:34:12 -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)
+long int
+__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 3 Oct 2002 19:34:12 -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 3 Oct 2002 19:34:12 -0000
@@ -0,0 +1,75 @@
+/* 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>
+
+__BEGIN_DECLS
+
+/* Return the size of a huge page. */
+
+extern long int __gethugepagesize (void) __attribute__ ((__const__));
+libc_hidden_proto (__gethugepagesize);
+
+/* 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);
+
+/* 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);
+
+__END_DECLS
+
+#endif /* sys/hugepage.h */
WARNING: multiple messages have this Message-ID
From: David Mosberger <davidm@napali.hpl.hp.com>
To: Ulrich Drepper <drepper@redhat.com>
Cc: davidm@hpl.hp.com, libc-hacker@sources.redhat.com
Subject: Re: [patch] add alloc_pages/free_pages support
Date: Thu, 03 Oct 2002 14:44:00 -0000 [thread overview]
Message-ID: <15772.40078.639559.955906@napali.hpl.hp.com> (raw)
Message-ID: <20021003144400.TLPp8sSR6jRohhA3fLQZeearjnicyoXvqvCGyHgWCV0@z> (raw)
In-Reply-To: <3D9BEF31.7050101@redhat.com>
>>>>> On Thu, 03 Oct 2002 00:18:09 -0700, Ulrich Drepper <drepper@redhat.com> said:
Uli> - - no copyright comment
Uli> - - parameters have no leading __
Uli> - - no comment for the functions explaining the purpose and the
Uli> parameters
OK, how about the attached patch? It takes care of the above comments
and also adds a gethugepage() function.
--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 3 Oct 2002 19:34:12 -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 3 Oct 2002 19:34:12 -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 3 Oct 2002 19:34:12 -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)
+long int
+__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 3 Oct 2002 19:34:12 -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 3 Oct 2002 19:34:12 -0000
@@ -0,0 +1,75 @@
+/* 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>
+
+__BEGIN_DECLS
+
+/* Return the size of a huge page. */
+
+extern long int __gethugepagesize (void) __attribute__ ((__const__));
+libc_hidden_proto (__gethugepagesize);
+
+/* 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);
+
+/* 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);
+
+__END_DECLS
+
+#endif /* sys/hugepage.h */
next prev parent reply other threads:[~2002-10-03 19:37 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-10-03 0:03 David Mosberger
2002-10-03 0:20 ` Ulrich Drepper
2002-10-03 12:37 ` David Mosberger [this message]
2002-10-03 14:44 ` David Mosberger
2002-10-03 15:05 ` David Mosberger
[not found] ` <200210032146.g93LkB119076@magilla.sf.frob.com>
2002-10-03 15:30 ` David Mosberger
2002-10-03 15:34 ` Ulrich Drepper
2002-10-03 22:48 ` David Mosberger
2002-10-04 0:14 ` David Mosberger
2002-10-04 20:02 ` Andreas Jaeger
2002-10-22 19:39 ` David Mosberger
2002-10-22 23:52 ` Ulrich Drepper
2002-10-22 23:58 ` David Mosberger
2002-10-23 8:20 ` Ulrich Drepper
2002-10-23 10:34 ` David Mosberger
2002-10-23 11:46 ` Ulrich Drepper
2002-10-23 14:51 ` David Mosberger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=15772.40078.639559.955906@napali.hpl.hp.com \
--to=davidm@napali.hpl.hp.com \
--cc=davidm@hpl.hp.com \
--cc=drepper@redhat.com \
--cc=libc-hacker@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).