]> granicus.if.org Git - sysstat/commitdiff
sadc: Make sure nr of items are always counted for certain activities
authorSebastien GODARD <sysstat@users.noreply.github.com>
Sat, 9 Mar 2019 07:47:04 +0000 (08:47 +0100)
committerSebastien GODARD <sysstat@users.noreply.github.com>
Sat, 9 Mar 2019 07:47:04 +0000 (08:47 +0100)
Commit f81fc24 modified sadc so that the number of items are counted
only for activities which are collected by sadc.
In fact certain activities need to be counted even if they are not
collected. This is the case for A_CPU: We need to know the number of CPU
for various reasons (from displaying the report header to saving it in
the header of a new saXX datafile).
So add a new flag (AO_ALWAYS_COUNTED) to indicate which activities
should always be counted, be they collected or not.

Signed-off-by: Sebastien GODARD <sysstat@users.noreply.github.com>
activity.c
sa.h
sadc.c

index c5b68137d93f3e169159319c9801e38c3e5f5534..6a76f3997f43221940268f9d2db9873656330aec 100644 (file)
@@ -68,7 +68,8 @@ struct act_bitmap irq_bitmap = {
 struct activity cpu_act = {
        .id             = A_CPU,
        .options        = AO_COLLECTED + AO_COUNTED + AO_PERSISTENT +
-                         AO_MULTIPLE_OUTPUTS + AO_GRAPH_PER_ITEM,
+                         AO_MULTIPLE_OUTPUTS + AO_GRAPH_PER_ITEM +
+                         AO_ALWAYS_COUNTED,
        .magic          = ACTIVITY_MAGIC_BASE + 1,
        .group          = G_DEFAULT,
 #ifdef SOURCE_SADC
diff --git a/sa.h b/sa.h
index eb2842a253c1247728dc592afbc5021ed6638262..193ecaff58a87b8b80b02e762d182ba4f8099034 100644 (file)
--- a/sa.h
+++ b/sa.h
@@ -705,6 +705,11 @@ struct record_header {
  * line for this activity (see options --dev=, --iface=, ...)
  */
 #define AO_LIST_ON_CMDLINE     0x100
+/*
+ * Indicate that the number of items for this activity should always
+ * be counted, even if the activity is not collected.
+ */
+#define AO_ALWAYS_COUNTED      0x200
 
 #define IS_COLLECTED(m)                (((m) & AO_COLLECTED)        == AO_COLLECTED)
 #define IS_SELECTED(m)         (((m) & AO_SELECTED)         == AO_SELECTED)
@@ -715,6 +720,7 @@ struct record_header {
 #define ONE_GRAPH_PER_ITEM(m)  (((m) & AO_GRAPH_PER_ITEM)   == AO_GRAPH_PER_ITEM)
 #define IS_MATRIX(m)           (((m) & AO_MATRIX)           == AO_MATRIX)
 #define HAS_LIST_ON_CMDLINE(m) (((m) & AO_LIST_ON_CMDLINE)  == AO_LIST_ON_CMDLINE)
+#define ALWAYS_COUNT_ITEMS(m)  (((m) & AO_ALWAYS_COUNTED)   == AO_ALWAYS_COUNTED)
 
 #define _buf0  buf[0]
 #define _nr0   nr[0]
diff --git a/sadc.c b/sadc.c
index a72c769d522413843c6431ab9070939477067303..2c19dedcbcd7b93bf0c3af3d1fd05d989906ae45 100644 (file)
--- a/sadc.c
+++ b/sadc.c
@@ -297,9 +297,10 @@ void reset_stats(void)
 /*
  ***************************************************************************
  * Count activities items then allocate and init corresponding structures.
- * ALL activities are always counted (thus the number of CPU will always be
- * counted even if CPU activity is not collected), but ONLY those that will
- * be collected have allocated structures.
+ * Activities such A_CPU with AO_ALWAYS_COUNTED flag set are always counted
+ * (thus the number of CPU will always be counted even if CPU activity is
+ * not collected), but ONLY those that will be collected have allocated
+ * structures.
  * This function is called when sadc is started, and when a file is rotated.
  * If a file is rotated and structures are reallocated with a larger size,
  * additional space is not initialized: It doesn't matter as reset_stats()
@@ -318,10 +319,8 @@ void sa_sys_init(void)
 
        for (i = 0; i < NR_ACT; i++) {
 
-               if ( ! (act[i]->options & AO_COLLECTED ) )
-                       continue;
-
-               if (HAS_COUNT_FUNCTION(act[i]->options)) {
+               if ((HAS_COUNT_FUNCTION(act[i]->options) && IS_COLLECTED(act[i]->options)) ||
+                   ALWAYS_COUNT_ITEMS(act[i]->options)) {
                        idx = act[i]->f_count_index;
 
                        /* Number of items is not a constant and should be calculated */
@@ -500,8 +499,7 @@ void setup_file_hdr(int fd)
         * This is a new file (or stdout): Set sa_cpu_nr field to the number
         * of CPU of the machine (1 .. CPU_NR + 1). This is the number of CPU, whether
         * online or offline, when sadc was started.
-        * All activities (including A_CPU) are counted in sa_sys_init(), even
-        * if they are not collected.
+        * A_CPU activity is always counted in sa_sys_init(), even if it's not collected.
         */
        file_hdr.sa_cpu_nr = act[get_activity_position(act, A_CPU, EXIT_IF_NOT_FOUND)]->nr_ini;