| // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB |
| /* |
| * Copyright (c) 2018-2025 Advanced Micro Devices, Inc. All rights reserved. |
| */ |
| |
| #include <infiniband/driver.h> |
| #include <sys/mman.h> |
| |
| #include "ionic_memory.h" |
| |
| #define IONIC_ANON_MFLAGS (MAP_PRIVATE | MAP_ANONYMOUS) |
| #define IONIC_ANON_MPROT (PROT_READ | PROT_WRITE) |
| |
| #define IONIC_DEV_MFLAGS MAP_SHARED |
| #define IONIC_DEV_MPROT PROT_WRITE |
| |
| void *ionic_map_anon(size_t size) |
| { |
| void *ptr; |
| int rc; |
| |
| ptr = mmap(NULL, size, IONIC_ANON_MPROT, IONIC_ANON_MFLAGS, -1, 0); |
| if (ptr == MAP_FAILED) |
| return NULL; |
| |
| rc = ibv_dontfork_range(ptr, size); |
| if (rc) { |
| munmap(ptr, size); |
| errno = rc; |
| return NULL; |
| } |
| |
| return ptr; |
| } |
| |
| void *ionic_map_device(size_t size, int fd, size_t offset) |
| { |
| void *ptr; |
| int rc; |
| |
| ptr = mmap(NULL, size, IONIC_DEV_MPROT, IONIC_DEV_MFLAGS, fd, offset); |
| if (ptr == MAP_FAILED) |
| return NULL; |
| |
| rc = ibv_dontfork_range(ptr, size); |
| if (rc) { |
| munmap(ptr, size); |
| errno = rc; |
| return NULL; |
| } |
| |
| return ptr; |
| } |
| |
| void ionic_unmap(void *ptr, size_t size) |
| { |
| if (ptr) { |
| ibv_dofork_range(ptr, size); |
| munmap(ptr, size); |
| } |
| } |