Merge 2910019b04 ("mm: vmalloc: support more granular vrealloc() sizing") into android16-6.12-lts

Steps on the way to 6.12.29

Resolves merge conflicts in:
	include/linux/vmalloc.h

Change-Id: Ica36e90a307938acc299f119b130062911ad2326
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman
2025-06-03 06:24:29 +00:00
2 changed files with 25 additions and 7 deletions

View File

@@ -62,6 +62,7 @@ struct vm_struct {
unsigned int nr_pages;
phys_addr_t phys_addr;
const void *caller;
unsigned long requested_size;
ANDROID_OEM_DATA(1);
};

View File

@@ -1944,7 +1944,7 @@ static inline void setup_vmalloc_vm(struct vm_struct *vm,
{
vm->flags = flags;
vm->addr = (void *)va->va_start;
vm->size = va_size(va);
vm->size = vm->requested_size = va_size(va);
vm->caller = caller;
va->vm = vm;
trace_android_vh_save_vmalloc_stack(flags, vm);
@@ -3133,6 +3133,7 @@ struct vm_struct *__get_vm_area_node(unsigned long size,
area->flags = flags;
area->caller = caller;
area->requested_size = requested_size;
va = alloc_vmap_area(size, align, start, end, node, gfp_mask, 0, area);
if (IS_ERR(va)) {
@@ -4083,6 +4084,8 @@ EXPORT_SYMBOL(vzalloc_node_noprof);
*/
void *vrealloc_noprof(const void *p, size_t size, gfp_t flags)
{
struct vm_struct *vm = NULL;
size_t alloced_size = 0;
size_t old_size = 0;
void *n;
@@ -4092,15 +4095,17 @@ void *vrealloc_noprof(const void *p, size_t size, gfp_t flags)
}
if (p) {
struct vm_struct *vm;
vm = find_vm_area(p);
if (unlikely(!vm)) {
WARN(1, "Trying to vrealloc() nonexistent vm area (%p)\n", p);
return NULL;
}
old_size = get_vm_area_size(vm);
alloced_size = get_vm_area_size(vm);
old_size = vm->requested_size;
if (WARN(alloced_size < old_size,
"vrealloc() has mismatched area vs requested sizes (%p)\n", p))
return NULL;
}
/*
@@ -4108,14 +4113,26 @@ void *vrealloc_noprof(const void *p, size_t size, gfp_t flags)
* would be a good heuristic for when to shrink the vm_area?
*/
if (size <= old_size) {
/* Zero out spare memory. */
if (want_init_on_alloc(flags))
/* Zero out "freed" memory. */
if (want_init_on_free())
memset((void *)p + size, 0, old_size - size);
vm->requested_size = size;
kasan_poison_vmalloc(p + size, old_size - size);
kasan_unpoison_vmalloc(p, size, KASAN_VMALLOC_PROT_NORMAL);
return (void *)p;
}
/*
* We already have the bytes available in the allocation; use them.
*/
if (size <= alloced_size) {
kasan_unpoison_vmalloc(p + old_size, size - old_size,
KASAN_VMALLOC_PROT_NORMAL);
/* Zero out "alloced" memory. */
if (want_init_on_alloc(flags))
memset((void *)p + old_size, 0, size - old_size);
vm->requested_size = size;
}
/* TODO: Grow the vm_area, i.e. allocate and map additional pages. */
n = __vmalloc_noprof(size, flags);
if (!n)