]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
dtrace: fix for psinfo allocation during execve
authorKris Van Hees <kris.van.hees@oracle.com>
Fri, 13 Sep 2013 14:33:41 +0000 (10:33 -0400)
committerKris Van Hees <kris.van.hees@oracle.com>
Tue, 17 Sep 2013 11:26:22 +0000 (07:26 -0400)
Allocate the psinfo structure from a slab (alike other structures related to
the task_struct), and use kmalloc() for the argv and envp members (with size
limit to avoid allocation issues).

Orabug: 17407069
Signed-off-by: Kris Van Hees <kris.van.hees@oracle.com>
dtrace/dtrace_dev.c
dtrace/dtrace_hash.c
dtrace/dtrace_ptofapi.c
dtrace/dtrace_state.c
dtrace/fasttrap_dev.c
dtrace/include/dtrace/dtrace_impl.h
dtrace/profile_dev.c

index 8d267856d6e019af285b8bb3f95eea256b6a731d..853a3ef720121b100c79697453c5ed12cd2e4257 100644 (file)
@@ -67,13 +67,14 @@ dtrace_pops_t                       dtrace_provider_ops = {
        (void (*)(void *, dtrace_id_t, void *))dtrace_nullop
 };
 
-dtrace_toxrange_t              *dtrace_toxrange;
-int                            dtrace_toxranges;
-
 static size_t                  dtrace_retain_max = 1024;
 
+dtrace_toxrange_t              *dtrace_toxrange;
+int                            dtrace_toxranges;
 static int                     dtrace_toxranges_max;
 
