]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
make the counter global for request->number
authorAlan T. DeKok <aland@freeradius.org>
Fri, 27 Nov 2020 16:15:30 +0000 (11:15 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 27 Nov 2020 16:15:30 +0000 (11:15 -0500)
src/lib/io/atomic_queue.h
src/lib/io/worker.c

index 0aaf749a9844c552cecd5df69ccc50f907cff171..c0f1ab3d120920c0b708a2eb7fe96050fbfb4d20 100644 (file)
@@ -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)
index 66d64c2b1dedca1252fed07a4da4b5c9352563bf..1363f90ef7568302d85d591acb2e62937e6537fd 100644 (file)
@@ -62,6 +62,8 @@ RCSID("$Id$")
 #include <freeradius-devel/unlang/interpret.h>
 #include <freeradius-devel/util/dlist.h>
 
+#include <stdalign.h>
+
 #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);