From 8d5f6a65d3ea02e10178b9fd72906a3c61228182 Mon Sep 17 00:00:00 2001 From: Karsten Keil Date: Fri, 21 Nov 2003 22:57:08 +0000 Subject: [PATCH] add memory resource debug main use is to find memory and buffer leaks at the moment --- add.config | 2 +- drivers/isdn/hardware/mISDN/Kconfig.v2.6 | 9 + drivers/isdn/hardware/mISDN/Makefile | 7 + drivers/isdn/hardware/mISDN/Makefile.v2.6 | 7 + drivers/isdn/hardware/mISDN/Rules.mISDN.v2.4 | 5 +- drivers/isdn/hardware/mISDN/bchannel.h | 2 +- drivers/isdn/hardware/mISDN/core.c | 8 + drivers/isdn/hardware/mISDN/core.h | 2 +- drivers/isdn/hardware/mISDN/dchannel.h | 2 +- drivers/isdn/hardware/mISDN/helper.h | 45 +++- drivers/isdn/hardware/mISDN/l3helper.c | 8 + drivers/isdn/hardware/mISDN/layer1.h | 2 +- drivers/isdn/hardware/mISDN/layer2.h | 2 +- drivers/isdn/hardware/mISDN/layer3.c | 2 +- drivers/isdn/hardware/mISDN/layer3.h | 2 +- drivers/isdn/hardware/mISDN/memdbg.c | 265 +++++++++++++++++++ drivers/isdn/hardware/mISDN/memdbg.h | 41 +++ km_mISDN.spec | 2 +- 18 files changed, 396 insertions(+), 17 deletions(-) create mode 100644 drivers/isdn/hardware/mISDN/memdbg.c create mode 100644 drivers/isdn/hardware/mISDN/memdbg.h diff --git a/add.config b/add.config index bc174f3..1808a77 100644 --- a/add.config +++ b/add.config @@ -7,4 +7,4 @@ CONFIG_MISDN_HFCPCI=y CONFIG_MISDN_SPEEDFAX=y CONFIG_MISDN_W6692=y CONFIG_MISDN_DSP=y - +CONFIG_MISDN_MEMDEBUG=y diff --git a/drivers/isdn/hardware/mISDN/Kconfig.v2.6 b/drivers/isdn/hardware/mISDN/Kconfig.v2.6 index 6206361..4ef622f 100644 --- a/drivers/isdn/hardware/mISDN/Kconfig.v2.6 +++ b/drivers/isdn/hardware/mISDN/Kconfig.v2.6 @@ -13,6 +13,15 @@ config MISDN_DRV if MISDN_DRV!=n +config MISDN_MEMDEBUG + bool "Enable memory leak debug for mISDN" + help + This option is for watching the use of several resources in mISDN. + It includes extra code to maintain list of allocated memory and + sk_buffs. On module unload you can see not freed resources an + their allocation orging and some object specific informations. + If unsure, say 'N'. + config MISDN_AVM_FRITZ bool "Support for AVM Fritz!Cards" depends on PCI || ISA diff --git a/drivers/isdn/hardware/mISDN/Makefile b/drivers/isdn/hardware/mISDN/Makefile index 46fa1bd..4126da5 100644 --- a/drivers/isdn/hardware/mISDN/Makefile +++ b/drivers/isdn/hardware/mISDN/Makefile @@ -3,6 +3,10 @@ # EXTRA_CFLAGS += -S -g # +ifdef CONFIG_MISDN_MEMDEBUG + EXTRA_CFLAGS += -DMISDN_MEMDEBUG +endif + obj-$(CONFIG_MISDN_DRV) += mISDN_core.o obj-$(CONFIG_MISDN_DRV) += mISDN_isac.o obj-$(CONFIG_MISDN_DRV) += mISDN_l1.o @@ -43,6 +47,9 @@ hfcpci-objs := hfc_pci.o debug.o helper.o dchannel.o bchannel.o w6692pci-objs := w6692.o debug.o helper.o dchannel.o bchannel.o mISDN_isac-objs := isac.o arcofi.o debug.o mISDN_core-objs := core.o stack.o udevice.o helper.o +ifdef CONFIG_MISDN_MEMDEBUG +mISDN_core-objs += memdbg.o +endif mISDN_l1-objs := layer1.o helper.o debug.o fsm.o mISDN_l2-objs := layer2.o tei.o helper.o debug.o fsm.o l3udss1-objs := layer3.o helper.o l3helper.o debug.o fsm.o l3_udss1.o diff --git a/drivers/isdn/hardware/mISDN/Makefile.v2.6 b/drivers/isdn/hardware/mISDN/Makefile.v2.6 index 3d98082..a90f2b7 100644 --- a/drivers/isdn/hardware/mISDN/Makefile.v2.6 +++ b/drivers/isdn/hardware/mISDN/Makefile.v2.6 @@ -3,6 +3,10 @@ # EXTRA_CFLAGS += -S -g # +ifdef CONFIG_MISDN_MEMDEBUG + EXTRA_CFLAGS += -DMISDN_MEMDEBUG +endif + obj-$(CONFIG_MISDN_DRV) += mISDN_core.o obj-$(CONFIG_MISDN_DRV) += mISDN_isac.o obj-$(CONFIG_MISDN_DRV) += mISDN_l1.o @@ -43,6 +47,9 @@ hfcpci-objs := hfc_pci.o debug.o helper.o dchannel.o bchannel.o w6692pci-objs := w6692.o debug.o helper.o dchannel.o bchannel.o mISDN_isac-objs := isac.o arcofi.o debug.o mISDN_core-objs := core.o stack.o udevice.o helper.o +ifdef CONFIG_MISDN_MEMDEBUG +mISDN_core-objs += memdbg.o +endif mISDN_l1-objs := layer1.o helper.o debug.o fsm.o mISDN_l2-objs := layer2.o tei.o helper.o debug.o fsm.o l3udss1-objs := layer3.o helper.o l3helper.o debug.o fsm.o l3_udss1.o diff --git a/drivers/isdn/hardware/mISDN/Rules.mISDN.v2.4 b/drivers/isdn/hardware/mISDN/Rules.mISDN.v2.4 index 6380f28..b404422 100755 --- a/drivers/isdn/hardware/mISDN/Rules.mISDN.v2.4 +++ b/drivers/isdn/hardware/mISDN/Rules.mISDN.v2.4 @@ -4,9 +4,8 @@ O_TARGET := vmlinux-obj.o -ifdef MEMDBG -EXTRA_CFLAGS += -DMEMDBG -MX_OBJS += memdbg.o +ifdef CONFIG_MISDN_MEMDEBUG + export-objs += memdbg.o endif export-objs := core.o isac.o diff --git a/drivers/isdn/hardware/mISDN/bchannel.h b/drivers/isdn/hardware/mISDN/bchannel.h index 3f9b8c1..3c2e66f 100644 --- a/drivers/isdn/hardware/mISDN/bchannel.h +++ b/drivers/isdn/hardware/mISDN/bchannel.h @@ -19,7 +19,7 @@ #include #include #include -#ifdef MEMDBG +#ifdef MISDN_MEMDEBUG #include "memdbg.h" #endif diff --git a/drivers/isdn/hardware/mISDN/core.c b/drivers/isdn/hardware/mISDN/core.c index a22c859..84fbabb 100644 --- a/drivers/isdn/hardware/mISDN/core.c +++ b/drivers/isdn/hardware/mISDN/core.c @@ -609,6 +609,11 @@ mISDNInit(void) printk(KERN_INFO "Modular ISDN Stack core %s\n", mISDN_core_revision); core_debug = debug; +#ifdef MISDN_MEMDEBUG + err = __mid_init(); + if (err) + return(err); +#endif err = init_mISDNdev(debug); if (err) return(err); @@ -652,6 +657,9 @@ void mISDN_cleanup(void) { down(&sem); mISDN_thread.notify = NULL; } +#ifdef MISDN_MEMDEBUG + __mid_cleanup(); +#endif printk(KERN_DEBUG "mISDNcore unloaded\n"); } diff --git a/drivers/isdn/hardware/mISDN/core.h b/drivers/isdn/hardware/mISDN/core.h index 75fdb19..869fc23 100644 --- a/drivers/isdn/hardware/mISDN/core.h +++ b/drivers/isdn/hardware/mISDN/core.h @@ -8,7 +8,7 @@ #include #include #include "helper.h" -#ifdef MEMDBG +#ifdef MISDN_MEMDEBUG #include "memdbg.h" #endif diff --git a/drivers/isdn/hardware/mISDN/dchannel.h b/drivers/isdn/hardware/mISDN/dchannel.h index 15050c7..6721e58 100644 --- a/drivers/isdn/hardware/mISDN/dchannel.h +++ b/drivers/isdn/hardware/mISDN/dchannel.h @@ -19,7 +19,7 @@ #include #include #include -#ifdef MEMDBG +#ifdef MISDN_MEMDEBUG #include "memdbg.h" #endif diff --git a/drivers/isdn/hardware/mISDN/helper.h b/drivers/isdn/hardware/mISDN/helper.h index 2fbc355..bf5dd30 100644 --- a/drivers/isdn/hardware/mISDN/helper.h +++ b/drivers/isdn/hardware/mISDN/helper.h @@ -8,7 +8,7 @@ #ifndef _mISDN_HELPER_H #define _mISDN_HELPER_H #include -#ifdef MEMDBG +#ifdef MISDN_MEMDEBUG #include "memdbg.h" #endif @@ -69,12 +69,22 @@ discard_queue(struct sk_buff_head *q) return(ret); } +#ifdef MISDN_MEMDEBUG +#define alloc_stack_skb(s, r) __mid_alloc_stack_skb(s, r, __FILE__, __LINE__) +static inline struct sk_buff * +__mid_alloc_stack_skb(size_t size, size_t reserve, char *fn, int line) +{ + struct sk_buff *skb; + + if (!(skb = __mid_alloc_skb(size + reserve, GFP_ATOMIC, fn, line))) +#else static inline struct sk_buff * alloc_stack_skb(size_t size, size_t reserve) { struct sk_buff *skb; if (!(skb = alloc_skb(size + reserve, GFP_ATOMIC))) +#endif printk(KERN_WARNING "%s(%d,%d): no skb size\n", __FUNCTION__, size, reserve); else @@ -119,13 +129,22 @@ extern __inline__ int if_newhead(mISDNif_t *i, u_int prim, int dinfo, return(i->func(i, skb)); } +#ifdef MISDN_MEMDEBUG +#define create_link_skb(p, d, l, a, r) __mid_create_link_skb(p, d, l, a, r, __FILE__, __LINE__) +extern __inline__ struct sk_buff * +__mid_create_link_skb(u_int prim, int dinfo, int len, void *arg, int reserve, char *fn, int line) +{ + struct sk_buff *skb; -extern __inline__ struct sk_buff *create_link_skb(u_int prim, int dinfo, - int len, void *arg, int reserve) + if (!(skb = __mid_alloc_skb(len + reserve, GFP_ATOMIC, fn, line))) { +#else +extern __inline__ struct sk_buff * +create_link_skb(u_int prim, int dinfo, int len, void *arg, int reserve) { struct sk_buff *skb; if (!(skb = alloc_skb(len + reserve, GFP_ATOMIC))) { +#endif printk(KERN_WARNING "%s: no skb size %d+%d\n", __FUNCTION__, len, reserve); return(NULL); @@ -137,13 +156,24 @@ extern __inline__ struct sk_buff *create_link_skb(u_int prim, int dinfo, return(skb); } -extern __inline__ int if_link(mISDNif_t *i, u_int prim, int dinfo, int len, - void *arg, int reserve) +#ifdef MISDN_MEMDEBUG +#define if_link(i, p, d, l, a, r) __mid_if_link(i, p, d, l, a, r, __FILE__, __LINE__) +extern __inline__ int +__mid_if_link(mISDNif_t *i, u_int prim, int dinfo, int len, void *arg, int reserve, char *fn, int line) +{ + struct sk_buff *skb; + int err; + + if (!(skb = __mid_create_link_skb(prim, dinfo, len, arg, reserve, fn, line))) +#else +extern __inline__ int +if_link(mISDNif_t *i, u_int prim, int dinfo, int len, void *arg, int reserve) { struct sk_buff *skb; int err; if (!(skb = create_link_skb(prim, dinfo, len, arg, reserve))) +#endif return(-ENOMEM); if (!i) err = -ENXIO; @@ -159,7 +189,12 @@ extern __inline__ int if_link(mISDNif_t *i, u_int prim, int dinfo, int len, extern signed int l3_ie2pos(u_char); extern unsigned char l3_pos2ie(int); extern void initQ931_info(Q931_info_t *); +#ifdef MISDN_MEMDEBUG +#define alloc_l3msg(a, b) __mid_alloc_l3msg(a, b, __FILE__, __LINE__) +extern struct sk_buff *__mid_alloc_l3msg(int, u_char, char *, int); +#else extern struct sk_buff *alloc_l3msg(int, u_char); +#endif extern void AddvarIE(struct sk_buff *, u_char *); extern void AddIE(struct sk_buff *, u_char, u_char *); extern void LogL3Msg(struct sk_buff *); diff --git a/drivers/isdn/hardware/mISDN/l3helper.c b/drivers/isdn/hardware/mISDN/l3helper.c index 25bb281..9648d70 100644 --- a/drivers/isdn/hardware/mISDN/l3helper.c +++ b/drivers/isdn/hardware/mISDN/l3helper.c @@ -52,12 +52,20 @@ initQ931_info(Q931_info_t *qi) { }; struct sk_buff * +#ifdef MISDN_MEMDEBUG +__mid_alloc_l3msg(int len, u_char type, char *fn, int line) +#else alloc_l3msg(int len, u_char type) +#endif { struct sk_buff *skb; Q931_info_t *qi; +#ifdef MISDN_MEMDEBUG + if (!(skb = __mid_alloc_skb(len + L3_EXTRA_SIZE +1, GFP_ATOMIC, fn, line))) { +#else if (!(skb = alloc_skb(len + L3_EXTRA_SIZE +1, GFP_ATOMIC))) { +#endif printk(KERN_WARNING "mISDN: No skb for L3\n"); return (NULL); } diff --git a/drivers/isdn/hardware/mISDN/layer1.h b/drivers/isdn/hardware/mISDN/layer1.h index e38e0da..2888173 100644 --- a/drivers/isdn/hardware/mISDN/layer1.h +++ b/drivers/isdn/hardware/mISDN/layer1.h @@ -8,7 +8,7 @@ #include #include "fsm.h" -#ifdef MEMDBG +#ifdef MISDN_MEMDEBUG #include "memdbg.h" #endif diff --git a/drivers/isdn/hardware/mISDN/layer2.h b/drivers/isdn/hardware/mISDN/layer2.h index 71007cf..062e18e 100644 --- a/drivers/isdn/hardware/mISDN/layer2.h +++ b/drivers/isdn/hardware/mISDN/layer2.h @@ -9,7 +9,7 @@ #include #include #include "fsm.h" -#ifdef MEMDBG +#ifdef MISDN_MEMDEBUG #include "memdbg.h" #endif diff --git a/drivers/isdn/hardware/mISDN/layer3.c b/drivers/isdn/hardware/mISDN/layer3.c index ca86ca7..e171edc 100644 --- a/drivers/isdn/hardware/mISDN/layer3.c +++ b/drivers/isdn/hardware/mISDN/layer3.c @@ -263,7 +263,7 @@ l3_process_t l3_process_t *new_l3_process(layer3_t *l3, int cr, int n303, u_int id) { - l3_process_t *p; + l3_process_t *p = NULL; if (id == MISDN_ID_ANY) { if (l3->entity == MISDN_ENTITY_NONE) { diff --git a/drivers/isdn/hardware/mISDN/layer3.h b/drivers/isdn/hardware/mISDN/layer3.h index 8d3926b..a7019b6 100644 --- a/drivers/isdn/hardware/mISDN/layer3.h +++ b/drivers/isdn/hardware/mISDN/layer3.h @@ -7,7 +7,7 @@ #include #include #include "fsm.h" -#ifdef MEMDBG +#ifdef MISDN_MEMDEBUG #include "memdbg.h" #endif diff --git a/drivers/isdn/hardware/mISDN/memdbg.c b/drivers/isdn/hardware/mISDN/memdbg.c new file mode 100644 index 0000000..994bbba --- /dev/null +++ b/drivers/isdn/hardware/mISDN/memdbg.c @@ -0,0 +1,265 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_KMOD +#include +#endif + +static struct list_head mISDN_memdbg_list = LIST_HEAD_INIT(mISDN_memdbg_list); +static struct list_head mISDN_skbdbg_list = LIST_HEAD_INIT(mISDN_skbdbg_list); +static kmem_cache_t *mid_sitem_cache; + +#define MAX_FILE_STRLEN (64 - 3*sizeof(u_int) - sizeof(struct list_head)) + +#define MID_ITEM_TYP_KMALLOC 1 +#define MID_ITEM_TYP_VMALLOC 2 + +typedef struct _mid_item { + struct list_head head; + u_int typ; + u_int size; + u_int line; + char file[MAX_FILE_STRLEN]; +} _mid_item_t; + +typedef struct _mid_sitem { + struct list_head head; + struct sk_buff *skb; + unsigned int size; + int line; + char file[MAX_FILE_STRLEN]; +} _mid_sitem_t; + +void * +__mid_kmalloc(size_t size, int ord, char *fn, int line) +{ + _mid_item_t *mid; + + mid = kmalloc(size + sizeof(_mid_item_t), ord); + if (mid) { + INIT_LIST_HEAD(&mid->head); + mid->typ = MID_ITEM_TYP_KMALLOC; + mid->size = size; + mid->line = line; + memcpy(mid->file, fn, MAX_FILE_STRLEN); + mid->file[MAX_FILE_STRLEN-1] = 0; + list_add_tail(&mid->head, &mISDN_memdbg_list); + return((void *)&mid->file[MAX_FILE_STRLEN]); + } else + return(NULL); +} + +void +__mid_kfree(const void *p) +{ + _mid_item_t *mid; + + if (!p) { + printk(KERN_ERR "zero pointer kfree at %p", __builtin_return_address(0)); + return; + } + mid = (_mid_item_t *)((u_char *)p - sizeof(_mid_item_t)); + list_del(&mid->head); + kfree(mid); +} + +void * +__mid_vmalloc(size_t size, char *fn, int line) +{ + _mid_item_t *mid; + + mid = vmalloc(size + sizeof(_mid_item_t)); + if (mid) { + INIT_LIST_HEAD(&mid->head); + mid->typ = MID_ITEM_TYP_VMALLOC; + mid->size = size; + mid->line = line; + memcpy(mid->file, fn, MAX_FILE_STRLEN); + mid->file[MAX_FILE_STRLEN-1] = 0; + list_add_tail(&mid->head, &mISDN_memdbg_list); + return((void *)&mid->file[MAX_FILE_STRLEN]); + } else + return(NULL); +} + +void +__mid_vfree(const void *p) +{ + _mid_item_t *mid; + + if (!p) { + printk(KERN_ERR "zero pointer vfree at %p", __builtin_return_address(0)); + return; + } + mid = (_mid_item_t *)((u_char *)p - sizeof(_mid_item_t)); + list_del(&mid->head); + vfree(mid); +} + +static void +__mid_skb_destructor(struct sk_buff *skb) +{ + struct list_head *item, *next; + _mid_sitem_t *sid; + + list_for_each_safe(item, next, &mISDN_skbdbg_list) { + sid = (_mid_sitem_t *)item; + if (sid->skb == skb) { + list_del(&sid->head); + kmem_cache_free(mid_sitem_cache, sid); + return; + } + } + printk(KERN_DEBUG "%s: item(%p) not in list\n", __FUNCTION__, skb); +} + +static __inline__ void +__mid_sitem_setup(struct sk_buff *skb, unsigned int size, char *fn, int line) +{ + _mid_sitem_t *sid; + + sid = kmem_cache_alloc(mid_sitem_cache, GFP_ATOMIC); + if (!sid) + return; + INIT_LIST_HEAD(&sid->head); + sid->skb = skb; + sid->size = size; + sid->line = line; + memcpy(sid->file, fn, MAX_FILE_STRLEN); + sid->file[MAX_FILE_STRLEN-1] = 0; + skb->destructor = __mid_skb_destructor; + list_add_tail(&sid->head, &mISDN_skbdbg_list); +} + +struct sk_buff * +__mid_alloc_skb(unsigned int size, int gfp_mask, char *fn, int line) +{ + struct sk_buff *skb = alloc_skb(size, gfp_mask); + + if (!skb) + return(NULL); + __mid_sitem_setup(skb, size, fn, line); + return(skb); +} + +struct sk_buff * +__mid_dev_alloc_skb(unsigned int size, char *fn, int line) +{ + struct sk_buff *skb = dev_alloc_skb(size); + + if (!skb) + return(NULL); + __mid_sitem_setup(skb, size, fn, line); + return(skb); +} + +struct sk_buff +*__mid_skb_clone(struct sk_buff *skb, int gfp_mask, char *fn, int line) +{ + struct sk_buff *nskb = skb_clone(skb, gfp_mask); + + if (!nskb) + return(NULL); + __mid_sitem_setup(nskb, (nskb->end - nskb->head), fn, line); + return(nskb); +} + +struct sk_buff +*__mid_skb_copy(struct sk_buff *skb, int gfp_mask, char *fn, int line) +{ + struct sk_buff *nskb = skb_copy(skb, gfp_mask); + + if (!nskb) + return(NULL); + __mid_sitem_setup(nskb, (nskb->end - nskb->head), fn, line); + return(nskb); +} + +struct sk_buff +*__mid_skb_realloc_headroom(struct sk_buff *skb, unsigned int headroom, char *fn, int line) +{ + struct sk_buff *nskb = skb_realloc_headroom(skb, headroom); + + if (!nskb || (nskb == skb)) + return(nskb); + __mid_sitem_setup(nskb, (nskb->end - nskb->head), fn, line); + return(nskb); +} + +void +__mid_cleanup(void) +{ + struct list_head *item, *next; + _mid_item_t *mid; + _mid_sitem_t *sid; + mISDN_head_t *hh; + int n = 0; + + list_for_each_safe(item, next, &mISDN_memdbg_list) { + mid = (_mid_item_t *)item; + switch(mid->typ) { + case MID_ITEM_TYP_KMALLOC: + printk(KERN_ERR "not freed kmalloc size(%d) from %s:%d\n", + mid->size, mid->file, mid->line); + kfree(mid); + break; + case MID_ITEM_TYP_VMALLOC: + printk(KERN_ERR "not freed vmalloc size(%d) from %s:%d\n", + mid->size, mid->file, mid->line); + vfree(mid); + break; + default: + printk(KERN_ERR "unknown mid->typ(%d) size(%d) from %s:%d\n", + mid->typ, mid->size, mid->file, mid->line); + break; + } + n++; + } + printk(KERN_DEBUG "%s: %d kmalloc item(s) freed\n", __FUNCTION__, n); + n = 0; + list_for_each_safe(item, next, &mISDN_skbdbg_list) { + sid = (_mid_sitem_t *)item; + hh = mISDN_HEAD_P(sid->skb); + printk(KERN_ERR "not freed skb(%p) size(%d) prim(%x) dinfo(%x) allocated at %s:%d\n", + sid->skb, sid->size, hh->prim, hh->dinfo, sid->file, sid->line); + /*maybe the skb is still aktiv */ + sid->skb->destructor = NULL; + list_del(&sid->head); + kmem_cache_free(mid_sitem_cache, sid); + n++; + } + + if (mid_sitem_cache) + kmem_cache_destroy(mid_sitem_cache); + printk(KERN_DEBUG "%s: %d sk_buff item(s) freed\n", __FUNCTION__, n); +} + +int +__mid_init(void) +{ + mid_sitem_cache = kmem_cache_create("mISDN_skbdbg", + sizeof(_mid_sitem_t), + 0, 0, NULL, NULL); + if (!mid_sitem_cache) + return(-ENOMEM); + return(0); +} + +#ifdef MODULE +EXPORT_SYMBOL(__mid_kmalloc); +EXPORT_SYMBOL(__mid_kfree); +EXPORT_SYMBOL(__mid_vmalloc); +EXPORT_SYMBOL(__mid_vfree); +EXPORT_SYMBOL(__mid_alloc_skb); +EXPORT_SYMBOL(__mid_dev_alloc_skb); +EXPORT_SYMBOL(__mid_skb_clone); +EXPORT_SYMBOL(__mid_skb_copy); +EXPORT_SYMBOL(__mid_skb_realloc_headroom); + +#endif + diff --git a/drivers/isdn/hardware/mISDN/memdbg.h b/drivers/isdn/hardware/mISDN/memdbg.h new file mode 100644 index 0000000..53ea83e --- /dev/null +++ b/drivers/isdn/hardware/mISDN/memdbg.h @@ -0,0 +1,41 @@ +#ifndef MEMDBG_H +#define MEMDBG_H + +#ifdef MISDN_MEMDEBUG +#include +#include + +#undef kmalloc +#undef kfree +#undef vmalloc +#undef vfree +#undef alloc_skb +#undef dev_alloc_skb +#undef skb_clone +#undef skb_copy +#undef skb_realloc_headroom + +#define kmalloc(a, b) __mid_kmalloc(a, b, __FILE__, __LINE__) +#define kfree(a) __mid_kfree(a) +#define vmalloc(s) __mid_vmalloc(s, __FILE__, __LINE__) +#define vfree(p) __mid_vfree(p) +#define alloc_skb(a, b) __mid_alloc_skb(a, b, __FILE__, __LINE__) +#define dev_alloc_skb(a) __mid_dev_alloc_skb(a, __FILE__, __LINE__) +#define skb_clone(a, b) __mid_skb_clone(a, b, __FILE__, __LINE__) +#define skb_copy(a, b) __mid_skb_copy(a, b, __FILE__, __LINE__) +#define skb_realloc_headroom(a, b) __mid_skb_realloc_headroom(a, b, __FILE__, __LINE__) + +extern void *__mid_kmalloc(size_t, int, char *, int); +extern void __mid_kfree(const void *); +extern void *__mid_vmalloc(size_t, char *, int); +extern void __mid_vfree(const void *); +extern void __mid_cleanup(void); +extern int __mid_init(void); +extern struct sk_buff *__mid_alloc_skb(unsigned int,int, char *, int); +extern struct sk_buff *__mid_dev_alloc_skb(unsigned int,char *, int); +extern struct sk_buff *__mid_skb_clone(struct sk_buff *, int, char *, int); +extern struct sk_buff *__mid_skb_copy(struct sk_buff *, int, char *, int); +extern struct sk_buff *__mid_skb_realloc_headroom(struct sk_buff *, unsigned int, char *, int); +#endif + +#endif diff --git a/km_mISDN.spec b/km_mISDN.spec index a17c319..75210fc 100644 --- a/km_mISDN.spec +++ b/km_mISDN.spec @@ -1,7 +1,7 @@ Vendor: SuSE GmbH, Nuernberg, Germany Distribution: SuSE Linux 8.2 (i386) Name: km_mISDN -Release: 8 +Release: 9 Packager: feedback@suse.de Copyright: Karsten Keil GPL