nginx 0.8.34 --with-file-io Linux kernel 2.6.33 patch

theromis1 nginx-forum at nginx.us
Thu Mar 11 05:23:07 MSK 2010


Hi,
I've tried nginx on latest Linux kernel and cant compile it. After little fight with sources I've created patch for that.

Just want to ask, is it reasonable? If so, may be better to include it in main branch for Linux build?
Please find my patch attached.

diff -Naur nginx-0.8.34.orig/auto/os/features nginx-0.8.34.new/auto/os/features
--- nginx-0.8.34.orig/auto/os/features	2009-09-30 06:21:52.000000000 -0700
+++ nginx-0.8.34.new/auto/os/features	2010-03-10 18:03:04.000000000 -0800
@@ -318,11 +318,42 @@
         ngx_feature_name="NGX_HAVE_FILE_AIO"
         ngx_feature_run=no
         ngx_feature_incs="#include 
-                          #include "
+                          #include 
+#ifndef SYS_eventfd
+#define SYS_eventfd       323
+#endif
+#ifndef IOCB_FLAG_RESFD
+#define IOCB_FLAG_RESFD   (1 << 0)
+#endif
+struct myiocb {
+  /* these are internal to the kernel/libc. */
+  u_int64_t aio_data; /* data to be returned in event's data */
+  u_int32_t PADDED(aio_key, aio_reserved1);
+  /* the kernel sets aio_key to the req # */
+
+  /* common fields */
+  u_int16_t aio_lio_opcode; /* see IOCB_CMD_ above */
+  int16_t aio_reqprio;
+  u_int32_t aio_fildes;
+
+  u_int64_t aio_buf;
+  u_int64_t aio_nbytes;
+  int64_t aio_offset;
+
+  /* extra parameters */
+  u_int64_t aio_reserved2;  /* TODO: use this for a (struct sigevent *) */
+
+  u_int32_t aio_flags;
+  /*
+   * If different from 0, this is an eventfd to deliver AIO results to
+   */
+  u_int32_t aio_resfd;
+}; /* 64 bytes */
+"
         ngx_feature_path=
         ngx_feature_libs=
         ngx_feature_test="int  n = SYS_eventfd;
-                          struct iocb  iocb;
+                          struct myiocb  iocb;
                           iocb.aio_lio_opcode = IOCB_CMD_PREAD;
                           iocb.aio_flags = IOCB_FLAG_RESFD;
                           iocb.aio_resfd = -1;"
diff -Naur nginx-0.8.34.orig/src/os/unix/ngx_linux_aio_read.c nginx-0.8.34.new/src/os/unix/ngx_linux_aio_read.c
--- nginx-0.8.34.orig/src/os/unix/ngx_linux_aio_read.c	2009-11-05 05:12:30.000000000 -0800
+++ nginx-0.8.34.new/src/os/unix/ngx_linux_aio_read.c	2010-03-10 17:41:36.000000000 -0800
@@ -17,7 +17,7 @@
 
 
 static long
-io_submit(aio_context_t ctx, long n, struct iocb **paiocb)
+io_submit(aio_context_t ctx, long n, ngx_aiocb_t **paiocb)
 {
     return syscall(SYS_io_submit, ctx, n, paiocb);
 }
@@ -28,7 +28,7 @@
     ngx_pool_t *pool)
 {
     long              n;
-    struct iocb      *piocb[1];
+    ngx_aiocb_t      *piocb[1];
     ngx_event_t      *ev;
     ngx_event_aio_t  *aio;
 
diff -Naur nginx-0.8.34.orig/src/os/unix/ngx_linux_config.h nginx-0.8.34.new/src/os/unix/ngx_linux_config.h
--- nginx-0.8.34.orig/src/os/unix/ngx_linux_config.h	2009-08-28 01:12:35.000000000 -0700
+++ nginx-0.8.34.new/src/os/unix/ngx_linux_config.h	2010-03-10 18:03:50.000000000 -0800
@@ -84,7 +84,39 @@
 #if (NGX_HAVE_FILE_AIO)
 #include 
 #include 
-typedef struct iocb  ngx_aiocb_t;
+#ifndef SYS_eventfd
+#define SYS_eventfd       323
+#endif
+#ifndef IOCB_FLAG_RESFD
+#define IOCB_FLAG_RESFD   (1 << 0)
+#endif
+
+struct myiocb {
+  /* these are internal to the kernel/libc. */
+  u_int64_t aio_data; /* data to be returned in event's data */
+  u_int32_t PADDED(aio_key, aio_reserved1);
+  /* the kernel sets aio_key to the req # */
+
+  /* common fields */
+  u_int16_t aio_lio_opcode; /* see IOCB_CMD_ above */
+  int16_t aio_reqprio;
+  u_int32_t aio_fildes;
+
+  u_int64_t aio_buf;
+  u_int64_t aio_nbytes;
+  int64_t aio_offset;
+
+  /* extra parameters */
+  u_int64_t aio_reserved2;  /* TODO: use this for a (struct sigevent *) */
+
+  u_int32_t aio_flags;
+  /*
+   * If different from 0, this is an eventfd to deliver AIO results to
+   */
+  u_int32_t aio_resfd;
+}; /* 64 bytes */
+
+typedef struct myiocb  ngx_aiocb_t;
 #endif
 
 


Posted at Nginx Forum: http://forum.nginx.org/read.php?2,62545,62545#msg-62545




More information about the nginx mailing list