diff options
author | Andy Grover <andy.grover@oracle.com> | 2009-02-24 10:30:29 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-02-27 02:39:29 -0500 |
commit | eff5f53bef75c0864a5da06bb688939092b848dc (patch) | |
tree | 116790e2c93ba3adbbce52704810569cd5517492 /net/rds/rdma.h | |
parent | bdbe6fbc6a2f2ccfb384b141b257677d2a8d36fb (diff) |
RDS: RDMA support
Some transports may support RDMA features. This handles the
non-transport-specific parts, like pinning user pages and
tracking mapped regions.
Signed-off-by: Andy Grover <andy.grover@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rds/rdma.h')
-rw-r--r-- | net/rds/rdma.h | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/net/rds/rdma.h b/net/rds/rdma.h new file mode 100644 index 000000000000..425512098b0b --- /dev/null +++ b/net/rds/rdma.h | |||
@@ -0,0 +1,84 @@ | |||
1 | #ifndef _RDS_RDMA_H | ||
2 | #define _RDS_RDMA_H | ||
3 | |||
4 | #include <linux/rbtree.h> | ||
5 | #include <linux/spinlock.h> | ||
6 | #include <linux/scatterlist.h> | ||
7 | |||
8 | #include "rds.h" | ||
9 | |||
10 | struct rds_mr { | ||
11 | struct rb_node r_rb_node; | ||
12 | atomic_t r_refcount; | ||
13 | u32 r_key; | ||
14 | |||
15 | /* A copy of the creation flags */ | ||
16 | unsigned int r_use_once:1; | ||
17 | unsigned int r_invalidate:1; | ||
18 | unsigned int r_write:1; | ||
19 | |||
20 | /* This is for RDS_MR_DEAD. | ||
21 | * It would be nice & consistent to make this part of the above | ||
22 | * bit field here, but we need to use test_and_set_bit. | ||
23 | */ | ||
24 | unsigned long r_state; | ||
25 | struct rds_sock *r_sock; /* back pointer to the socket that owns us */ | ||
26 | struct rds_transport *r_trans; | ||
27 | void *r_trans_private; | ||
28 | }; | ||
29 | |||
30 | /* Flags for mr->r_state */ | ||
31 | #define RDS_MR_DEAD 0 | ||
32 | |||
33 | struct rds_rdma_op { | ||
34 | u32 r_key; | ||
35 | u64 r_remote_addr; | ||
36 | unsigned int r_write:1; | ||
37 | unsigned int r_fence:1; | ||
38 | unsigned int r_notify:1; | ||
39 | unsigned int r_recverr:1; | ||
40 | unsigned int r_mapped:1; | ||
41 | struct rds_notifier *r_notifier; | ||
42 | unsigned int r_bytes; | ||
43 | unsigned int r_nents; | ||
44 | unsigned int r_count; | ||
45 | struct scatterlist r_sg[0]; | ||
46 | }; | ||
47 | |||
48 | static inline rds_rdma_cookie_t rds_rdma_make_cookie(u32 r_key, u32 offset) | ||
49 | { | ||
50 | return r_key | (((u64) offset) << 32); | ||
51 | } | ||
52 | |||
53 | static inline u32 rds_rdma_cookie_key(rds_rdma_cookie_t cookie) | ||
54 | { | ||
55 | return cookie; | ||
56 | } | ||
57 | |||
58 | static inline u32 rds_rdma_cookie_offset(rds_rdma_cookie_t cookie) | ||
59 | { | ||
60 | return cookie >> 32; | ||
61 | } | ||
62 | |||
63 | int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen); | ||
64 | int rds_free_mr(struct rds_sock *rs, char __user *optval, int optlen); | ||
65 | void rds_rdma_drop_keys(struct rds_sock *rs); | ||
66 | int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm, | ||
67 | struct cmsghdr *cmsg); | ||
68 | int rds_cmsg_rdma_dest(struct rds_sock *rs, struct rds_message *rm, | ||
69 | struct cmsghdr *cmsg); | ||
70 | int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm, | ||
71 | struct cmsghdr *cmsg); | ||
72 | int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm, | ||
73 | struct cmsghdr *cmsg); | ||
74 | void rds_rdma_free_op(struct rds_rdma_op *ro); | ||
75 | void rds_rdma_send_complete(struct rds_message *rm, int); | ||
76 | |||
77 | extern void __rds_put_mr_final(struct rds_mr *mr); | ||
78 | static inline void rds_mr_put(struct rds_mr *mr) | ||
79 | { | ||
80 | if (atomic_dec_and_test(&mr->r_refcount)) | ||
81 | __rds_put_mr_final(mr); | ||
82 | } | ||
83 | |||
84 | #endif | ||