From 65b619e7b47c6a29db8ca1c297a8ebd9ee0b53ea Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Thu, 20 Jul 2023 14:59:02 +0200 Subject: [PATCH] dde_linux: implement kmem_cache_destroy Note, this enables more information on wifi-driver error recovery. Issue #5036 --- .../wireguard/spec/arm_64/generated_dummies.c | 8 ------- .../wireguard/spec/x86_64/generated_dummies.c | 8 ------- .../src/lib/lx_emul/shadow/mm/slub.c | 23 +++++++++++++++++-- .../framebuffer/intel/pc/generated_dummies.c | 8 ------- .../drivers/usb_host/pc/generated_dummies.c | 8 ------- repos/pc/src/lib/pc_wifi/generated_dummies.c | 8 ------- 6 files changed, 21 insertions(+), 42 deletions(-) diff --git a/repos/dde_linux/src/app/wireguard/spec/arm_64/generated_dummies.c b/repos/dde_linux/src/app/wireguard/spec/arm_64/generated_dummies.c index 5922fea9c0..6b25255f5b 100644 --- a/repos/dde_linux/src/app/wireguard/spec/arm_64/generated_dummies.c +++ b/repos/dde_linux/src/app/wireguard/spec/arm_64/generated_dummies.c @@ -457,14 +457,6 @@ void * kmem_cache_alloc_lru(struct kmem_cache * cachep,struct list_lru * lru,gfp } -#include - -void kmem_cache_destroy(struct kmem_cache * s) -{ - lx_emul_trace_and_stop(__func__); -} - - #include noinline int kstrtoint(const char * s,unsigned int base,int * res) diff --git a/repos/dde_linux/src/app/wireguard/spec/x86_64/generated_dummies.c b/repos/dde_linux/src/app/wireguard/spec/x86_64/generated_dummies.c index 4587562d15..87ab89cdbb 100644 --- a/repos/dde_linux/src/app/wireguard/spec/x86_64/generated_dummies.c +++ b/repos/dde_linux/src/app/wireguard/spec/x86_64/generated_dummies.c @@ -397,14 +397,6 @@ void * kmem_cache_alloc_lru(struct kmem_cache * cachep,struct list_lru * lru,gfp } -#include - -void kmem_cache_destroy(struct kmem_cache * s) -{ - lx_emul_trace_and_stop(__func__); -} - - #include noinline int kstrtoint(const char * s,unsigned int base,int * res) diff --git a/repos/dde_linux/src/lib/lx_emul/shadow/mm/slub.c b/repos/dde_linux/src/lib/lx_emul/shadow/mm/slub.c index 537a052fed..655ffacdf0 100644 --- a/repos/dde_linux/src/lib/lx_emul/shadow/mm/slub.c +++ b/repos/dde_linux/src/lib/lx_emul/shadow/mm/slub.c @@ -58,12 +58,31 @@ struct kmem_cache * kmem_cache_create(const char * name, { struct kmem_cache * cache = __kmalloc(sizeof(struct kmem_cache), GFP_KERNEL); - cache->size = size; - cache->align = align; + cache->size = size; + cache->align = align; + cache->refcount = 1; return cache; } +void kmem_cache_destroy(struct kmem_cache *cache) +{ + if (!cache) + return; + + if (!cache->refcount) { + printk("%s unexpected case - potential memory leak\n", __func__); + return; + } + + if (cache->refcount > 0) + cache->refcount --; + + if (!cache->refcount) + lx_emul_mem_free(cache); +} + + void kmem_cache_free(struct kmem_cache * s, void * x) { lx_emul_mem_free(x); diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/generated_dummies.c b/repos/pc/src/drivers/framebuffer/intel/pc/generated_dummies.c index 381aa07f95..a5f7394732 100644 --- a/repos/pc/src/drivers/framebuffer/intel/pc/generated_dummies.c +++ b/repos/pc/src/drivers/framebuffer/intel/pc/generated_dummies.c @@ -1562,14 +1562,6 @@ void kill_anon_super(struct super_block * sb) } -#include - -void kmem_cache_destroy(struct kmem_cache * s) -{ - lx_emul_trace_and_stop(__func__); -} - - #include void kmsg_dump(enum kmsg_dump_reason reason) diff --git a/repos/pc/src/drivers/usb_host/pc/generated_dummies.c b/repos/pc/src/drivers/usb_host/pc/generated_dummies.c index e608263549..422aae5bb4 100644 --- a/repos/pc/src/drivers/usb_host/pc/generated_dummies.c +++ b/repos/pc/src/drivers/usb_host/pc/generated_dummies.c @@ -271,14 +271,6 @@ void * kmem_cache_alloc_lru(struct kmem_cache * cachep,struct list_lru * lru,gfp } -#include - -void kmem_cache_destroy(struct kmem_cache * s) -{ - lx_emul_trace_and_stop(__func__); -} - - #include int kobject_synth_uevent(struct kobject * kobj,const char * buf,size_t count) diff --git a/repos/pc/src/lib/pc_wifi/generated_dummies.c b/repos/pc/src/lib/pc_wifi/generated_dummies.c index b9cbf72ea2..13d5b5f497 100644 --- a/repos/pc/src/lib/pc_wifi/generated_dummies.c +++ b/repos/pc/src/lib/pc_wifi/generated_dummies.c @@ -635,14 +635,6 @@ void kill_fasync(struct fasync_struct ** fp,int sig,int band) } -#include - -void kmem_cache_destroy(struct kmem_cache * s) -{ - lx_emul_trace_and_stop(__func__); -} - - #include void kmsg_dump(enum kmsg_dump_reason reason)