#include <linux/mm.h>
#include <linux/dma-mapping.h>
#include <linux/sched/signal.h>
#include <linux/sched/mm.h>
#include <linux/hugetlb.h>
#include <linux/iommu.h>
#include <linux/workqueue.h>
#include <linux/list.h>
#include <rdma/ib_verbs.h>
#include "usnic_log.h"
#include "usnic_uiom.h"
#include "usnic_uiom_interval_tree.h"
#define USNIC_UIOM_PAGE_CHUNK …
static int usnic_uiom_dma_fault(struct iommu_domain *domain,
struct device *dev,
unsigned long iova, int flags,
void *token)
{ … }
static void usnic_uiom_put_pages(struct list_head *chunk_list, int dirty)
{ … }
static int usnic_uiom_get_pages(unsigned long addr, size_t size, int writable,
int dmasync, struct usnic_uiom_reg *uiomr)
{ … }
static void usnic_uiom_unmap_sorted_intervals(struct list_head *intervals,
struct usnic_uiom_pd *pd)
{ … }
static void __usnic_uiom_reg_release(struct usnic_uiom_pd *pd,
struct usnic_uiom_reg *uiomr,
int dirty)
{ … }
static int usnic_uiom_map_sorted_intervals(struct list_head *intervals,
struct usnic_uiom_reg *uiomr)
{ … }
struct usnic_uiom_reg *usnic_uiom_reg_get(struct usnic_uiom_pd *pd,
unsigned long addr, size_t size,
int writable, int dmasync)
{ … }
static void __usnic_uiom_release_tail(struct usnic_uiom_reg *uiomr)
{ … }
static inline size_t usnic_uiom_num_pages(struct usnic_uiom_reg *uiomr)
{ … }
void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr)
{ … }
struct usnic_uiom_pd *usnic_uiom_alloc_pd(struct device *dev)
{ … }
void usnic_uiom_dealloc_pd(struct usnic_uiom_pd *pd)
{ … }
int usnic_uiom_attach_dev_to_pd(struct usnic_uiom_pd *pd, struct device *dev)
{ … }
void usnic_uiom_detach_dev_from_pd(struct usnic_uiom_pd *pd, struct device *dev)
{ … }
struct device **usnic_uiom_get_dev_list(struct usnic_uiom_pd *pd)
{ … }
void usnic_uiom_free_dev_list(struct device **devs)
{ … }