Whamcloud - gitweb
LU-14798 lnet: add LNet GPU Direct Support
[fs/lustre-release.git] / lnet / include / lnet / lnet_rdma.h
1 #ifndef LUSTRE_NVFS_H
2 #define LUSTRE_NVFS_H
3
4 #include <linux/types.h>
5 #include <linux/delay.h>
6 #include <linux/blkdev.h>
7 #include <linux/cpumask.h>
8 #include <linux/scatterlist.h>
9 #include <linux/percpu-defs.h>
10 #include <linux/dma-direction.h>
11 #include <linux/dma-mapping.h>
12
13 #define REGSTR2(x) x##_register_nvfs_dma_ops
14 #define REGSTR(x)  REGSTR2(x)
15
16 #define UNREGSTR2(x) x##_unregister_nvfs_dma_ops
17 #define UNREGSTR(x)  UNREGSTR2(x)
18
19 #define MODULE_PREFIX lustre_v1
20
21 #define REGISTER_FUNC REGSTR(MODULE_PREFIX)
22 #define UNREGISTER_FUNC UNREGSTR(MODULE_PREFIX)
23
24 #define NVFS_IO_ERR                     -1
25 #define NVFS_CPU_REQ                    -2
26
27 #define NVFS_HOLD_TIME_MS 1000
28
29 struct nvfs_dma_rw_ops {
30         unsigned long long ft_bmap; /* feature bitmap */
31
32         int (*nvfs_blk_rq_map_sg) (struct request_queue *q,
33                                    struct request *req,
34                                    struct scatterlist *sglist);
35
36         int (*nvfs_dma_map_sg_attrs) (struct device *device,
37                                       struct scatterlist *sglist,
38                                       int nents,
39                                       enum dma_data_direction dma_dir,
40                                       unsigned long attrs);
41
42         int (*nvfs_dma_unmap_sg)  (struct device *device,
43                                    struct scatterlist *sglist,
44                                    int nents,
45                                    enum dma_data_direction dma_dir);
46         bool (*nvfs_is_gpu_page) (struct page *);
47         unsigned int (*nvfs_gpu_index) (struct page *page);
48         unsigned int (*nvfs_device_priority) (struct device *dev, unsigned int dev_index);
49 };
50
51 /* feature list for dma_ops, values indicate bit pos */
52 enum ft_bits {
53         nvfs_ft_prep_sglist         = 1ULL << 0,
54         nvfs_ft_map_sglist          = 1ULL << 1,
55         nvfs_ft_is_gpu_page         = 1ULL << 2,
56         nvfs_ft_device_priority     = 1ULL << 3,
57 };
58
59 /* check features for use in registration with vendor drivers */
60 #define NVIDIA_FS_CHECK_FT_SGLIST_PREP(ops) \
61         ((ops)->ft_bmap & nvfs_ft_prep_sglist)
62 #define NVIDIA_FS_CHECK_FT_SGLIST_DMA(ops) \
63         ((ops)->ft_bmap & nvfs_ft_map_sglist)
64 #define NVIDIA_FS_CHECK_FT_GPU_PAGE(ops) \
65         ((ops)->ft_bmap & nvfs_ft_is_gpu_page)
66 #define NVIDIA_FS_CHECK_FT_DEVICE_PRIORITY(ops) \
67         ((ops)->ft_bmap & nvfs_ft_device_priority)
68
69 int REGISTER_FUNC (struct nvfs_dma_rw_ops *ops);
70
71 void UNREGISTER_FUNC (void);
72
73 unsigned int lnet_get_dev_prio(struct device *dev,
74                                unsigned int dev_idx);
75 int lnet_rdma_map_sg_attrs(struct device *dev, struct scatterlist *sg,
76                            int nents, enum dma_data_direction direction);
77 int lnet_rdma_unmap_sg(struct device *dev,
78                        struct scatterlist *sg, int nents,
79                        enum dma_data_direction direction);
80 bool lnet_is_rdma_only_page(struct page *page);
81 unsigned int lnet_get_dev_idx(struct page *page);
82
83 /* DMA_ATTR_NO_WARN was added to kernel v4.8-11962-ga9a62c9 */
84 #ifndef DMA_ATTR_NO_WARN
85 #define DMA_ATTR_NO_WARN 0
86 #endif
87
88 #endif /* LUSTRE_NVFS_H */
89