# HG changeset patch # User Igor Sysoev # Date 1257426750 0 # Node ID 04cfc09b8b8db54d0b7aa99d0ad087524c1f39a6 # Parent 8abb88374c6cac1b0efe7ddc626fd17a0fcd3145 export aio presence knowledge to prevent using "aio sendfile", if aio does not present diff -r 8abb88374c6c -r 04cfc09b8b8d src/http/ngx_http_copy_filter_module.c --- a/src/http/ngx_http_copy_filter_module.c Wed Nov 04 19:41:08 2009 +0000 +++ b/src/http/ngx_http_copy_filter_module.c Thu Nov 05 13:12:30 2009 +0000 @@ -118,7 +118,7 @@ ctx->filter_ctx = r; #if (NGX_HAVE_FILE_AIO) - if (clcf->aio) { + if (ngx_file_aio && clcf->aio) { ctx->aio_handler = ngx_http_copy_aio_handler; #if (NGX_HAVE_AIO_SENDFILE) c->aio_sendfile = (clcf->aio == NGX_HTTP_AIO_SENDFILE); diff -r 8abb88374c6c -r 04cfc09b8b8d src/http/ngx_http_file_cache.c --- a/src/http/ngx_http_file_cache.c Wed Nov 04 19:41:08 2009 +0000 +++ b/src/http/ngx_http_file_cache.c Thu Nov 05 13:12:30 2009 +0000 @@ -12,6 +12,8 @@ static ngx_int_t ngx_http_file_cache_read(ngx_http_request_t *r, ngx_http_cache_t *c); +static ssize_t ngx_http_file_cache_aio_read(ngx_http_request_t *r, + ngx_http_cache_t *c); #if (NGX_HAVE_FILE_AIO) static void ngx_http_cache_aio_event_handler(ngx_event_t *ev); #endif @@ -330,36 +332,9 @@ c = r->cache; -#if (NGX_HAVE_FILE_AIO) - { - ngx_http_core_loc_conf_t *clcf; - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->aio) { - n = ngx_file_aio_read(&c->file, c->buf->pos, c->body_start, 0, r->pool); - - if (n == NGX_AGAIN) { - c->file.aio->data = r; - c->file.aio->handler = ngx_http_cache_aio_event_handler; + n = ngx_http_file_cache_aio_read(r, c); - r->main->blocked++; - r->aio = 1; - - return NGX_AGAIN; - } - - } else { - n = ngx_read_file(&c->file, c->buf->pos, c->body_start, 0); - } - } -#else - - n = ngx_read_file(&c->file, c->buf->pos, c->body_start, 0); - -#endif - - if (n == NGX_ERROR) { + if (n < 0) { return n; } @@ -432,8 +407,46 @@ } +static ssize_t +ngx_http_file_cache_aio_read(ngx_http_request_t *r, ngx_http_cache_t *c) +{ #if (NGX_HAVE_FILE_AIO) + ssize_t n; + ngx_http_core_loc_conf_t *clcf; + if (!ngx_file_aio) { + goto noaio; + } + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (!clcf->aio) { + goto noaio; + } + + n = ngx_file_aio_read(&c->file, c->buf->pos, c->body_start, 0, r->pool); + + if (n != NGX_AGAIN) { + return n; + } + + c->file.aio->data = r; + c->file.aio->handler = ngx_http_cache_aio_event_handler; + + r->main->blocked++; + r->aio = 1; + + return NGX_AGAIN; + +noaio: + +#endif + + return ngx_read_file(&c->file, c->buf->pos, c->body_start, 0); +} + + +#if (NGX_HAVE_FILE_AIO) static void ngx_http_cache_aio_event_handler(ngx_event_t *ev) diff -r 8abb88374c6c -r 04cfc09b8b8d src/os/unix/ngx_file_aio_read.c --- a/src/os/unix/ngx_file_aio_read.c Wed Nov 04 19:41:08 2009 +0000 +++ b/src/os/unix/ngx_file_aio_read.c Thu Nov 05 13:12:30 2009 +0000 @@ -39,12 +39,11 @@ ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset, ngx_pool_t *pool) { - int n; - ngx_event_t *ev; - ngx_event_aio_t *aio; - static ngx_uint_t enosys = 0; + int n; + ngx_event_t *ev; + ngx_event_aio_t *aio; - if (enosys) { + if (!ngx_file_aio) { return ngx_read_file(file, buf, size, offset); } @@ -116,7 +115,7 @@ "aio_read(\"%V\") failed", &file->name); if (n == NGX_ENOSYS) { - enosys = 1; + ngx_file_aio = 0; return ngx_read_file(file, buf, size, offset); } diff -r 8abb88374c6c -r 04cfc09b8b8d src/os/unix/ngx_files.c --- a/src/os/unix/ngx_files.c Wed Nov 04 19:41:08 2009 +0000 +++ b/src/os/unix/ngx_files.c Thu Nov 05 13:12:30 2009 +0000 @@ -8,6 +8,13 @@ #include +#if (NGX_HAVE_FILE_AIO) + +ngx_uint_t ngx_file_aio = 1; + +#endif + + ssize_t ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) { diff -r 8abb88374c6c -r 04cfc09b8b8d src/os/unix/ngx_files.h --- a/src/os/unix/ngx_files.h Wed Nov 04 19:41:08 2009 +0000 +++ b/src/os/unix/ngx_files.h Thu Nov 05 13:12:30 2009 +0000 @@ -313,6 +313,8 @@ ssize_t ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset, ngx_pool_t *pool); +extern ngx_uint_t ngx_file_aio; + #endif diff -r 8abb88374c6c -r 04cfc09b8b8d src/os/unix/ngx_linux_aio_read.c --- a/src/os/unix/ngx_linux_aio_read.c Wed Nov 04 19:41:08 2009 +0000 +++ b/src/os/unix/ngx_linux_aio_read.c Thu Nov 05 13:12:30 2009 +0000 @@ -27,13 +27,12 @@ ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset, ngx_pool_t *pool) { - long n; - struct iocb *piocb[1]; - ngx_event_t *ev; - ngx_event_aio_t *aio; - static ngx_uint_t enosys = 0; + long n; + struct iocb *piocb[1]; + ngx_event_t *ev; + ngx_event_aio_t *aio; - if (enosys) { + if (!ngx_file_aio) { return ngx_read_file(file, buf, size, offset); } @@ -109,7 +108,7 @@ "io_submit(\"%V\") failed", &file->name); if (n == NGX_ENOSYS) { - enosys = 1; + ngx_file_aio = 0; return ngx_read_file(file, buf, size, offset); }