Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F143314451
D26215.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D26215.diff
View Options
Index: head/share/man/man9/malloc.9
===================================================================
--- head/share/man/man9/malloc.9
+++ head/share/man/man9/malloc.9
@@ -29,7 +29,7 @@
.\" $NetBSD: malloc.9,v 1.3 1996/11/11 00:05:11 lukem Exp $
.\" $FreeBSD$
.\"
-.Dd August 3, 2020
+.Dd August 28, 2020
.Dt MALLOC 9
.Os
.Sh NAME
@@ -55,6 +55,8 @@
.Fn realloc "void *addr" "size_t size" "struct malloc_type *type" "int flags"
.Ft void *
.Fn reallocf "void *addr" "size_t size" "struct malloc_type *type" "int flags"
+.Ft size_t
+.Fn malloc_usable_size "const void *addr"
.Fn MALLOC_DECLARE type
.In sys/param.h
.In sys/malloc.h
@@ -149,6 +151,13 @@
.Fn realloc
except that it
will free the passed pointer when the requested memory cannot be allocated.
+.Pp
+The
+.Fn malloc_usable_size
+function returns the usable size of the allocation pointed to by
+.Fa addr .
+The return value may be larger than the size that was requested during
+allocation.
.Pp
Unlike its standard C library counterpart
.Pq Xr malloc 3 ,
Index: head/sys/compat/linuxkpi/common/include/linux/slab.h
===================================================================
--- head/sys/compat/linuxkpi/common/include/linux/slab.h
+++ head/sys/compat/linuxkpi/common/include/linux/slab.h
@@ -154,6 +154,12 @@
free(__DECONST(void *, ptr), M_KMALLOC);
}
+static inline size_t
+ksize(const void *ptr)
+{
+ return (malloc_usable_size(ptr));
+}
+
extern struct linux_kmem_cache *linux_kmem_cache_create(const char *name,
size_t size, size_t align, unsigned flags, linux_kmem_ctor_t *ctor);
Index: head/sys/kern/kern_malloc.c
===================================================================
--- head/sys/kern/kern_malloc.c
+++ head/sys/kern/kern_malloc.c
@@ -938,6 +938,42 @@
return (mem);
}
+/*
+ * malloc_usable_size: returns the usable size of the allocation.
+ */
+size_t
+malloc_usable_size(const void *addr)
+{
+#ifndef DEBUG_REDZONE
+ uma_zone_t zone;
+ uma_slab_t slab;
+#endif
+ u_long size;
+
+ if (addr == NULL)
+ return (0);
+
+#ifdef DEBUG_MEMGUARD
+ if (is_memguard_addr(__DECONST(void *, addr)))
+ return (memguard_get_req_size(addr));
+#endif
+
+#ifdef DEBUG_REDZONE
+ size = redzone_get_size(__DECONST(void *, addr));
+#else
+ vtozoneslab((vm_offset_t)addr & (~UMA_SLAB_MASK), &zone, &slab);
+ if (slab == NULL)
+ panic("malloc_usable_size: address %p(%p) is not allocated.\n",
+ addr, (void *)((u_long)addr & (~UMA_SLAB_MASK)));
+
+ if (!malloc_large_slab(slab))
+ size = zone->uz_size;
+ else
+ size = malloc_large_size(slab);
+#endif
+ return (size);
+}
+
CTASSERT(VM_KMEM_SIZE_SCALE >= 1);
/*
Index: head/sys/sys/malloc.h
===================================================================
--- head/sys/sys/malloc.h
+++ head/sys/sys/malloc.h
@@ -244,6 +244,7 @@
void malloc_type_freed(struct malloc_type *type, unsigned long size);
void malloc_type_list(malloc_type_list_func_t *, void *);
void malloc_uninit(void *);
+size_t malloc_usable_size(const void *);
void *realloc(void *addr, size_t size, struct malloc_type *type, int flags)
__result_use_check __alloc_size(2);
void *reallocf(void *addr, size_t size, struct malloc_type *type, int flags)
Index: head/sys/vm/memguard.h
===================================================================
--- head/sys/vm/memguard.h
+++ head/sys/vm/memguard.h
@@ -43,6 +43,7 @@
void *memguard_alloc(unsigned long, int);
void *memguard_realloc(void *, unsigned long, struct malloc_type *, int);
void memguard_free(void *);
+unsigned long memguard_get_req_size(const void *);
int memguard_cmp_mtp(struct malloc_type *, unsigned long);
int memguard_cmp_zone(uma_zone_t);
int is_memguard_addr(void *);
@@ -52,6 +53,7 @@
#define memguard_alloc(size, flags) NULL
#define memguard_realloc(a, s, mtp, f) NULL
#define memguard_free(addr) do { } while (0)
+#define memguard_get_req_size(addr) 0
#define memguard_cmp_mtp(mtp, size) 0
#define memguard_cmp_zone(zone) 0
#define is_memguard_addr(addr) 0
Index: head/sys/vm/memguard.c
===================================================================
--- head/sys/vm/memguard.c
+++ head/sys/vm/memguard.c
@@ -504,3 +504,9 @@
*/
return (strcmp(zone->uz_name, vm_memguard_desc) == 0);
}
+
+unsigned long
+memguard_get_req_size(const void *addr)
+{
+ return (*v2sizep(trunc_page((uintptr_t)addr)));
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Jan 29, 7:29 PM (13 h, 19 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28089071
Default Alt Text
D26215.diff (4 KB)
Attached To
Mode
D26215: LinuxKPI: Add ksize() implementation
Attached
Detach File
Event Timeline
Log In to Comment