From 0893f6f03fee90f4e4303f881840e7e23c9646b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=9Alusarz?= Date: Wed, 10 Feb 2021 12:22:11 +0100 Subject: [PATCH] intel/tools/aub: print better error message when mmap fails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aubinator creates lots of 4k mappings, so for large traces it's possible to hit system limit on the number of mappings created by a single process. Ideally, aubinator should merge those mappings, but that's tricky and I'm not sure it's worth spending time on. Signed-off-by: Marcin Ĺšlusarz Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/tools/aub_mem.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/intel/tools/aub_mem.c b/src/intel/tools/aub_mem.c index 5dd1c618443..b4a0f3e418a 100644 --- a/src/intel/tools/aub_mem.c +++ b/src/intel/tools/aub_mem.c @@ -21,6 +21,7 @@ * IN THE SOFTWARE. */ +#include #include #include #include @@ -136,6 +137,23 @@ cmp_phys_mem(const struct rb_node *node, const void *addr) return cmp_uint64(mem->phys_addr, *(uint64_t *)addr); } +static void +check_mmap_result(const void *res) +{ + if (res != MAP_FAILED) + return; + + if (errno == ENOMEM) { + fprintf(stderr, + "Not enough memory available or maximum number of mappings reached. " + "Consider increasing sysctl vm.max_map_count.\n"); + } else { + perror("mmap"); + } + + abort(); +} + static struct phys_mem * ensure_phys_mem(struct aub_mem *mem, uint64_t phys_addr) { @@ -151,7 +169,7 @@ ensure_phys_mem(struct aub_mem *mem, uint64_t phys_addr) new_mem->data = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, mem->mem_fd, new_mem->fd_offset); - assert(new_mem->data != MAP_FAILED); + check_mmap_result(new_mem->data); rb_tree_insert_at(&mem->mem, node, &new_mem->node, cmp < 0); node = &new_mem->node; @@ -268,7 +286,7 @@ aub_mem_get_ggtt_bo(void *_mem, uint64_t address) bo.addr = MIN2(address, start->virt_addr); bo.size = last->virt_addr - bo.addr + 4096; bo.map = mmap(NULL, bo.size, PROT_READ, MAP_SHARED | MAP_ANONYMOUS, -1, 0); - assert(bo.map != MAP_FAILED); + check_mmap_result(bo.map); for (struct ggtt_entry *i = start; i; @@ -280,10 +298,9 @@ aub_mem_get_ggtt_bo(void *_mem, uint64_t address) continue; uint32_t map_offset = i->virt_addr - address; - ASSERTED void *res = - mmap((uint8_t *)bo.map + map_offset, 4096, PROT_READ, + void *res = mmap((uint8_t *)bo.map + map_offset, 4096, PROT_READ, MAP_SHARED | MAP_FIXED, mem->mem_fd, phys_mem->fd_offset); - assert(res != MAP_FAILED); + check_mmap_result(res); } add_gtt_bo_map(mem, bo, false, true); @@ -346,10 +363,9 @@ aub_mem_get_ppgtt_bo(void *_mem, uint64_t address) for (uint64_t page = address; page < end; page += 4096) { struct phys_mem *phys_mem = ppgtt_walk(mem, mem->pml4, page); - ASSERTED void *res = - mmap((uint8_t *)bo.map + (page - bo.addr), 4096, PROT_READ, + void *res = mmap((uint8_t *)bo.map + (page - bo.addr), 4096, PROT_READ, MAP_SHARED | MAP_FIXED, mem->mem_fd, phys_mem->fd_offset); - assert(res != MAP_FAILED); + check_mmap_result(res); } add_gtt_bo_map(mem, bo, true, true);