#ifndef _RDS_RDMA_H #define _RDS_RDMA_H #include <linux/rbtree.h> #include <linux/spinlock.h> #include <linux/scatterlist.h> #include "rds.h" struct rds_mr { struct rb_node r_rb_node; atomic_t r_refcount; u32 r_key; /* A copy of the creation flags */ unsigned int r_use_once:1; unsigned int r_invalidate:1; unsigned int r_write:1; /* This is for RDS_MR_DEAD. * It would be nice & consistent to make this part of the above * bit field here, but we need to use test_and_set_bit. */ unsigned long r_state; struct rds_sock *r_sock; /* back pointer to the socket that owns us */ struct rds_transport *r_trans; void *r_trans_private; }; /* Flags for mr->r_state */ #define RDS_MR_DEAD 0 struct rds_rdma_op { u32 r_key; u64 r_remote_addr; unsigned int r_write:1; unsigned int r_fence:1; unsigned int r_notify:1; unsigned int r_recverr:1; unsigned int r_mapped:1; struct rds_notifier *r_notifier; unsigned int r_bytes; unsigned int r_nents; unsigned int r_count; struct scatterlist r_sg[0]; }; static inline rds_rdma_cookie_t rds_rdma_make_cookie(u32 r_key, u32 offset) { return r_key | (((u64) offset) << 32); } static inline u32 rds_rdma_cookie_key(rds_rdma_cookie_t cookie) { return cookie; } static inline u32 rds_rdma_cookie_offset(rds_rdma_cookie_t cookie) { return cookie >> 32; } int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen); int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen); int rds_free_mr(struct rds_sock *rs, char __user *optval, int optlen); void rds_rdma_drop_keys(struct rds_sock *rs); int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm, struct cmsghdr *cmsg); int rds_cmsg_rdma_dest(struct rds_sock *rs, struct rds_message *rm, struct cmsghdr *cmsg); int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm, struct cmsghdr *cmsg); int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm, struct cmsghdr *cmsg); void rds_rdma_free_op(struct rds_rdma_op *ro); void rds_rdma_send_complete(struct rds_message *rm, int); extern void __rds_put_mr_final(struct rds_mr *mr); static inline void rds_mr_put(struct rds_mr *mr) { if (atomic_dec_and_test(&mr->r_refcount)) __rds_put_mr_final(mr); } #endif