Age | Commit message (Collapse) | Author |
|
Allow triton_context_wakeup() to run before triton_context_schedule().
When that happens, triton_context_schedule() now lets the context
running instead of putting it in sleep mode.
Note that, even though triton now allows triton_context_wakeup() to
happen before triton_context_schedule(), these two functions still need
to be paired and not nested. That is, in a sequence like the following,
triton_context_wakeup()
triton_context_wakeup()
triton_context_schedule()
triton_context_schedule()
the second triton_context_schedule() would put the context in sleep
mode. No matter how many triton_context_wakeup() have been called, the
first triton_context_schedule() "consumes" them all.
Being immune to schedule/wakeup inversion allows to fix the pppd_compat
module. This module needs to fork() to execute external programs. The
parent then waits for completion of its child using
triton_context_schedule(). When child terminates, the sigchld module
runs a callback that has to call triton_context_wakeup() to resume
execution of the parent.
The problem is that there is no synchronisation between the parent and
its child. When under stress, the child may execute faster than its
parent and the sigchld callback might run triton_context_wakeup()
before the parent had time to call triton_context_schedule().
Then accel-ppp might crash because the triton thread might have reset
ctx->thread to NULL, making triton_context_wakeup() write to invalid
memory when trying to insert the context in ctx->thread->wakeup_list[].
Synchronising the parent and its child completion's callback would
require cooperation from triton_context_schedule(). Otherwise we would
still have a time frame between the moment we let the callback waking
up the context and the moment we put the context in sleep mode.
Allowing schedule/wakeup call inversion in triton looks simpler since
it avoids modifying the current API.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
If MEMDEBUG is defined, then we need to include "memdebug.h" to define
'md_free'.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
|
|
size calculation)
|
|
|
|
after commit 287adbfc205c02eac375f55fb94f13c073faec97 gcc
still may reorder alloca() and memset() calls.
fix that with volatile access & memory barrier.
|
|
since alloca() result is used indirectly, gcc 4.7.2 thinks
the whole call can be dropped on any optimization level.
|
|
|
|
Introduced 4 priorities:
0 - management (cli)
1 - starting sessions (default priority)
2 - active sessions
3 - finishing sessions
|
|
Instead of entering working thread into sleep triton saves machine context and stack on sleep and restores context/stack on wakeup.
This saves costly new thread allocation.
|
|
Add list_replace() and list_replace_init(), as defined in Linux kernel
sources.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
|
|
The pending_calls field of struct _triton_context_t can be concurrently
used by other contexts. So it must only be accessed or modified under
protection of the context's lock (like in triton_context_call() or
ctx_thread()).
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This patch gets rid of synchronuos style of authentication/accounting.
Synchronous style of authentication/accounting produced sleeping threads
which becomes a problem when lots of sessions started/stopped and all they want authorization/accounting.
|
|
When there are many interfaces to start accel-ppp stucks on startup because kernel slowly creates raw sockets.
So starting this proccess asynchronous improves accel-ppp responsiveness
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* Add list_first_entry() to list.h
* Declare parameter of list_empty() as const
Both changes are already included in Linux kernel sources.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Signed-off-by: Dmitry Kozlov <xeb@mail.ru>
|
|
already called triton_context_unregister)
|
|
The triton_terminate() function works by setting the need_close flag
of each triton context, then queues this context for execution by a
triton thread if not already running. But if the context is already
being run by a triton thread, it may not notice that its need_close
flag has been updated (this flag is only checked at the beginning
of ctx_thread()). So if no other event wakes up that context (i.e.
if ctx_thread() isn't run again), it will never terminate.
This patch moves the need_close flag check at the end of ctx_thread()
so that a triton context can take the need_close flag into account
event if it's updated while running.
The context spinlock is also used to protect the need_close flag as
it is concurrently updated by triton_terminate().
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
|
|
This reverts commit 49b348dd38dcf89a057abebc0ffdf73748effa0a.
|
|
|
|
Use the number of available processors to set the thread-count
option if not given in configuration file.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
|
|
* l2tp: Fix allocation checking when adding octets AVP
* cli, tcp: Fix non-NULL terminated string reception
* Fix va_end() missing calls
* chap-secrets: implemented encryption
* auth_pap: make messages like other auth modules
* cli: check xmit_buf is not null at enter to write function
* pppoe: implemented regular expression support
* chap-secrets: implemented encryption
* ippool: fixed initialization order
* optional shaper compiling
* ppp: dns/wins code cleanup
|
|
|
|
Append the format() __attribute__ to function prototypes which
use a format string. This allows GCC to check for consistency
between the format string and its arguments when these
functions are called.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This reverts commit ee41cba691ab9f6461f4933461cf82be161333de.
|
|
|
|
|
|
|