• Shuai Xue's avatar
    perf/core: Bail out early if the request AUX area is out of bound · 54aee5f1
    Shuai Xue authored
    When perf-record with a large AUX area, e.g 4GB, it fails with:
    
        #perf record -C 0 -m ,4G -e arm_spe_0// -- sleep 1
        failed to mmap with 12 (Cannot allocate memory)
    
    and it reveals a WARNING with __alloc_pages():
    
    	------------[ cut here ]------------
    	WARNING: CPU: 44 PID: 17573 at mm/page_alloc.c:5568 __alloc_pages+0x1ec/0x248
    	Call trace:
    	 __alloc_pages+0x1ec/0x248
    	 __kmalloc_large_node+0xc0/0x1f8
    	 __kmalloc_node+0x134/0x1e8
    	 rb_alloc_aux+0xe0/0x298
    	 perf_mmap+0x440/0x660
    	 mmap_region+0x308/0x8a8
    	 do_mmap+0x3c0/0x528
    	 vm_mmap_pgoff+0xf4/0x1b8
    	 ksys_mmap_pgoff+0x18c/0x218
    	 __arm64_sys_mmap+0x38/0x58
    	 invoke_syscall+0x50/0x128
    	 el0_svc_common.constprop.0+0x58/0x188
    	 do_el0_svc+0x34/0x50
    	 el0_svc+0x34/0x108
    	 el0t_64_sync_handler+0xb8/0xc0
    	 el0t_64_sync+0x1a4/0x1a8
    
    'rb->aux_pages' allocated by kcalloc() is a pointer array which is used to
    maintains AUX trace pages. The allocated page for this array is physically
    contiguous (and virtually contiguous) with an order of 0..MAX_ORDER. If the
    size of pointer array crosses the limitation set by MAX_ORDER, it reveals a
    WARNING.
    
    So bail out early with -ENOMEM if the request AUX area is out of bound,
    e.g.:
    
        #perf record -C 0 -m ,4G -e arm_spe_0// -- sleep 1
        failed to mmap with 12 (Cannot allocate memory)
    Signed-off-by: default avatarShuai Xue <xueshuai@linux.alibaba.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    54aee5f1
ring_buffer.c 23.2 KB