]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
gcov: use kvmalloc()
authorJohannes Berg <johannes.berg@intel.com>
Thu, 22 Apr 2021 06:43:05 +0000 (16:43 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 5 May 2021 22:09:25 +0000 (08:09 +1000)
Using vmalloc() in gcov is really quite wasteful, many of the objects
allocated are really small (e.g.  I've seen 24 bytes.) Use kvmalloc() to
automatically pick the better of kmalloc() or vmalloc() depending on the
size.

Link: https://lkml.kernel.org/r/20210315235453.799e7a9d627d.I741d0db096c6f312910f7f1bcdfde0fda20801a4@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Cc: Peter Oberparleiter <oberpar@linux.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
kernel/gcov/clang.c
kernel/gcov/fs.c
kernel/gcov/gcc_4_7.c

index 1741c65b4fb2e9e6fbab97006f6a281a817f29d5..04a65443005d76d17031b440310437e3380a4309 100644 (file)
@@ -49,7 +49,7 @@
 #include <linux/printk.h>
 #include <linux/ratelimit.h>
 #include <linux/slab.h>
-#include <linux/vmalloc.h>
+#include <linux/mm.h>
 #include "gcov.h"
 
 typedef void (*llvm_gcov_callback)(void);
@@ -333,8 +333,8 @@ void gcov_info_add(struct gcov_info *dst, struct gcov_info *src)
 static struct gcov_fn_info *gcov_fn_info_dup(struct gcov_fn_info *fn)
 {
        size_t cv_size; /* counter values size */
-       struct gcov_fn_info *fn_dup = kmemdup(fn, sizeof(*fn),
-                       GFP_KERNEL);
+       struct gcov_fn_info *fn_dup = kmemdup(fn, sizeof(*fn), GFP_KERNEL);
+
        if (!fn_dup)
                return NULL;
        INIT_LIST_HEAD(&fn_dup->head);
@@ -344,7 +344,7 @@ static struct gcov_fn_info *gcov_fn_info_dup(struct gcov_fn_info *fn)
                goto err_name;
 
        cv_size = fn->num_counters * sizeof(fn->counters[0]);
-       fn_dup->counters = vmalloc(cv_size);
+       fn_dup->counters = kvmalloc(cv_size, GFP_KERNEL);
        if (!fn_dup->counters)
                goto err_counters;
        memcpy(fn_dup->counters, fn->counters, cv_size);
@@ -439,7 +439,7 @@ void gcov_info_free(struct gcov_info *info)
        struct gcov_fn_info *fn, *tmp;
 
        list_for_each_entry_safe(fn, tmp, &info->functions, head) {
-               vfree(fn->counters);
+               kvfree(fn->counters);
                list_del(&fn->head);
                kfree(fn);
        }
index 40ea81c0475b59b05ae9db9d2aca223440bdbda1..5c3086cad8f99e076f169311a79e4d6ff7cd3c21 100644 (file)
@@ -26,7 +26,7 @@
 #include <linux/slab.h>
 #include <linux/mutex.h>
 #include <linux/seq_file.h>
-#include <linux/vmalloc.h>
+#include <linux/mm.h>
 #include "gcov.h"
 
 /**
@@ -116,7 +116,7 @@ static struct gcov_iterator *gcov_iter_new(struct gcov_info *info)
        /* Dry-run to get the actual buffer size. */
        size = convert_to_gcda(NULL, info);
 
-       iter = vmalloc(struct_size(iter, buffer, size));
+       iter = kvmalloc(struct_size(iter, buffer, size), GFP_KERNEL);
        if (!iter)
                return NULL;
 
@@ -134,7 +134,7 @@ static struct gcov_iterator *gcov_iter_new(struct gcov_info *info)
  */
 static void gcov_iter_free(struct gcov_iterator *iter)
 {
-       vfree(iter);
+       kvfree(iter);
 }
 
 /**
index 1251f2434e907221cccdc657f7c6ba792db35b44..460c12b7dfea2348c9da2ed4408351ce8dd6c100 100644 (file)
@@ -15,7 +15,7 @@
 #include <linux/errno.h>
 #include <linux/slab.h>
 #include <linux/string.h>
-#include <linux/vmalloc.h>
+#include <linux/mm.h>
 #include "gcov.h"
 
 #if (__GNUC__ >= 10)
@@ -309,7 +309,7 @@ struct gcov_info *gcov_info_dup(struct gcov_info *info)
 
                        cv_size = sizeof(gcov_type) * sci_ptr->num;
 
-                       dci_ptr->values = vmalloc(cv_size);
+                       dci_ptr->values = kvmalloc(cv_size, GFP_KERNEL);
 
                        if (!dci_ptr->values)
                                goto err_free;
@@ -351,7 +351,7 @@ void gcov_info_free(struct gcov_info *info)
                ci_ptr = info->functions[fi_idx]->ctrs;
 
                for (ct_idx = 0; ct_idx < active; ct_idx++, ci_ptr++)
-                       vfree(ci_ptr->values);
+                       kvfree(ci_ptr->values);
 
                kfree(info->functions[fi_idx]);
        }