2009-02-24 18:30:29 +03:00
# 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 ) ;
2009-10-30 11:54:53 +03:00
int rds_get_mr_for_dest ( struct rds_sock * rs , char __user * optval , int optlen ) ;
2009-02-24 18:30:29 +03:00
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