[ofa-general] Problem with libibverbs and huge pages registration.
Gleb Natapov
glebn at voltaire.com
Mon Apr 21 07:14:41 PDT 2008
Hi Roland,
ibv_reg_mr() fails if I try to register a memory region backed by a
huge page, but is not aligned to huge page boundary. Digging deeper I
see that libibverbs aligns memory region to a regular page size and
calls madvise() and the call fails. See program below to reproduce.
The program assumes that hugetlbfs is mounted on /huge and there is at
least one huge page available. I am not use it is possible to know if a
memory buffer is backed by huge page to solve the problem.
Another issue with libibverbs is that after first ibv_reg_mr() fails the
second registration attempt of the same buffer succeed since
ibv_madvise_range() doesn't cleanup after madvice failure and thinks
that memory is already "madvised".
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <infiniband/verbs.h>
int main()
{
int num_devs, fd;
struct ibv_device **ib_devs;
struct ibv_context *ctx;
struct ibv_pd *pd;
struct ibv_mr *mr;
char *ptr;
size_t len = 1024*1024;
ibv_fork_init();
ib_devs = ibv_get_device_list(&num_devs);
ctx = ibv_open_device(ib_devs[0]);
pd = ibv_alloc_pd(ctx);
fd = open("/huge/test", O_CREAT | O_RDWR);
remove("/huge/test");
ptr = mmap(0, 2*len, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
mr = ibv_reg_mr(pd, ptr, len, IBV_ACCESS_LOCAL_WRITE |
IBV_ACCESS_REMOTE_WRITE |
IBV_ACCESS_REMOTE_READ);
fprintf(stderr, "mr = %p\n", mr);
return 0;
}
--
Gleb.
More information about the general
mailing list