函数逻辑报告

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source Code:mm\memblock.c Create Date:2022-07-27 16:40:06
Last Modify:2020-03-12 14:18:49 Copyright©Brick
首页 函数Tree
注解内核,赢得工具下载SCCTEnglish

函数名称:memblock_double_array

函数原型:static int __attribute__((__section__(".meminit.text"))) __attribute__((__cold__)) __attribute__((__no_instrument_function__))memblock_double_array(struct memblock_type *type, phys_addr_t new_area_start, phys_addr_t new_area_size)

返回类型:int

参数:

类型参数名称
struct memblock_type *type
phys_addr_tnew_area_start
phys_addr_tnew_area_size
416  use_slab等于slab_is_available()
422  如果非memblock_can_resize则返回:负1
426  old_size等于maxsizeof(structmemblock_region)
427  new_size等于old_size左移1位
432  old_alloc_size等于 align the pointer to the (next) page boundary (old_size)
433  new_alloc_size等于 align the pointer to the (next) page boundary (new_size)
436  如果type恒等于memoryin_slab等于memblock_memory_in_slab
438  否则in_slab等于memblock_reserved_in_slab
442  如果use_slab
443  new_array等于kmalloc(new_size, GFP_KERNEL)
444  addr等于如果new_array__pa(new_array)否则0
445  否则
447  如果type不等于reservednew_area_start等于new_area_size等于0
450  addr等于memblock_find_in_range(new_area_start + new_area_size, current_limit, new_alloc_size, PAGE_SIZE)
453  如果非addrnew_area_sizeaddr等于memblock_find_in_range(0, 两数取小(new_area_start, current_limit), new_alloc_size, PAGE_SIZE)
458  new_array = addr ? __va(addr) : NULL
460  如果非addr
461  打印错误信息("memblock: Failed to double %s array from %ld to %ld entries !\n", name, max, max * 2)
463  返回:负1
466  new_end等于addrnew_size减1
475  内存复制(new_array, regions, old_size)
476  memset(new_array + max, 0, old_size)
477  old_array等于regions
478  regions等于new_array
479  max左移等于1位
482  如果in_slab释放内存
484  否则如果old_array不等于memblock_memory_init_regionsold_array不等于memblock_reserved_init_regionsmemblock_free(__pa(old_array), old_alloc_size)
492  如果非use_slabBUG_ON(memblock_reserve(addr, new_alloc_size))
496  in_slab等于use_slab
498  返回:0
调用者
名称描述
memblock_add_range
memblock_isolate_range