From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1197 invoked by alias); 22 Oct 2015 07:45:57 -0000 Mailing-List: contact systemtap-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: systemtap-owner@sourceware.org Received: (qmail 1188 invoked by uid 89); 22 Oct 2015 07:45:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=2.5 required=5.0 tests=AWL,BAYES_50,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mail1.windriver.com Received: from mail1.windriver.com (HELO mail1.windriver.com) (147.11.146.13) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Thu, 22 Oct 2015 07:45:55 +0000 Received: from ALA-HCA.corp.ad.wrs.com (ala-hca.corp.ad.wrs.com [147.11.189.40]) by mail1.windriver.com (8.15.2/8.15.1) with ESMTPS id t9M7jrDx015744 (version=TLSv1 cipher=AES128-SHA bits=128 verify=FAIL) for ; Thu, 22 Oct 2015 00:45:53 -0700 (PDT) Received: from sustaining-2.corp.ad.wrs.com (128.224.162.131) by ALA-HCA.corp.ad.wrs.com (147.11.189.50) with Microsoft SMTP Server id 14.3.248.2; Thu, 22 Oct 2015 00:45:52 -0700 From: Zhu Yanjun To: Subject: [PATCH 1/1] stp: rt: replace spin_lock with stp style lock and use STP_ALLOC_FLAGS Date: Thu, 22 Oct 2015 07:45:00 -0000 Message-ID: <1445499965-23777-1-git-send-email-yanjun.zhu@windriver.com> MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes X-SW-Source: 2015-q4/txt/msg00043.txt.bz2 -rt mode spin lock lead to __might_sleep calltrace. Replacing spin lock with stp type raw lock and changing STP_ALLOC_SLEEP_FLAGS to STP_ALLOC_FLAGS solves the problem. Call Trace: [] dump_stack+0x19/0x1b [] __might_sleep+0xef/0x160 [] rt_spin_lock+0x20/0x50 [] d_path+0x79/0x1a0 [] __stp_get_mm_path.constprop.79+0x49/0x90 [stap_f5bb3e3c9b162aab5a51afc2375fe9cf_2073] [] __stp_utrace_attach_match_tsk.isra.53+0x7b/0x1b0 [stap_f5bb3e3c9b162aab5a51afc2375fe9cf_2073] [] __stp_utrace_task_finder_report_exec+0x3c/0x50 [stap_f5bb3e3c9b162aab5a51afc2375fe9cf_2073] [] utrace_report_exec+0xb9/0x100 [stap_f5bb3e3c9b162aab5a51afc2375fe9cf_2073] [] search_binary_handler+0x332/0x380 [] do_execve_common.isra.24+0x55c/0x640 [] do_execve+0x18/0x20 [] SyS_execve+0x32/0x50 [] stub_execve+0x69/0xa0 Signed-off-by: Zhu Yanjun --- runtime/linux/alloc.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/runtime/linux/alloc.c b/runtime/linux/alloc.c index 7e7e5ce..914cf2b 100644 --- a/runtime/linux/alloc.c +++ b/runtime/linux/alloc.c @@ -12,6 +12,7 @@ #define _STAPLINUX_ALLOC_C_ #include +#include "stp_helper_lock.h" static int _stp_allocated_net_memory = 0; /* Default, and should be "safe" from anywhere. */ @@ -19,7 +20,11 @@ static int _stp_allocated_net_memory = 0; & ~__GFP_WAIT) /* May only be used in context that can sleep. __GFP_NORETRY is to suppress the oom-killer from kicking in. */ +#ifndef CONFIG_PREEMPT_RT_FULL #define STP_ALLOC_SLEEP_FLAGS (GFP_KERNEL | __GFP_NORETRY) +#else +#define STP_ALLOC_SLEEP_FLAGS STP_ALLOC_FLAGS +#endif /* #define DEBUG_MEM */ /* @@ -40,7 +45,7 @@ static int _stp_allocated_net_memory = 0; static int _stp_allocated_memory = 0; #ifdef DEBUG_MEM -static DEFINE_SPINLOCK(_stp_mem_lock); +static STP_DEFINE_SPINLOCK(_stp_mem_lock); #define MEM_MAGIC 0xc11cf77f #define MEM_FENCE_SIZE 32 @@ -108,9 +113,9 @@ static void *_stp_mem_debug_setup(void *addr, size_t size, enum _stp_memtype typ m->type = type; m->len = size; m->addr = addr; - spin_lock(&_stp_mem_lock); + stp_spin_lock(&_stp_mem_lock); list_add(p, &_stp_mem_list); - spin_unlock(&_stp_mem_lock); + stp_spin_unlock(&_stp_mem_lock); return addr; } @@ -122,9 +127,9 @@ static void _stp_mem_debug_percpu(struct _stp_mem_entry *m, void *addr, size_t s m->type = MEM_PERCPU; m->len = size; m->addr = addr; - spin_lock(&_stp_mem_lock); + stp_spin_lock(&_stp_mem_lock); list_add(p, &_stp_mem_list); - spin_unlock(&_stp_mem_lock); + stp_spin_unlock(&_stp_mem_lock); } static void _stp_mem_debug_free(void *addr, enum _stp_memtype type) @@ -133,7 +138,7 @@ static void _stp_mem_debug_free(void *addr, enum _stp_memtype type) struct list_head *p, *tmp; struct _stp_mem_entry *m = NULL; - spin_lock(&_stp_mem_lock); + stp_spin_lock(&_stp_mem_lock); list_for_each_safe(p, tmp, &_stp_mem_list) { m = list_entry(p, struct _stp_mem_entry, list); if (m->addr == addr) { @@ -142,7 +147,7 @@ static void _stp_mem_debug_free(void *addr, enum _stp_memtype type) break; } } - spin_unlock(&_stp_mem_lock); + stp_spin_unlock(&_stp_mem_lock); if (!found) { printk("SYSTEMTAP ERROR: Free of unallocated memory %p type=%s\n", addr, _stp_malloc_types[type].free); @@ -184,7 +189,7 @@ static void _stp_mem_debug_validate(void *addr) struct list_head *p, *tmp; struct _stp_mem_entry *m = NULL; - spin_lock(&_stp_mem_lock); + stp_spin_lock(&_stp_mem_lock); list_for_each_safe(p, tmp, &_stp_mem_list) { m = list_entry(p, struct _stp_mem_entry, list); if (m->addr == addr) { @@ -192,7 +197,7 @@ static void _stp_mem_debug_validate(void *addr) break; } } - spin_unlock(&_stp_mem_lock); + stp_spin_unlock(&_stp_mem_lock); if (!found) { printk("SYSTEMTAP ERROR: Couldn't validate memory %p\n", addr); @@ -551,7 +556,7 @@ static void _stp_mem_debug_done(void) struct list_head *p, *tmp; struct _stp_mem_entry *m; - spin_lock(&_stp_mem_lock); + stp_spin_lock(&_stp_mem_lock); list_for_each_safe(p, tmp, &_stp_mem_list) { m = list_entry(p, struct _stp_mem_entry, list); list_del(p); @@ -583,7 +588,7 @@ static void _stp_mem_debug_done(void) } } done: - spin_unlock(&_stp_mem_lock); + stp_spin_unlock(&_stp_mem_lock); return; -- 1.7.9.5