From 8bbb38ae2b104a16534c99a6f60abc1d37688143 Mon Sep 17 00:00:00 2001 From: Kris Van Hees Date: Wed, 8 Jul 2015 18:33:37 -0400 Subject: [PATCH] dtrace: only sparc64 uses sdt_tab in pdata This commit introduces pdata_init() and pdata_cleanup() to allow an architecture to perform arch-dependent operations on the pdata information prior to assigning it to the module, and right before getting rid of it (at module unloading time). Signed-off-by: Kris Van Hees Acked-by: Nick Alcock --- dtrace/dtrace_dev.c | 18 +++++++++--------- dtrace/dtrace_isa_sparc64.c | 11 +++++++++++ dtrace/dtrace_isa_x86_64.c | 8 ++++++++ dtrace/include/dtrace/dtrace_impl.h | 3 +++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/dtrace/dtrace_dev.c b/dtrace/dtrace_dev.c index 0a218d0418bb..f512c3a30ef8 100644 --- a/dtrace/dtrace_dev.c +++ b/dtrace/dtrace_dev.c @@ -1125,22 +1125,22 @@ static struct miscdevice helper_dev = { static void module_add_pdata(void *dmy, struct module *mp) { - dmy = mp->pdata; - mp->pdata = kmem_cache_alloc(dtrace_pdata_cachep, - GFP_KERNEL | __GFP_ZERO); + dtrace_module_t *pdata = kmem_cache_alloc(dtrace_pdata_cachep, + GFP_KERNEL | __GFP_ZERO); - if (dmy) - PDATA(mp)->sdt_tab = dmy; + pdata_init(pdata, mp); + mp->pdata = pdata; } static void module_del_pdata(void *dmy, struct module *mp) { - if (!mp->pdata) + dtrace_module_t *pdata = mp->pdata; + + if (!pdata) return; - dmy = PDATA(mp)->sdt_tab; - kmem_cache_free(dtrace_pdata_cachep, mp->pdata); - mp->pdata = dmy; + pdata_cleanup(pdata, mp); + kmem_cache_free(dtrace_pdata_cachep, pdata); } static void dtrace_module_loading(struct module *mp) diff --git a/dtrace/dtrace_isa_sparc64.c b/dtrace/dtrace_isa_sparc64.c index 9176c417efa3..6a6e0d98efa0 100644 --- a/dtrace/dtrace_isa_sparc64.c +++ b/dtrace/dtrace_isa_sparc64.c @@ -209,3 +209,14 @@ ulong_t dtrace_getreg(struct task_struct *task, uint_t reg) return 0; } } + +void pdata_init(dtrace_module_t *pdata, struct module *mp) +{ + if (mp->pdata) + pdata->sdt_tab = mp->pdata; +} + +void pdata_cleanup(dtrace_module_t *pdata, struct module *mp) +{ + mp->pdata = pdata->sdt_tab; +} diff --git a/dtrace/dtrace_isa_x86_64.c b/dtrace/dtrace_isa_x86_64.c index 192017123515..43b90a5b3936 100644 --- a/dtrace/dtrace_isa_x86_64.c +++ b/dtrace/dtrace_isa_x86_64.c @@ -226,3 +226,11 @@ ulong_t dtrace_getreg(struct task_struct *task, uint_t reg) return 0; } } + +void pdata_init(dtrace_module_t *pdata, struct module *mp) +{ +} + +void pdata_cleanup(dtrace_module_t *pdata, struct module *mp) +{ +} diff --git a/dtrace/include/dtrace/dtrace_impl.h b/dtrace/include/dtrace/dtrace_impl.h index e681855cb6c5..cd2c420681ad 100644 --- a/dtrace/include/dtrace/dtrace_impl.h +++ b/dtrace/include/dtrace/dtrace_impl.h @@ -905,6 +905,9 @@ extern void dtrace_copyoutstr(uintptr_t, uintptr_t, size_t, volatile uint16_t *); extern uintptr_t dtrace_caller(int); +extern void pdata_init(dtrace_module_t *, struct module *); +extern void pdata_cleanup(dtrace_module_t *, struct module *); + extern void debug_enter(char *); #endif /* _LINUX_DTRACE_IMPL_H */ -- 2.50.1