2025-08-10 01:34:16 +02:00

118 lines
3.3 KiB
C

#ifndef _RDMAINFO_H_
#define _RDMAINFO_H_
#ifdef BEEGFS_NVFS
#include "linux/uio.h"
#include <common/net/sock/RDMASocket.h>
#include <common/toolkit/Serialization.h>
#include <common/storage/Nvfs.h>
#define RDMA_MAX_DMA_COUNT 64
struct RdmaInfo
{
size_t sg_count;
size_t dma_count;
uint32_t tag;
uint64_t key;
struct ib_device *device;
void *pages;
struct scatterlist *sglist;
struct scatterlist *dmalist;
};
typedef struct RdmaInfo RdmaInfo;
static inline void RdmaInfo_serialize(SerializeCtx* ctx, RdmaInfo *rdmap)
{
int i = 0;
struct scatterlist *sgp;
if (rdmap != NULL)
{
Serialization_serializeUInt64(ctx, rdmap->dma_count);
if (rdmap->dma_count > 0)
{
Serialization_serializeUInt(ctx, rdmap->tag);
Serialization_serializeUInt64(ctx, rdmap->key);
for (i = 0, sgp = rdmap->dmalist; i < rdmap->dma_count; i++, sgp++)
{
Serialization_serializeUInt64(ctx, sg_dma_address(sgp));
Serialization_serializeUInt64(ctx, (uint64_t)sgp->length);
Serialization_serializeUInt64(ctx, (uint64_t)sgp->offset);
}
}
}
else
{
Serialization_serializeUInt64(ctx, 0ull);
}
}
bool RdmaInfo_acquireNVFS(void);
void RdmaInfo_releaseNVFS(void);
int RdmaInfo_detectNVFSRequest(DevicePriorityContext* dpctx,
const struct iov_iter *iter);
static inline int RdmaInfo_nvfsDevicePriority(struct ib_device* dev,
int gpuIndex);
RdmaInfo* RdmaInfo_mapRead(const struct iov_iter *iter, Socket *socket);
RdmaInfo* RdmaInfo_mapWrite(const struct iov_iter *iter, Socket *socket);
void RdmaInfo_unmapRead(RdmaInfo *rdmap);
void RdmaInfo_unmapWrite(RdmaInfo *rdmap);
#ifdef BEEGFS_DEBUG_RDMA
static inline void RdmaInfo_dumpIovIter(const struct iov_iter *iter)
{
int i = 0;
struct iov_iter iter_copy = *iter;
printk(KERN_ALERT "IOV_ITER : count=%ld", iov_iter_count(&iter_copy));
while (iov_iter_count(&iter_copy) > 0)
{
printk(KERN_INFO " %3d: %px %ld", i, iter_iov_addr(&iter_copy), iter_iov_len(&iter_copy));
iov_iter_advance(&iter_copy, iter_iov_len(&iter_copy));
}
}
static inline void RdmaInfo_dumpSgtable(const char *header,
struct scatterlist *sglist, size_t sg_count)
{
int i = 0;
struct scatterlist *sgp = NULL;
printk_fhgfs(KERN_INFO, "%-12s : (%ld entries)", header, sg_count);
for (i = 0, sgp = sglist; i < sg_count; i++, sgp++)
{
printk_fhgfs(KERN_INFO, " [%3d] = %016llx %d %d %d",
i,
sg_dma_address(sgp),
sg_dma_len(sgp),
sgp->length,
sgp->offset);
}
}
static inline void RdmaInfo_dumpRdmaInfo(RdmaInfo *rdmap)
{
if (rdmap != NULL)
{
printk_fhgfs(KERN_INFO, "RDMA :\n"
" NENTS = %ld\n"
" TAG = %x\n"
" KEY = %llx\n",
rdmap->dma_count, rdmap->tag, rdmap->key);
RdmaInfo_dumpSgtable("SGLIST", rdmap->sglist, rdmap->sg_count);
RdmaInfo_dumpSgtable("DMALIST", rdmap->dmalist, rdmap->dma_count);
}
}
#endif /* BEEGFS_DEBUG_RDMA */
int RdmaInfo_nvfsDevicePriority(struct ib_device* dev, int gpuIndex)
{
return nvfs_ops->nvfs_device_priority(dev->dma_device, gpuIndex);
}
#endif /* BEEGFS_NVFS */
#endif /* _RDMAINFO_H_ */