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 10struct 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 33struct 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 48static inline rds_rdma_cookie_t rds_rdma_make_cookie(u32 r_key, u32 offset) 49{ 50 return r_key | (((u64) offset) << 32); 51} 52 53static inline u32 rds_rdma_cookie_key(rds_rdma_cookie_t cookie) 54{ 55 return cookie; 56} 57 58static inline u32 rds_rdma_cookie_offset(rds_rdma_cookie_t cookie) 59{ 60 return cookie >> 32; 61} 62 63int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen); 64int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen); 65int rds_free_mr(struct rds_sock *rs, char __user *optval, int optlen); 66void rds_rdma_drop_keys(struct rds_sock *rs); 67int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm, 68 struct cmsghdr *cmsg); 69int rds_cmsg_rdma_dest(struct rds_sock *rs, struct rds_message *rm, 70 struct cmsghdr *cmsg); 71int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm, 72 struct cmsghdr *cmsg); 73int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm, 74 struct cmsghdr *cmsg); 75void rds_rdma_free_op(struct rds_rdma_op *ro); 76void rds_rdma_send_complete(struct rds_message *rm, int); 77 78extern void __rds_put_mr_final(struct rds_mr *mr); 79static inline void rds_mr_put(struct rds_mr *mr) 80{ 81 if (atomic_dec_and_test(&mr->r_refcount)) 82 __rds_put_mr_final(mr); 83} 84 85#endif 86