use std::sync::Arc;
use rdma_io_sys::ibverbs::*;
use crate::pd::ProtectionDomain;
bitflags::bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct AccessFlags: u32 {
const LOCAL_WRITE = IBV_ACCESS_LOCAL_WRITE;
const REMOTE_WRITE = IBV_ACCESS_REMOTE_WRITE;
const REMOTE_READ = IBV_ACCESS_REMOTE_READ;
const REMOTE_ATOMIC = IBV_ACCESS_REMOTE_ATOMIC;
const MW_BIND = IBV_ACCESS_MW_BIND;
const ZERO_BASED = IBV_ACCESS_ZERO_BASED;
const ON_DEMAND = IBV_ACCESS_ON_DEMAND;
const HUGETLB = IBV_ACCESS_HUGETLB;
const RELAXED_ORDERING = IBV_ACCESS_RELAXED_ORDERING;
}
}
pub struct MemoryRegion<'a> {
pub(crate) inner: *mut ibv_mr,
pub(crate) _pd: Arc<ProtectionDomain>,
pub(crate) _lifetime: std::marker::PhantomData<&'a mut [u8]>,
}
unsafe impl Send for MemoryRegion<'_> {}
unsafe impl Sync for MemoryRegion<'_> {}
impl Drop for MemoryRegion<'_> {
fn drop(&mut self) {
let ret = unsafe { ibv_dereg_mr(self.inner) };
if ret != 0 {
tracing::error!(
"ibv_dereg_mr failed: {}",
std::io::Error::from_raw_os_error(-ret)
);
}
}
}
impl MemoryRegion<'_> {
pub fn lkey(&self) -> u32 {
unsafe { (*self.inner).lkey }
}
pub fn rkey(&self) -> u32 {
unsafe { (*self.inner).rkey }
}
pub fn addr(&self) -> *mut u8 {
unsafe { (*self.inner).addr.cast() }
}
pub fn length(&self) -> usize {
unsafe { (*self.inner).length as usize }
}
pub fn as_raw(&self) -> *mut ibv_mr {
self.inner
}
}
pub struct OwnedMemoryRegion {
pub(crate) inner: *mut ibv_mr,
pub(crate) _pd: Arc<ProtectionDomain>,
pub(crate) _buf: Box<[u8]>,
}
unsafe impl Send for OwnedMemoryRegion {}
unsafe impl Sync for OwnedMemoryRegion {}
impl Drop for OwnedMemoryRegion {
fn drop(&mut self) {
let ret = unsafe { ibv_dereg_mr(self.inner) };
if ret != 0 {
tracing::error!(
"ibv_dereg_mr failed: {}",
std::io::Error::from_raw_os_error(-ret)
);
}
}
}
impl OwnedMemoryRegion {
pub fn lkey(&self) -> u32 {
unsafe { (*self.inner).lkey }
}
pub fn rkey(&self) -> u32 {
unsafe { (*self.inner).rkey }
}
pub fn addr(&self) -> u64 {
unsafe { (*self.inner).addr as u64 }
}
pub fn as_slice(&self) -> &[u8] {
&self._buf
}
pub fn as_mut_slice(&mut self) -> &mut [u8] {
&mut self._buf
}
pub fn as_raw(&self) -> *mut ibv_mr {
self.inner
}
pub fn to_remote(&self) -> RemoteMr {
RemoteMr {
addr: self.addr(),
rkey: self.rkey(),
len: self._buf.len() as u32,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct RemoteMr {
pub addr: u64,
pub rkey: u32,
pub len: u32,
}