Re: [RFC] /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_overcommit_hugepages

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




----- Original Message -----
> On Tue 04-01-11 05:21:46, CAI Qian wrote:
> >
> > > > 3) overcommit 2gb hugepages.
> > > > mmap(NULL, 18446744071562067968, PROT_READ|PROT_WRITE,
> > > > MAP_SHARED,
> > > > 3, 0) = -1 ENOMEM (Cannot allocate memory)
> > >
> > > Hmm, you are trying to reserve/mmap a lot of memory (17179869182
> > > 1GB
> > > huge pages).
> > That is strange - the test code merely did this,
> > addr = mmap(ADDR, 2<<30, PROTECTION, FLAGS, fd, 0);
> 
> Didn't you want 1<<30 instead?
No, it was expecting to use both the allocate + overcommited 1GB pages.

> > > Are you sure that you are not changing the value by the /sys
> > > interface
> > > somewhere (there is no check for the value so you can set
> > > what-ever
> > > value you like)? I fail to see any mmap code path which would
> > > change
> > > this value.
> > I could double-check here, but it is not important if the fact is
> > that
> > overcommit is not supported for 1GB pages.
> 
> What is the complete test case?
Here is the reproducer I was using. The trick to reproduce this is to run at the end.

echo "" >/proc/sys/vm/nr_overcommit_hugepages

CAI Qian

---------------------
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mount.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <ctype.h>

#define PROTECTION		(PROT_READ | PROT_WRITE)

#define ADDR (void *)(0x0UL)
#define FLAGS (MAP_SHARED)

static void setup(void);
static void cleanup(void);
static void overcommit(void);

int main(int argc, char *argv[])
{
	setup();
	overcommit();
	cleanup();

	return 0;
}

static void overcommit(void)
{
	void *addr = NULL;
	int fd = -1;
	char s[BUFSIZ];

	snprintf(s, BUFSIZ, "/mnt/hugemmap05/file");
	fd = open(s, O_CREAT | O_RDWR, 0755);
	if (fd == -1)
		perror("open");

	addr = mmap(ADDR, 2UL<<30, PROTECTION, FLAGS, fd, 0);
	if (addr == MAP_FAILED) {
		perror("mmap");
		cleanup();
	}
	close(fd);
	unlink(s);
}

static void cleanup(void)
{
	system("echo "" >/proc/sys/vm/nr_overcommit_hugepages");
	system("umount /mnt/hugemmap05");
	exit(1);
}

static void setup(void)
{
	system("echo 1 >/sys/kernel/mm/hugepages/hugepages-1048576kB/nr_overcommit_hugepages");
	system("mkdir /mnt/hugemmap05");
	system("mount none -t hugetlbfs /mnt/hugemmap05");
}

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@xxxxxxxxxx  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]