Index: src/network_posix_aio.c =================================================================== --- src/network_posix_aio.c (revision 1702) +++ src/network_posix_aio.c (working copy) @@ -37,6 +37,10 @@ #include "sys-files.h" #include "status_counter.h" +#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) +#define MAP_ANONYMOUS MAP_ANON +#endif + typedef struct { server *srv; connection *con; @@ -233,33 +237,15 @@ * read() * */ if (-1 == c->file.copy.fd ) { - int mmap_fd = -1; + c->file.mmap.offset = 0; + c->file.mmap.length = toSend; - /* open a file in /dev/shm to write to */ - if (-1 == (mmap_fd = open("/dev/zero", O_RDWR))) { + c->file.mmap.start = mmap(0, c->file.mmap.length, + PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (c->file.mmap.start == MAP_FAILED) { async_error = 1; - - if (errno != EMFILE) { - TRACE("open(/dev/zero) returned: %d (%s), falling back to sync-io", - errno, strerror(errno)); - } else { - return NETWORK_STATUS_WAIT_FOR_FD; - } } else { - c->file.mmap.offset = 0; - c->file.mmap.length = toSend; - - c->file.mmap.start = mmap(0, c->file.mmap.length, - PROT_READ | PROT_WRITE, MAP_SHARED, mmap_fd, 0); - if (c->file.mmap.start == MAP_FAILED) { - async_error = 1; - } else { - c->file.copy.length = toSend; - } - - close(mmap_fd); - mmap_fd = -1; - + c->file.copy.length = toSend; } } Index: src/network_gthread_aio.c =================================================================== --- src/network_gthread_aio.c (revision 1702) +++ src/network_gthread_aio.c (working copy) @@ -26,6 +26,10 @@ #include "sys-files.h" #include "sys-socket.h" +#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) +#define MAP_ANONYMOUS MAP_ANON +#endif + typedef struct { chunk *c; @@ -74,7 +78,6 @@ size_t toSend; const off_t max_toSend = 4 * 256 * 1024; /** should be larger than the send buffer */ chunk *c = wj->c; - int mmap_fd; offset = c->file.start + c->offset; @@ -86,26 +89,13 @@ /* open a file in /dev/shm to write to */ if (c->file.mmap.start == MAP_FAILED) { - if (-1 == (mmap_fd = open("/dev/zero", O_RDWR))) { - if (errno != EMFILE) { - TRACE("open(/dev/zero) returned: %d (%s)", - errno, strerror(errno)); - c->async.ret_val = NETWORK_STATUS_FATAL_ERROR; - } else { - c->async.ret_val = NETWORK_STATUS_WAIT_FOR_FD; - } - } else { - c->file.mmap.offset = 0; - c->file.mmap.length = toSend; - - c->file.mmap.start = mmap(0, c->file.mmap.length, - PROT_READ | PROT_WRITE, MAP_SHARED, mmap_fd, 0); - if (c->file.mmap.start == MAP_FAILED) { - c->async.ret_val = NETWORK_STATUS_FATAL_ERROR; - } - - close(mmap_fd); - mmap_fd = -1; + c->file.mmap.offset = 0; + c->file.mmap.length = toSend; + + c->file.mmap.start = mmap(0, c->file.mmap.length, + PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (c->file.mmap.start == MAP_FAILED) { + c->async.ret_val = NETWORK_STATUS_FATAL_ERROR; } } @@ -210,33 +200,18 @@ /* we small files don't take the overhead of a full async-loop */ if (toSend < 4 * 1024) { - int mmap_fd; - c->file.copy.offset = 0; c->file.copy.length = toSend; /* open a file in /dev/shm to write to */ if (c->file.mmap.start == MAP_FAILED) { - if (-1 == (mmap_fd = open("/dev/zero", O_RDWR))) { - if (errno != EMFILE) { - TRACE("open(/dev/zero) returned: %d (%s), open fds: %d", - errno, strerror(errno)); - return NETWORK_STATUS_FATAL_ERROR; - } else { - return NETWORK_STATUS_WAIT_FOR_FD; - } - } else { - c->file.mmap.offset = 0; - c->file.mmap.length = c->file.copy.length; /* align to page-size */ - - c->file.mmap.start = mmap(0, c->file.mmap.length, - PROT_READ | PROT_WRITE, MAP_SHARED, mmap_fd, 0); - if (c->file.mmap.start == MAP_FAILED) { - return NETWORK_STATUS_FATAL_ERROR; - } - - close(mmap_fd); - mmap_fd = -1; + c->file.mmap.offset = 0; + c->file.mmap.length = c->file.copy.length; /* align to page-size */ + + c->file.mmap.start = mmap(0, c->file.mmap.length, + PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (c->file.mmap.start == MAP_FAILED) { + return NETWORK_STATUS_FATAL_ERROR; } }