The branch, v3-2-test has been updated via 8f86f7f25c4eb71bbdfcc6bf2d12eaaae9a8d9ec (commit) via 9a069d306bb6f8a2cd51b8ba87b433884942d13f (commit) from 213ba3a719e77979c04b872f1d82f68e87287cb0 (commit)
http://gitweb.samba.org/?samba.git;a=shortlog;h=v3-2-test - Log ----------------------------------------------------------------- commit 8f86f7f25c4eb71bbdfcc6bf2d12eaaae9a8d9ec Author: Volker Lendecke <[EMAIL PROTECTED]> Date: Sun Feb 24 11:32:22 2008 +0100 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! commit 9a069d306bb6f8a2cd51b8ba87b433884942d13f Author: Volker Lendecke <[EMAIL PROTECTED]> Date: Sun Feb 24 11:39:57 2008 +0100 Export aio_request_done() This is for external modules implementing the Posix AIO API that not necessarily depend on the signal mechanism to indicate completion. ----------------------------------------------------------------------- Summary of changes: source/smbd/aio.c | 26 ++++++++++++++++++-------- 1 files changed, 18 insertions(+), 8 deletions(-) Changeset truncated at 500 lines: diff --git a/source/smbd/aio.c b/source/smbd/aio.c index 59dd9a9..2889e3c 100644 --- a/source/smbd/aio.c +++ b/source/smbd/aio.c @@ -141,21 +141,27 @@ 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. *****************************************************************************/ -static void signal_handler(int sig, siginfo_t *info, void *unused) +void aio_request_done(uint16_t mid) { - if (signals_received < AIO_PENDING_SIZE) { - aio_pending_array[signals_received] = info->si_value.sival_int; + if (signals_received < aio_pending_size) { + aio_pending_array[signals_received] = mid; signals_received++; - } /* Else signal is lost. */ + } + /* Else signal is lost. */ +} + +static void signal_handler(int sig, siginfo_t *info, void *unused) +{ + aio_request_done(info->si_value.sival_int); sys_select_signal(RT_SIGNAL_AIO); } @@ -176,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; @@ -225,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 )); @@ -314,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 )); -- Samba Shared Repository