From: Simon Glass <simon.glass@canonical.com>
Add a Kconfig option to control whether full kmem_cache_free() and
kmem_cache_destroy() implementations are provided in lib/linux_compat.c
Most boards do not need these functions, so they can use simple inline
stubs in slab.h. Subsystems like ext4 that require proper cache
management can select CONFIG_LIB_KMEM_CACHE.
Co-developed-by: Claude <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---
include/linux/slab.h | 27 ++++++++++++++++-----------
lib/Kconfig | 8 ++++++++
lib/Makefile | 1 +
lib/kmem_cache.c | 20 ++++++++++++++++++++
4 files changed, 45 insertions(+), 11 deletions(-)
create mode 100644 lib/kmem_cache.c
@@ -84,24 +84,19 @@ static inline void *krealloc(const void *p, size_t new_size, gfp_t flags)
void *kmemdup(const void *src, size_t len, gfp_t gfp);
-/* kmem_cache stubs */
+/* kmem_cache implementation / stubs */
struct kmem_cache {
int sz;
};
struct kmem_cache *get_mem(int element_sz);
-#define kmem_cache_create(a, sz, c, d, e) ({ (void)(a); (void)(e); get_mem(sz); })
+#define kmem_cache_create(a, sz, c, d, e) get_mem(sz)
void *kmem_cache_alloc(struct kmem_cache *obj, gfp_t flag);
-static inline void *kmem_cache_zalloc(struct kmem_cache *obj, gfp_t flags)
-{
- void *ret = kmem_cache_alloc(obj, flags);
-
- if (ret)
- memset(ret, 0, obj->sz);
- return ret;
-}
-
+#if CONFIG_IS_ENABLED(LIB_KMEM_CACHE)
+void kmem_cache_free(struct kmem_cache *cachep, void *obj);
+void kmem_cache_destroy(struct kmem_cache *cachep);
+#else
static inline void kmem_cache_free(struct kmem_cache *cachep, void *obj)
{
free(obj);
@@ -111,5 +106,15 @@ static inline void kmem_cache_destroy(struct kmem_cache *cachep)
{
free(cachep);
}
+#endif
+
+static inline void *kmem_cache_zalloc(struct kmem_cache *obj, gfp_t flags)
+{
+ void *ret = kmem_cache_alloc(obj, flags);
+
+ if (ret)
+ memset(ret, 0, obj->sz);
+ return ret;
+}
#endif /* _LINUX_SLAB_H */
@@ -396,6 +396,14 @@ config TPL_TINY_MEMSET
config RBTREE
bool
+config LIB_KMEM_CACHE
+ bool "Enable full kmem_cache implementation"
+ help
+ Provide a proper kmem_cache implementation in lib/linux_compat.c
+ that tracks allocated objects. This is needed by subsystems like
+ ext4 that require cache management. When disabled, simple inline
+ stubs are used instead.
+
config BITREVERSE
bool "Bit reverse library from Linux"
@@ -135,6 +135,7 @@ obj-$(CONFIG_$(PHASE_)OF_LIBFDT) += fdtdec.o fdtdec_common.o fdt_print.o
obj-y += hang.o
obj-y += linux_compat.o
obj-y += linux_string.o
+obj-$(CONFIG_$(PHASE_)LIB_KMEM_CACHE) += kmem_cache.o
obj-$(CONFIG_$(PHASE_)LMB) += lmb.o
obj-y += membuf.o
obj-$(CONFIG_REGEX) += slre.o
new file mode 100644
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * kmem_cache implementation for U-Boot
+ *
+ * Copyright 2025 Canonical Ltd
+ * Written by Simon Glass <simon.glass@canonical.com>
+ */
+
+#include <malloc.h>
+#include <linux/slab.h>
+
+void kmem_cache_free(struct kmem_cache *cachep, void *obj)
+{
+ free(obj);
+}
+
+void kmem_cache_destroy(struct kmem_cache *cachep)
+{
+ free(cachep);
+}