-
-
Save agentzh/3ebde2612b260eb40afd4992954ecd4d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
commit ee969f8efacad704c571e2631574181d9a69b3e9 | |
Author: Yichun Zhang (agentzh) <yichun@openresty.com> | |
Date: Thu Oct 29 00:14:23 2020 -0700 | |
alloc lock patch for DEBUG_MEM. | |
diff --git a/runtime/linux/alloc.c b/runtime/linux/alloc.c | |
index 6c32040e1..1425750f6 100644 | |
--- a/runtime/linux/alloc.c | |
+++ b/runtime/linux/alloc.c | |
@@ -107,6 +107,7 @@ static void *_stp_mem_debug_setup(void *addr, size_t size, enum _stp_memtype typ | |
{ | |
struct list_head *p; | |
struct _stp_mem_entry *m; | |
+ unsigned long flags; | |
memset(addr, 0x55, MEM_FENCE_SIZE); | |
addr += MEM_FENCE_SIZE; | |
memset(addr + size, 0x55, MEM_FENCE_SIZE); | |
@@ -116,9 +117,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); | |
+ spin_lock_irqsave(&_stp_mem_lock, flags); | |
list_add(p, &_stp_mem_list); | |
- spin_unlock(&_stp_mem_lock); | |
+ spin_unlock_irqrestore(&_stp_mem_lock, flags); | |
return addr; | |
} | |
@@ -126,13 +127,14 @@ static void *_stp_mem_debug_setup(void *addr, size_t size, enum _stp_memtype typ | |
static void _stp_mem_debug_percpu(struct _stp_mem_entry *m, void *addr, size_t size) | |
{ | |
struct list_head *p = (struct list_head *)m; | |
+ unsigned long flags; | |
m->magic = MEM_MAGIC; | |
m->type = MEM_PERCPU; | |
m->len = size; | |
m->addr = addr; | |
- spin_lock(&_stp_mem_lock); | |
+ spin_lock_irqsave(&_stp_mem_lock, flags); | |
list_add(p, &_stp_mem_list); | |
- spin_unlock(&_stp_mem_lock); | |
+ spin_unlock_irqrestore(&_stp_mem_lock, flags); | |
} | |
static void _stp_mem_debug_free(void *addr, enum _stp_memtype type) | |
@@ -140,8 +142,9 @@ static void _stp_mem_debug_free(void *addr, enum _stp_memtype type) | |
int found = 0; | |
struct list_head *p, *tmp; | |
struct _stp_mem_entry *m = NULL; | |
+ unsigned long flags; | |
- spin_lock(&_stp_mem_lock); | |
+ spin_lock_irqsave(&_stp_mem_lock, flags); | |
list_for_each_safe(p, tmp, &_stp_mem_list) { | |
m = list_entry(p, struct _stp_mem_entry, list); | |
if (m->addr == addr) { | |
@@ -150,7 +153,7 @@ static void _stp_mem_debug_free(void *addr, enum _stp_memtype type) | |
break; | |
} | |
} | |
- spin_unlock(&_stp_mem_lock); | |
+ spin_unlock_irqrestore(&_stp_mem_lock, flags); | |
if (!found) { | |
_stp_printk(KERN_ERR, "ERROR: Free of unallocated memory %p type=%s\n", | |
addr, _stp_malloc_types[type].free); | |
@@ -191,8 +194,9 @@ static void _stp_mem_debug_validate(void *addr) | |
int found = 0; | |
struct list_head *p, *tmp; | |
struct _stp_mem_entry *m = NULL; | |
+ unsigned long flags; | |
- spin_lock(&_stp_mem_lock); | |
+ spin_lock_irqsave(&_stp_mem_lock, flags); | |
list_for_each_safe(p, tmp, &_stp_mem_list) { | |
m = list_entry(p, struct _stp_mem_entry, list); | |
if (m->addr == addr) { | |
@@ -200,7 +204,7 @@ static void _stp_mem_debug_validate(void *addr) | |
break; | |
} | |
} | |
- spin_unlock(&_stp_mem_lock); | |
+ spin_unlock_irqrestore(&_stp_mem_lock, flags); | |
if (!found) { | |
_stp_printk(KERN_ERR, "ERROR: Couldn't validate memory %p\n", | |
addr); | |
@@ -578,8 +582,9 @@ static void _stp_mem_debug_done(void) | |
#ifdef DEBUG_MEM | |
struct list_head *p, *tmp; | |
struct _stp_mem_entry *m; | |
+ unsigned long flags; | |
- spin_lock(&_stp_mem_lock); | |
+ spin_lock_irqsave(&_stp_mem_lock, flags); | |
list_for_each_safe(p, tmp, &_stp_mem_list) { | |
m = list_entry(p, struct _stp_mem_entry, list); | |
list_del(p); | |
@@ -614,7 +619,7 @@ static void _stp_mem_debug_done(void) | |
} | |
} | |
done: | |
- spin_unlock(&_stp_mem_lock); | |
+ spin_unlock_irqrestore(&_stp_mem_lock, flags); | |
return; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment