Sorry about the previous partial message...
If a file is extended via ftruncate, the new empty pages are read in before the the ftruncate
returns (taking 64mS on my machine), but if the file is extended via pwrite, nothing is read in
and the system call is very quick (34uS).
Why is there such a difference? Is there another cheap way to grow a file and map in its new
pages? Am I missing some other semantic difference between ftruncate and a pwrite past the end of
the file?
Here is a test program.. compile with -DABUSE to get the pwrite version.
thanks,
-Kenny
__________________________________________
Yahoo! DSL ? Something to write home about.
Just $16.99/mo. or less.
dsl.yahoo.com
#define _GNU_SOURCE
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main(int argc, char* argv[])
{
int fd;
unsigned long long int const size = 4096 * 1024;
unsigned int const size_page = 1024;
unsigned long long int offset = 0;
unsigned int offset_page = 0;
//char* buffer = valloc(size);
//memset(buffer, 0, size);
if (argc != 2) {
printf("usage: %s <filename>\n", argv[0]);
return 0;
}
fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC | O_LARGEFILE /*| O_DIRECT*/, 0644);
if (fd < 0) {
perror("open");
return 0;
}
#ifdef ABUSE
pwrite64(fd, "" , 1, offset + size);
#else
ftruncate64(fd, offset + size);
#endif
char* mapping = (char*)mmap64(0, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE | MAP_NONBLOCK, fd, offset);
memset(mapping, 'a', size);
for (;;) {
offset += size;
offset_page += size_page;
#ifdef ABUSE
pwrite64(fd, "", 1, offset + size);
#else
ftruncate64(fd, offset + size);
#endif
//munmap(mapping, size);
//mapping = (char*)mmap64(0, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE | MAP_NONBLOCK, fd, offset);
remap_file_pages(mapping, size, 0, offset_page, MAP_NONBLOCK);
memset(mapping, 'a', size);
}
close(fd);
return 0;
}
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]