Skip to content

Instantly share code, notes, and snippets.

@agentzh
Created October 29, 2020 08:28
Show Gist options
  • Save agentzh/3ebde2612b260eb40afd4992954ecd4d to your computer and use it in GitHub Desktop.
Save agentzh/3ebde2612b260eb40afd4992954ecd4d to your computer and use it in GitHub Desktop.
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