From d8a2826898f6b941ed9f86a6eaa9ecc224153476 Mon Sep 17 00:00:00 2001 From: Kris Van Hees Date: Fri, 13 Sep 2013 10:33:41 -0400 Subject: [PATCH] dtrace: fix for psinfo allocation during execve 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 --- dtrace/dtrace_dev.c | 19 +++++++++++-------- dtrace/dtrace_hash.c | 4 +++- dtrace/dtrace_ptofapi.c | 1 - dtrace/dtrace_state.c | 5 ++--- dtrace/fasttrap_dev.c | 2 ++ dtrace/include/dtrace/dtrace_impl.h | 2 +- dtrace/profile_dev.c | 6 ++++-- 7 files changed, 23 insertions(+), 16 deletions(-) diff --git a/dtrace/dtrace_dev.c b/dtrace/dtrace_dev.c index 8d267856d6e0..853a3ef72012 100644 --- a/dtrace/dtrace_dev.c +++ b/dtrace/dtrace_dev.c @@ -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); diff --git a/dtrace/dtrace_hash.c b/dtrace/dtrace_hash.c index f34144c6869c..1bdf49606e2b 100644 --- a/dtrace/dtrace_hash.c +++ b/dtrace/dtrace_hash.c @@ -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, diff --git a/dtrace/dtrace_ptofapi.c b/dtrace/dtrace_ptofapi.c index 70b30dfe1225..110300ee8a7b 100644 --- a/dtrace/dtrace_ptofapi.c +++ b/dtrace/dtrace_ptofapi.c @@ -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); diff --git a/dtrace/dtrace_state.c b/dtrace/dtrace_state.c index 1f1377edd90e..4d458cf2cf3f 100644 --- a/dtrace/dtrace_state.c +++ b/dtrace/dtrace_state.c @@ -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) diff --git a/dtrace/fasttrap_dev.c b/dtrace/fasttrap_dev.c index 00335cb37d40..950dfe00b3ac 100644 --- a/dtrace/fasttrap_dev.c +++ b/dtrace/fasttrap_dev.c @@ -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) diff --git a/dtrace/include/dtrace/dtrace_impl.h b/dtrace/include/dtrace/dtrace_impl.h index f7eda9188eb0..2f5034fdbb01 100644 --- a/dtrace/include/dtrace/dtrace_impl.h +++ b/dtrace/include/dtrace/dtrace_impl.h @@ -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; diff --git a/dtrace/profile_dev.c b/dtrace/profile_dev.c index e4bdde99d52a..4f58a78c0893 100644 --- a/dtrace/profile_dev.c +++ b/dtrace/profile_dev.c @@ -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; -- 2.50.1