Allow "max mux" async i/o requests
authorVolker Lendecke <vl@samba.org>
Sun, 24 Feb 2008 10:32:22 +0000 (11:32 +0100)
committerVolker Lendecke <vl@samba.org>
Sun, 24 Feb 2008 10:39:59 +0000 (11:39 +0100)
In the negprot reply, we allowed the client to issued "max mux" concurrent
requests. The OS might allow less, for example AFAIK AIX has a configurable
limit of concurrent AIO requests. We will fall back to sync operation for the
requests that are too many when aio_read/aio_write return an error.

Jeremy, please check!
(This used to be commit 8f86f7f25c4eb71bbdfcc6bf2d12eaaae9a8d9ec)

source3/smbd/aio.c

index 78189d32f78448724efcdab18d23dbdc4e4895a9..2889e3c13f82a0b04e12aa86e8a0e5520b03d82b 100644 (file)
@@ -141,10 +141,10 @@ static struct aio_extra *find_aio_ex(uint16 mid)
  We can have these many aio buffers in flight.
 *****************************************************************************/
 
-#define AIO_PENDING_SIZE 10
+static int aio_pending_size;
 static sig_atomic_t signals_received;
 static int outstanding_aio_calls;
-static uint16 aio_pending_array[AIO_PENDING_SIZE];
+static uint16 *aio_pending_array;
 
 /****************************************************************************
  Signal handler when an aio request completes.
@@ -152,7 +152,7 @@ static uint16 aio_pending_array[AIO_PENDING_SIZE];
 
 void aio_request_done(uint16_t mid)
 {
-       if (signals_received < AIO_PENDING_SIZE) {
+       if (signals_received < aio_pending_size) {
                aio_pending_array[signals_received] = mid;
                signals_received++;
        }
@@ -182,6 +182,10 @@ void initialize_async_io_handler(void)
 {
        struct sigaction act;
 
+       aio_pending_size = lp_maxmux();
+       aio_pending_array = SMB_MALLOC_ARRAY(uint16, aio_pending_size);
+       SMB_ASSERT(aio_pending_array != NULL);
+
        ZERO_STRUCT(act);
        act.sa_sigaction = signal_handler;
        act.sa_flags = SA_SIGINFO;
@@ -231,7 +235,7 @@ bool schedule_aio_read_and_X(connection_struct *conn,
                return False;
        }
 
-       if (outstanding_aio_calls >= AIO_PENDING_SIZE) {
+       if (outstanding_aio_calls >= aio_pending_size) {
                DEBUG(10,("schedule_aio_read_and_X: Already have %d aio "
                          "activities outstanding.\n",
                          outstanding_aio_calls ));
@@ -320,7 +324,7 @@ bool schedule_aio_write_and_X(connection_struct *conn,
                return False;
        }
 
-       if (outstanding_aio_calls >= AIO_PENDING_SIZE) {
+       if (outstanding_aio_calls >= aio_pending_size) {
                DEBUG(3,("schedule_aio_write_and_X: Already have %d aio "
                         "activities outstanding.\n",
                          outstanding_aio_calls ));