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:
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
31
mm/vmalloc.c
31
mm/vmalloc.c
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user