OSDN Git Service

rcuperf: Measure memory footprint during kfree_rcu() test
authorJoel Fernandes (Google) <joel@joelfernandes.org>
Thu, 19 Dec 2019 16:22:42 +0000 (11:22 -0500)
committerPaul E. McKenney <paulmck@kernel.org>
Fri, 21 Feb 2020 00:03:31 +0000 (16:03 -0800)
During changes to kfree_rcu() code, we often check the amount of free
memory.  As an alternative to checking this manually, this commit adds a
measurement in the test itself.  It measures four times during the test
for available memory, digitally filters these measurements to produce a
running average with a weight of 0.5, and compares this digitally filtered
value with the amount of available memory at the beginning of the test.

Something like the following is printed at the end of the run:

Total time taken by all kfree'ers: 6369738407 ns, loops: 10000, batches: 764, memory footprint: 216MB

Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/rcuperf.c

index da94b89..a4a8d09 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/mm.h>
 #include <linux/module.h>
 #include <linux/kthread.h>
 #include <linux/err.h>
@@ -611,6 +612,7 @@ kfree_perf_thread(void *arg)
        long me = (long)arg;
        struct kfree_obj *alloc_ptr;
        u64 start_time, end_time;
+       long long mem_begin, mem_during = 0;
 
        VERBOSE_PERFOUT_STRING("kfree_perf_thread task started");
        set_cpus_allowed_ptr(current, cpumask_of(me % nr_cpu_ids));
@@ -626,6 +628,12 @@ kfree_perf_thread(void *arg)
        }
 
        do {
+               if (!mem_during) {
+                       mem_during = mem_begin = si_mem_available();
+               } else if (loop % (kfree_loops / 4) == 0) {
+                       mem_during = (mem_during + si_mem_available()) / 2;
+               }
+
                for (i = 0; i < kfree_alloc_num; i++) {
                        alloc_ptr = kmalloc(sizeof(struct kfree_obj), GFP_KERNEL);
                        if (!alloc_ptr)
@@ -645,9 +653,11 @@ kfree_perf_thread(void *arg)
                else
                        b_rcu_gp_test_finished = cur_ops->get_gp_seq();
 
-               pr_alert("Total time taken by all kfree'ers: %llu ns, loops: %d, batches: %ld\n",
+               pr_alert("Total time taken by all kfree'ers: %llu ns, loops: %d, batches: %ld, memory footprint: %lldMB\n",
                       (unsigned long long)(end_time - start_time), kfree_loops,
-                      rcuperf_seq_diff(b_rcu_gp_test_finished, b_rcu_gp_test_started));
+                      rcuperf_seq_diff(b_rcu_gp_test_finished, b_rcu_gp_test_started),
+                      (mem_begin - mem_during) >> (20 - PAGE_SHIFT));
+
                if (shutdown) {
                        smp_mb(); /* Assign before wake. */
                        wake_up(&shutdown_wq);