From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20382 invoked by alias); 23 Oct 2002 01:46:47 -0000 Mailing-List: contact libc-hacker-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sources.redhat.com Received: (qmail 20334 invoked from network); 23 Oct 2002 01:46:46 -0000 Received: from unknown (HELO deimos.hpl.hp.com) (192.6.19.190) by sources.redhat.com with SMTP; 23 Oct 2002 01:46:46 -0000 Received: from hplms2.hpl.hp.com (hplms2.hpl.hp.com [15.0.152.33]) by deimos.hpl.hp.com (8.9.3 (PHNE_24419)/HPL-PA Relay) with ESMTP id SAA00461; Tue, 22 Oct 2002 18:46:25 -0700 (PDT) Received: from napali.hpl.hp.com (napali.hpl.hp.com [15.4.89.123]) by hplms2.hpl.hp.com (8.10.2/8.10.2 HPL-PA Hub) with ESMTP id g9N1kOV03858; Tue, 22 Oct 2002 18:46:24 -0700 (PDT) Received: from napali.hpl.hp.com (napali [127.0.0.1]) by napali.hpl.hp.com (8.12.3/8.12.3/Debian -4) with ESMTP id g9N1kOHW025447; Tue, 22 Oct 2002 18:46:24 -0700 Received: (from davidm@localhost) by napali.hpl.hp.com (8.12.3/8.12.3/Debian -4) id g9N1kKGb025443; Tue, 22 Oct 2002 18:46:20 -0700 From: David Mosberger MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15797.65387.878109.733469@napali.hpl.hp.com> Date: Tue, 22 Oct 2002 19:39:00 -0000 To: libc-hacker@sources.redhat.com Cc: Andreas Jaeger , Ulrich Drepper , rohit.seth@intel.com, davidm@hpl.hp.com Subject: Re: [patch] add alloc_pages/free_pages support In-Reply-To: References: <15772.47660.333934.293189@napali.hpl.hp.com> <200210032146.g93LkB119076@magilla.sf.frob.com> <15772.48947.101500.167377@napali.hpl.hp.com> <3D9CC520.8010403@redhat.com> <15773.11197.780790.750761@napali.hpl.hp.com> Reply-To: davidm@hpl.hp.com X-SW-Source: 2002-10/txt/msg00087.txt.bz2 >>>>> On Fri, 04 Oct 2002 09:11:09 +0200, Andreas Jaeger 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 * 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 * 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 , David Mosberger * 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 + +#define __need_size_t +#include + +__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 */