Verify the absence of holes in struct jobs_eta at compile time
authorBart Van Assche <bvanassche@acm.org>
Wed, 14 Aug 2019 20:10:10 +0000 (13:10 -0700)
committerJens Axboe <axboe@kernel.dk>
Wed, 14 Aug 2019 21:01:29 +0000 (15:01 -0600)
This patch verifies the correctness of the previous patch.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
eta.c
stat.h

diff --git a/eta.c b/eta.c
index 647a1bdd8eed7433c2413fde356844720b45e722..5900bc0fd9197f28795bc34e303da82a2276780d 100644 (file)
--- a/eta.c
+++ b/eta.c
@@ -736,6 +736,9 @@ void print_thread_status(void)
 
 void print_status_init(int thr_number)
 {
+       compiletime_assert(sizeof(struct jobs_eta) ==
+                          sizeof(struct jobs_eta_packed), "jobs_eta");
+
        DRD_IGNORE_VAR(__run_str);
        __run_str[thr_number] = 'P';
        update_condensed_str(__run_str, run_str);
diff --git a/stat.h b/stat.h
index c6353c70ae08146ae8e7760bbf0fbff4becaad9d..c209ab6c7a96ab67e59842c0e8e21a3d37212a3f 100644 (file)
--- a/stat.h
+++ b/stat.h
@@ -251,33 +251,36 @@ struct thread_stat {
        uint64_t cachemiss;
 } __attribute__((packed));
 
-struct jobs_eta {
-       uint32_t nr_running;
-       uint32_t nr_ramp;
-
-       uint32_t nr_pending;
-       uint32_t nr_setting_up;
-
-       uint64_t m_rate[DDIR_RWDIR_CNT], t_rate[DDIR_RWDIR_CNT];
-       uint64_t rate[DDIR_RWDIR_CNT];
-       uint32_t m_iops[DDIR_RWDIR_CNT] __attribute__((packed));
-       uint32_t t_iops[DDIR_RWDIR_CNT] __attribute__((packed));
-       uint32_t iops[DDIR_RWDIR_CNT] __attribute__((packed));
-       uint64_t elapsed_sec __attribute__((packed));
-       uint64_t eta_sec __attribute__((packed));
-       uint32_t is_pow2;
-       uint32_t unit_base;
-
-       uint32_t sig_figs;
-
-       uint32_t files_open;
+#define JOBS_ETA {                                                     \
+       uint32_t nr_running;                                            \
+       uint32_t nr_ramp;                                               \
+                                                                       \
+       uint32_t nr_pending;                                            \
+       uint32_t nr_setting_up;                                         \
+                                                                       \
+       uint64_t m_rate[DDIR_RWDIR_CNT], t_rate[DDIR_RWDIR_CNT];        \
+       uint64_t rate[DDIR_RWDIR_CNT];                                  \
+       uint32_t m_iops[DDIR_RWDIR_CNT] __attribute__((packed));        \
+       uint32_t t_iops[DDIR_RWDIR_CNT] __attribute__((packed));        \
+       uint32_t iops[DDIR_RWDIR_CNT] __attribute__((packed));          \
+       uint64_t elapsed_sec __attribute__((packed));                   \
+       uint64_t eta_sec __attribute__((packed));                       \
+       uint32_t is_pow2;                                               \
+       uint32_t unit_base;                                             \
+                                                                       \
+       uint32_t sig_figs;                                              \
+                                                                       \
+       uint32_t files_open;                                            \
+                                                                       \
+       /*                                                              \
+        * Network 'copy' of run_str[]                                  \
+        */                                                             \
+       uint32_t nr_threads;                                            \
+       uint8_t run_str[];                                              \
+}
 
-       /*
-        * Network 'copy' of run_str[]
-        */
-       uint32_t nr_threads;
-       uint8_t run_str[];
-};
+struct jobs_eta JOBS_ETA;
+struct jobs_eta_packed JOBS_ETA __attribute__((packed));
 
 struct io_u_plat_entry {
        struct flist_head list;