]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
stats: convert to universal atomics (variable stats_vals)
authorDavid Vašek <david.vasek@nic.cz>
Sat, 4 Nov 2023 00:54:21 +0000 (01:54 +0100)
committerDavid Vašek <david.vasek@nic.cz>
Tue, 14 Nov 2023 15:27:57 +0000 (16:27 +0100)
src/knot/common/stats.c
src/knot/common/stats.h
src/knot/ctl/commands.c
src/knot/nameserver/query_module.c
src/knot/nameserver/query_module.h

index 79c0f239eeac507bf0b5d55221991b9df363468e..f94742bed7bc7ca220adcd9c9ee20fe5dbad84a0 100644 (file)
@@ -77,7 +77,8 @@ const stats_item_t zone_contents_stats[] = {
        { 0 }
 };
 
-uint64_t stats_get_counter(uint64_t **stats_vals, uint32_t offset, unsigned threads)
+uint64_t stats_get_counter(knot_atomic_uint64_t **stats_vals, uint32_t offset,
+                           unsigned threads)
 {
        uint64_t res = 0;
        for (unsigned i = 0; i < threads; i++) {
index 5cb51ca3622b0f5ff0a1e987790321e983ee4821..acfd1ca8a871f450bf31ec1e67041bbb04073758 100644 (file)
@@ -20,6 +20,7 @@
 
 #pragma once
 
+#include "contrib/atomic.h"
 #include "knot/server/server.h"
 
 typedef uint64_t (*stats_server_val_f)(server_t *server);
@@ -49,7 +50,8 @@ extern const stats_item_t zone_contents_stats[];
 /*!
  * \brief Read out value of single counter summed across threads.
  */
-uint64_t stats_get_counter(uint64_t **stats_vals, uint32_t offset, unsigned threads);
+uint64_t stats_get_counter(knot_atomic_uint64_t **stats_vals, uint32_t offset,
+                           unsigned threads);
 
 /*!
  * \brief Reconfigures the statistics facility.
index 5fbd202fdf71289678ec8cef743b4b8a4ffe9941..6ea8aae967784914d7915b8c9dc86ca7f8a480bc 100644 (file)
@@ -36,6 +36,7 @@
 #include "knot/zone/zonefile.h"
 #include "libknot/libknot.h"
 #include "libknot/yparser/yptrafo.h"
+#include "contrib/atomic.h"
 #include "contrib/files.h"
 #include "contrib/string.h"
 #include "contrib/strtonum.h"
@@ -1597,7 +1598,7 @@ static int zone_purge(zone_t *zone, ctl_args_t *args)
        return selective_zone_purge(conf(), zone, params);
 }
 
-static int send_stats_ctr(mod_ctr_t *ctr, uint64_t **stats_vals, unsigned threads,
+static int send_stats_ctr(mod_ctr_t *ctr, knot_atomic_uint64_t **stats_vals, unsigned threads,
                           ctl_args_t *args, knot_ctl_data_t *data)
 {
        char index[128];
index 54a982bb8967dfd9154f08457f7f9242a65c7624..13fa5da4e173f700b1e8ef689d1e2dbd7ab3be7a 100644 (file)
 #include "knot/nameserver/query_module.h"
 #include "knot/nameserver/process_query.h"
 
-#ifdef HAVE_ATOMIC
- #define ATOMIC_ADD(dst, val) __atomic_add_fetch(&(dst), (val), __ATOMIC_RELAXED)
- #define ATOMIC_SUB(dst, val) __atomic_sub_fetch(&(dst), (val), __ATOMIC_RELAXED)
- #define ATOMIC_SET(dst, val) __atomic_store_n(&(dst), (val), __ATOMIC_RELAXED)
-#else
- #warning "Statistics data can be inaccurate"
- #define ATOMIC_ADD(dst, val) ((dst) += (val))
- #define ATOMIC_SUB(dst, val) ((dst) -= (val))
- #define ATOMIC_SET(dst, val) ((dst) = (val))
-#endif
-
 _public_
 int knotd_conf_check_ref(knotd_conf_check_args_t *args)
 {
@@ -313,8 +302,8 @@ int knotd_mod_stats_add(knotd_mod_t *mod, const char *ctr_name, uint32_t idx_cou
                stats += mod->stats_count;
 
                for (unsigned i = 0; i < threads; i++) {
-                       uint64_t *new_vals = realloc(mod->stats_vals[i],
-                                                    (offset + idx_count) * sizeof(*new_vals));
+                       knot_atomic_uint64_t *new_vals = realloc(mod->stats_vals[i],
+                                                        (offset + idx_count) * sizeof(*new_vals));
                        if (new_vals == NULL) {
                                knotd_mod_stats_free(mod);
                                return KNOT_ENOMEM;
index 5cc905b909425fd90c670d9eef9b15a4bbefd45e..65957c4bc6706840696e759cd8a5135ddbb3d577 100644 (file)
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2023 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 #include "knot/dnssec/zone-keys.h"
 #include "knot/include/module.h"
 #include "knot/server/server.h"
+#include "contrib/atomic.h"
 #include "contrib/ucw/lists.h"
 
-#ifdef HAVE_ATOMIC
- #define ATOMIC_GET(src) __atomic_load_n(&(src), __ATOMIC_RELAXED)
-#else
- #define ATOMIC_GET(src) (src)
-#endif
-
 #define KNOTD_STAGES (KNOTD_STAGE_END + 1)
 
 typedef unsigned (*query_step_process_f)
@@ -91,7 +86,7 @@ struct knotd_mod {
        zone_keyset_t *keyset;
        zone_sign_ctx_t *sign_ctx;
        mod_ctr_t *stats_info;
-       uint64_t **stats_vals;
+       knot_atomic_uint64_t **stats_vals;
        uint32_t stats_count;
        void *ctx;
 };