From: Mel Gorman <mel@csn.ul.ie>
To: Christoph Hellwig <hch@lst.de>
Cc: viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernl.org,
linux-mm@kvack.org
Subject: Re: [PATCH] hugetlbfs: add llseek method
Date: Mon, 22 Sep 2008 08:58:54 +0100 [thread overview]
Message-ID: <20080922075853.GA5905@csn.ul.ie> (raw)
In-Reply-To: <20080908174634.GC19912@lst.de>
On (08/09/08 19:46), Christoph Hellwig didst pronounce:
> Hugetlbfs currently doesn't set a llseek method for regular files, which
> means it will fall back to default_llseek. This means no one can seek
> beyond 2 Gigabytes.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
I am probably missing something embarassingly simple. My reading of this
description made me assume lseek64() must be broken so why does the following
test not fail?
/*
* This test program writes numbers throughout a large hugetlb-backed file
* and checks if lseek64 can be used to read beyond the 2GB file boundary.
* mmap() is used to write the file as the write method is not supported on
* hugetlbfs. To test the program
* 1. mount -t hugetlbfs none /mnt
* 2. echo NR_HUGE > /proc/sys/vm/nr_hugepages
* 3. gcc -g -Wall hugetlbfs-llseek-test.c -o hugetlbfs-llseek-test && ./hugetlbfs-llseek-test
*
* where NR_HUGE would be 16 on POWER, 64 with 4M huge pagesize and 128 with
* 2MB huge pagesize
*/
#define _LARGEFILE64_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#define FILE_NAME "/mnt/hugepagefile"
#define QGB (256UL*1024UL*1024UL)
#define NR_QGB 16
#define MAP_LENGTH (16UL*1024*1024)
#define PROTECTION (PROT_READ | PROT_WRITE)
/* Only ia64 requires this */
#ifdef __ia64__
#define ADDR (void *)(0x8000000000000000UL)
#define FLAGS (MAP_SHARED | MAP_FIXED | MAP_NORESERVE)
#else
#define ADDR (void *)(0x0UL)
#define FLAGS (MAP_SHARED)
#endif
int main(int argc, char **argv)
{
char *addr;
int fd, i;
/*
* Open a hugetlbfs-backed file and then unlink it so we can exit
* and have the file automatically cleared up
*/
printf("Opening file " FILE_NAME "\n");
fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755);
if (fd < 0) {
perror("Open failed");
exit(1);
}
unlink(FILE_NAME);
/* Write a known value every quarter gigabyte of the file */
printf("Attemping write mmap: ");
for (i = 0; i < NR_QGB; i++) {
off_t offset = i * QGB;
addr = mmap(ADDR, MAP_LENGTH, PROTECTION, FLAGS, fd, offset);
if (addr == MAP_FAILED) {
printf("FAIL mmap %d\n", i);
perror("mmap");
exit(-1);
}
*addr = i;
munmap(addr, MAP_LENGTH);
}
printf(" PASS\n");
/* Attempt to read the values back using lseek64 */
printf("Attemping read seek: ");
for (i = 0; i < NR_QGB; i++) {
char val = 0;
off64_t offset = i * QGB;
printf("%d ", i);
if (lseek64(fd, offset, SEEK_SET) != offset) {
printf("FAIL seek %llu\n", offset);
perror("lseek");
exit(-1);
}
if (read(fd, &val, 1) == -1 || val != i) {
printf("FAIL read %d != %d\n", val, i);
perror("read");
exit(-1);
}
}
printf("\nTest passed successfully\n");
close(fd);
return 0;
}
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2008-09-22 7:58 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-08 17:46 [PATCH] hugetlbfs: add llseek method Christoph Hellwig
2008-09-22 7:58 ` Mel Gorman [this message]
2008-09-22 18:56 ` Mel Gorman
2008-09-24 19:00 ` Christoph Hellwig
2008-09-25 1:15 ` Mel Gorman
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=20080922075853.GA5905@csn.ul.ie \
--to=mel@csn.ul.ie \
--cc=hch@lst.de \
--cc=linux-fsdevel@vger.kernl.org \
--cc=linux-mm@kvack.org \
--cc=viro@zeniv.linux.org.uk \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.