1 /*
2  * This file contains definitions imported from the OFED rds header rdma.h.
3  * Oracle elects to have and use the contents of rdma.h under and
4  * governed by the OpenIB.org BSD license.
5  */
6 
7 /*
8  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
9  */
10 
11 #ifndef _RDSV3_RDMA_H
12 #define	_RDSV3_RDMA_H
13 
14 #include <sys/rds.h>
15 #include <sys/uio.h>
16 
17 #include <sys/ib/clients/rdsv3/rdsv3.h>
18 
19 struct rdsv3_mr {
20 	/* for AVL tree */
21 	avl_node_t		r_rb_node;
22 	atomic_t		r_refcount;
23 	uint32_t		r_key;
24 
25 	/* A copy of the creation flags */
26 	unsigned int		r_use_once:1;
27 	unsigned int		r_invalidate:1;
28 	unsigned int		r_write:1;
29 
30 	/*
31 	 * This is for RDS_MR_DEAD.
32 	 * It would be nice & consistent to make this part of the above
33 	 * bit field here, but we need to use test_and_set_bit.
34 	 */
35 	unsigned long		r_state;
36 	/* back pointer to the socket that owns us */
37 	struct rdsv3_sock	*r_sock;
38 	struct rdsv3_transport	*r_trans;
39 	void			*r_trans_private;
40 };
41 
42 /* Flags for mr->r_state */
43 #define	RDSV3_MR_DEAD		0
44 
45 struct rdsv3_rdma_sg {
46 	ddi_umem_cookie_t umem_cookie;
47 	struct rds_iovec iovec;
48 	ibt_send_wr_t	swr;
49 	ibt_mi_hdl_t	mihdl;
50 	ibt_hca_hdl_t	hca_hdl;
51 };
52 
53 struct rdsv3_rdma_op {
54 	uint32_t		r_key;
55 	uint64_t		r_remote_addr;
56 	unsigned int		r_write:1;
57 	unsigned int		r_fence:1;
58 	unsigned int		r_notify:1;
59 	unsigned int		r_recverr:1;
60 	unsigned int		r_mapped:1;
61 	struct rdsv3_notifier	*r_notifier;
62 	unsigned int		r_bytes;
63 	unsigned int		r_nents;
64 	unsigned int		r_count;
65 	struct rdsv3_scatterlist  *r_sg;
66 	struct rdsv3_rdma_sg	r_rdma_sg[1];
67 };
68 
69 static inline rds_rdma_cookie_t
rdsv3_rdma_make_cookie(uint32_t r_key,uint32_t offset)70 rdsv3_rdma_make_cookie(uint32_t r_key, uint32_t offset)
71 {
72 	return (r_key | (((uint64_t)offset) << 32));
73 }
74 
75 static inline uint32_t
rdsv3_rdma_cookie_key(rds_rdma_cookie_t cookie)76 rdsv3_rdma_cookie_key(rds_rdma_cookie_t cookie)
77 {
78 	return ((uint32_t)cookie);
79 }
80 
81 static inline uint32_t
rdsv3_rdma_cookie_offset(rds_rdma_cookie_t cookie)82 rdsv3_rdma_cookie_offset(rds_rdma_cookie_t cookie)
83 {
84 	return (cookie >> 32);
85 }
86 
87 int rdsv3_get_mr(struct rdsv3_sock *rs, const void *optval, int optlen);
88 int rdsv3_get_mr_for_dest(struct rdsv3_sock *rs, const void *optval,
89     int optlen);
90 int rdsv3_free_mr(struct rdsv3_sock *rs, const void *optval, int optlen);
91 void rdsv3_rdma_drop_keys(struct rdsv3_sock *rs);
92 int rdsv3_cmsg_rdma_args(struct rdsv3_sock *rs, struct rdsv3_message *rm,
93     struct cmsghdr *cmsg);
94 int rdsv3_cmsg_rdma_dest(struct rdsv3_sock *rs, struct rdsv3_message *rm,
95     struct cmsghdr *cmsg);
96 int rdsv3_cmsg_rdma_map(struct rdsv3_sock *rs, struct rdsv3_message *rm,
97     struct cmsghdr *cmsg);
98 void rdsv3_rdma_free_op(struct rdsv3_rdma_op *ro);
99 void rdsv3_rdma_send_complete(struct rdsv3_message *rm, int);
100 
101 extern void __rdsv3_put_mr_final(struct rdsv3_mr *mr);
rdsv3_mr_put(struct rdsv3_mr * mr)102 static inline void rdsv3_mr_put(struct rdsv3_mr *mr)
103 {
104 	if (atomic_dec_and_test(&mr->r_refcount))
105 		__rdsv3_put_mr_final(mr);
106 }
107 
108 #endif /* _RDSV3_RDMA_H */
109