directio
diff --git a/src/core/ngx_open_file_cache.c b/src/core/ngx_open_file_cache.c index 704d0ab..f2e8afc 100644 --- a/src/core/ngx_open_file_cache.c +++ b/src/core/ngx_open_file_cache.c
@@ -497,6 +497,13 @@ } else { of->fd = fd; + + if (of->directio <= ngx_file_size(&fi)) { + if (ngx_directio(fd) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + ngx_directio_n " \"%s\" failed", name); + } + } } done:
diff --git a/src/core/ngx_open_file_cache.h b/src/core/ngx_open_file_cache.h index 4d8393b..1e1a279 100644 --- a/src/core/ngx_open_file_cache.h +++ b/src/core/ngx_open_file_cache.h
@@ -17,6 +17,7 @@ ngx_file_uniq_t uniq; time_t mtime; off_t size; + off_t directio; ngx_err_t err; time_t valid;
diff --git a/src/core/ngx_output_chain.c b/src/core/ngx_output_chain.c index 423a650..c4bd678 100644 --- a/src/core/ngx_output_chain.c +++ b/src/core/ngx_output_chain.c
@@ -32,6 +32,7 @@ size_t size; ngx_int_t rc, last; ngx_uint_t recycled; + ngx_buf_t *b; ngx_chain_t *cl, *out, **last_out; if (ctx->in == NULL && ctx->busy == NULL) { @@ -161,13 +162,29 @@ } } - ctx->buf = ngx_create_temp_buf(ctx->pool, size); - if (ctx->buf == NULL) { + b = ngx_calloc_buf(ctx->pool); + if (b == NULL) { return NGX_ERROR; } - ctx->buf->tag = ctx->tag; - ctx->buf->recycled = recycled; + /* + * allocate block aligned to a disk sector size + * to enable O_DIRECT + */ + + b->start = ngx_pmemalign(ctx->pool, size, 512); + if (b->start == NULL) { + return NGX_ERROR; + } + + b->pos = b->start; + b->last = b->start; + b->end = b->last + size; + b->temporary = 1; + b->tag = ctx->tag; + b->recycled = recycled; + + ctx->buf = b; ctx->allocated++; } }
diff --git a/src/core/ngx_palloc.c b/src/core/ngx_palloc.c index 5a0ea51..0cadd4a 100644 --- a/src/core/ngx_palloc.c +++ b/src/core/ngx_palloc.c
@@ -195,17 +195,35 @@ void *p; ngx_pool_large_t *large; -#if 0 - p = ngx_memalign(ngx_pagesize, size, pool->log); - if (p == NULL) { - return NULL; - } -#else p = ngx_alloc(size, pool->log); if (p == NULL) { return NULL; } -#endif + + large = ngx_palloc(pool, sizeof(ngx_pool_large_t)); + if (large == NULL) { + ngx_free(p); + return NULL; + } + + large->alloc = p; + large->next = pool->large; + pool->large = large; + + return p; +} + + +void * +ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment) +{ + void *p; + ngx_pool_large_t *large; + + p = ngx_memalign(alignment, size, pool->log); + if (p == NULL) { + return NULL; + } large = ngx_palloc(pool, sizeof(ngx_pool_large_t)); if (large == NULL) {
diff --git a/src/core/ngx_palloc.h b/src/core/ngx_palloc.h index 34878f5..2b3a30c 100644 --- a/src/core/ngx_palloc.h +++ b/src/core/ngx_palloc.h
@@ -77,6 +77,7 @@ void *ngx_palloc(ngx_pool_t *pool, size_t size); void *ngx_pnalloc(ngx_pool_t *pool, size_t size); void *ngx_pcalloc(ngx_pool_t *pool, size_t size); +void *ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment); ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p);