+struct kmem_cache              *dtrace_state_cachep;
+
 static dtrace_pattr_t          dtrace_provider_attr = {
 { DTRACE_STABILITY_STABLE, DTRACE_STABILITY_STABLE, DTRACE_CLASS_COMMON },
 { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
@@ -82,6 +83,8 @@ static dtrace_pattr_t         dtrace_provider_attr = {
 { DTRACE_STABILITY_STABLE, DTRACE_STABILITY_STABLE, DTRACE_CLASS_COMMON },
 };
 
+DEFINE_MUTEX(dtrace_lock);
+
 void (*dtrace_modload)(struct module *);
 void (*dtrace_modunload)(struct module *);
 
@@ -1411,10 +1414,10 @@ int dtrace_dev_init(void)
                                    0);
 #endif
 
-       dtrace_state_cache = kmem_cache_create("dtrace_state_cache",
-                               sizeof(dtrace_dstate_percpu_t) * NR_CPUS,
-                               __alignof__(dtrace_dstate_percpu_t),
-                               SLAB_PANIC, NULL);
+        dtrace_state_cachep = kmem_cache_create("dtrace_state_cache",
+                               sizeof(dtrace_dstate_percpu_t) * NR_CPUS, 0,
+                               SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_NOTRACK,
+                               NULL);
 
        /*
         * Create the probe hashtables.
@@ -1539,7 +1542,7 @@ void dtrace_dev_exit(void)
        dtrace_byfunc = NULL;
        dtrace_byname = NULL;
 
-       kmem_cache_destroy(dtrace_state_cache);
+       kmem_cache_destroy(dtrace_state_cachep);
        misc_deregister(&helper_dev);
        misc_deregister(&dtrace_dev);
 
index f34144c6869c3708fef99bfe866d17ec6a60d32f..1bdf49606e2b04ff7c42aa2cfdb9bc3577c1dc09 100644 (file)
@@ -144,7 +144,7 @@ int dtrace_hash_add(dtrace_hash_t *hash, dtrace_probe_t *new)
                        return err;
 
                dtrace_hash_add(hash, new);
-               return;
+               return 0;
        }
 
        bucket = vzalloc(sizeof(dtrace_hashbucket_t));
@@ -172,6 +172,8 @@ add:
 
        bucket->dthb_chain = new;
        bucket->dthb_len++;
+
+       return 0;
 }
 
 dtrace_probe_t *dtrace_hash_lookup(dtrace_hash_t *hash,
index 70b30dfe122591738d928e6df043ffc71e1489bb..110300ee8a7bc535a4c6724282132361e896efb6 100644 (file)
@@ -36,7 +36,6 @@ dtrace_provider_t     *dtrace_provider;
 dtrace_meta_t          *dtrace_meta_pid;
 dtrace_helpers_t       *dtrace_deferred_pid;
 
-DEFINE_MUTEX(dtrace_lock);
 DEFINE_MUTEX(dtrace_provider_lock);
 DEFINE_MUTEX(dtrace_meta_lock);
 
index 1f1377edd90e47de837902ebe4b911a8ef78e4d7..4d458cf2cf3fcdaebba31d88ef157e80e43313a7 100644 (file)
@@ -35,7 +35,6 @@
 
 #include "dtrace.h"
 
-struct kmem_cache      *dtrace_state_cache;
 int                    dtrace_destructive_disallow = 0;
 dtrace_optval_t                dtrace_nspec_default = 1;
 dtrace_optval_t                dtrace_specsize_default = 32 * 1024;
@@ -178,7 +177,7 @@ int dtrace_dstate_init(dtrace_dstate_t *dstate, size_t size)
        base = dtrace_vzalloc_try(size);
        if (base == NULL)
                return -ENOMEM;
-       percpu = kmem_cache_alloc(dtrace_state_cache, GFP_KERNEL);
+       percpu = kmem_cache_alloc(dtrace_state_cachep, GFP_KERNEL);
        if (percpu == NULL) {
                vfree(base);
                return -ENOMEM;
@@ -268,7 +267,7 @@ void dtrace_dstate_fini(dtrace_dstate_t *dstate)
                return;
 
        vfree(dstate->dtds_base);
-       kmem_cache_free(dtrace_state_cache, dstate->dtds_percpu);
+       kmem_cache_free(dtrace_state_cachep, dstate->dtds_percpu);
 }
 
 void dtrace_vstate_fini(dtrace_vstate_t *vstate)
index 00335cb37d40428d92de78d63a293ecbe3b81900..950dfe00b3ac5917dd92cee5bc9f440204817ea5 100644 (file)
@@ -814,10 +814,12 @@ static int fasttrap_uint32_cmp(const void *ap, const void *bp)
        return (*(const uint32_t *)ap - *(const uint32_t *)bp);
 }
 
+#if 0
 static int fasttrap_uint64_cmp(const void *ap, const void *bp)
 {
        return (*(const uint64_t *)ap - *(const uint64_t *)bp);
 }
+#endif
 
 void fasttrap_meta_create_probe(void *arg, void *parg,
                                dtrace_helper_probedesc_t *dhpb)
index f7eda9188eb03d5d46e5aa934ebcd66b4bf1f515..2f5034fdbb0108e13cc3d29ef5cd18ea80d5d531 100644 (file)
@@ -815,7 +815,7 @@ extern void dtrace_anon_property(void);
 /*
  * DTrace Consumer State Functions
  */
-extern struct kmem_cache       *dtrace_state_cache;
+extern struct kmem_cache       *dtrace_state_cachep;
 extern size_t                  dtrace_strsize_default;
 
 extern ktime_t                 dtrace_deadman_timeout;
index e4bdde99d52af98066d2b2b8a1ef68eb3f97f4b5..4f58a78c0893ad18d0a6789af4fb6e35e11f75c3 100644 (file)
@@ -92,10 +92,10 @@ static atomic_t     profile_total;          /* current number of profile probes */
 static void profile_tick(void *arg)
 {
        profile_probe_t *prof = arg;
-       struct pt_regs  *regs = get_irq_regs();
        unsigned long   pc = 0, upc = 0;
-
 #ifdef PROBE_PCS
+       struct pt_regs  *regs = get_irq_regs();
+
        if (user_mode(regs))
                upc = GET_IP(regs);
        else
@@ -342,7 +342,9 @@ void profile_provide(void *arg, const dtrace_probedesc_t *desc)
 int _profile_enable(void *arg, dtrace_id_t id, void *parg)
 {
        profile_probe_t         *prof = parg;
+#ifdef OMNI_CYCLICS
        cyc_omni_handler_t      omni;
+#endif
        cyc_handler_t           hdlr;
        cyc_time_t              when;