diff options
author | Volker Lendecke <vl@samba.org> | 2008-02-24 11:32:22 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2008-02-24 11:39:59 +0100 |
commit | 8f86f7f25c4eb71bbdfcc6bf2d12eaaae9a8d9ec (patch) | |
tree | 437311844cb5a02124982081f3744fcdddb61232 /source/smbd | |
parent | 9a069d306bb6f8a2cd51b8ba87b433884942d13f (diff) | |
download | samba-8f86f7f25c4eb71bbdfcc6bf2d12eaaae9a8d9ec.tar.gz samba-8f86f7f25c4eb71bbdfcc6bf2d12eaaae9a8d9ec.tar.xz samba-8f86f7f25c4eb71bbdfcc6bf2d12eaaae9a8d9ec.zip |
Allow "max mux" async i/o requests
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!
Diffstat (limited to 'source/smbd')
-rw-r--r-- | source/smbd/aio.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/source/smbd/aio.c b/source/smbd/aio.c index 78189d32f78..2889e3c13f8 100644 --- a/source/smbd/aio.c +++ b/source/smbd/aio.c @@ -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 )); |