From: Alan T. DeKok Date: Fri, 27 Nov 2020 16:15:30 +0000 (-0500) Subject: make the counter global for request->number X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=be67130b1d64d402c1324f5fd814fa78018b4e31;p=thirdparty%2Ffreeradius-server.git make the counter global for request->number --- diff --git a/src/lib/io/atomic_queue.h b/src/lib/io/atomic_queue.h index 0aaf749a984..c0f1ab3d120 100644 --- a/src/lib/io/atomic_queue.h +++ b/src/lib/io/atomic_queue.h @@ -39,6 +39,7 @@ RCSIDH(atomic_queue_h, "$Id$") */ #define atomic_int64_t _Atomic(int64_t) #define atomic_uint32_t _Atomic(uint32_t) +#define atomic_uint64_t _Atomic(uint64_t) #define cas_incr(_store, _var) atomic_compare_exchange_strong_explicit(&_store, &_var, _var + 1, memory_order_release, memory_order_relaxed) #define cas_decr(_store, _var) atomic_compare_exchange_strong_explicit(&_store, &_var, _var - 1, memory_order_release, memory_order_relaxed) diff --git a/src/lib/io/worker.c b/src/lib/io/worker.c index 66d64c2b1de..1363f90ef75 100644 --- a/src/lib/io/worker.c +++ b/src/lib/io/worker.c @@ -62,6 +62,8 @@ RCSID("$Id$") #include #include +#include + #ifdef WITH_VERIFY_PTR static void worker_verify(fr_worker_t *worker); #define WORKER_VERIFY worker_verify(worker) @@ -71,6 +73,9 @@ static void worker_verify(fr_worker_t *worker); static _Thread_local fr_worker_t *thread_local_worker; +#define CACHE_LINE_SIZE 64 +static alignas(CACHE_LINE_SIZE) atomic_uint64_t request_number = 0; + /** * A worker which takes packets from a master, and processes them. */ @@ -89,8 +94,6 @@ struct fr_worker_s { fr_event_list_t *el; //!< our event list - uint64_t number; //!< Per worker request id. - int num_channels; //!< actual number of channels fr_heap_t *runnable; //!< current runnable requests which we've spent time processing @@ -649,6 +652,8 @@ static char *itoa_internal(TALLOC_CTX *ctx, uint64_t number) */ static void worker_request_init(fr_worker_t *worker, request_t *request, fr_time_t now) { + uint64_t number; + request->el = worker->el; request->backlog = worker->runnable; MEM(request->packet = fr_radius_alloc(request, false)); @@ -657,7 +662,15 @@ static void worker_request_init(fr_worker_t *worker, request_t *request, fr_time request->reply = fr_radius_alloc(request, false); fr_assert(request->reply != NULL); - request->number = worker->number++; + /* + * Keep loading the number until we successfully + * increment it in-place. + */ + do { + number = load(request_number); + } while (!cas_incr(request_number, number)); + + request->number = number; request->name = itoa_internal(request, request->number); request->async = talloc_zero(request, fr_async_t);