]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - sys/contrib/rdma/krping/krping.h
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / sys / contrib / rdma / krping / krping.h
1 /*
2  * $FreeBSD$
3  */
4 #include <contrib/rdma/ib_verbs.h>
5 #include <netinet/in.h>
6
7 /*
8  * Krping header stuffs...
9  */
10
11 struct krping_stats {
12         unsigned send_bytes;
13         unsigned send_msgs;
14         unsigned recv_bytes;
15         unsigned recv_msgs;
16         unsigned write_bytes;
17         unsigned write_msgs;
18         unsigned read_bytes;
19         unsigned read_msgs;
20 };
21
22
23 /*
24  * These states are used to signal events between the completion handler
25  * and the main client or server thread.
26  *
27  * Once CONNECTED, they cycle through RDMA_READ_ADV, RDMA_WRITE_ADV, 
28  * and RDMA_WRITE_COMPLETE for each ping.
29  */
30 enum test_state {
31         IDLE = 1,
32         CONNECT_REQUEST,
33         ADDR_RESOLVED,
34         ROUTE_RESOLVED,
35         CONNECTED,
36         RDMA_READ_ADV,
37         RDMA_READ_COMPLETE,
38         RDMA_WRITE_ADV,
39         RDMA_WRITE_COMPLETE,
40         ERROR
41 };
42
43 struct krping_rdma_info {
44         uint64_t buf;
45         uint32_t rkey;
46         uint32_t size;
47 };
48
49 /*
50  * Control block struct.
51  */
52 struct krping_cb {
53         int server;                     /* 0 iff client */
54         struct ib_cq *cq;
55         struct ib_pd *pd;
56         struct ib_qp *qp;
57         struct ib_mr *dma_mr;
58         int use_dmamr;
59
60         struct ib_recv_wr rq_wr;        /* recv work request record */
61         struct ib_sge recv_sgl;         /* recv single SGE */
62         struct krping_rdma_info recv_buf;/* malloc'd buffer */
63         struct ib_mr *recv_mr;
64
65         struct ib_send_wr sq_wr;        /* send work requrest record */
66         struct ib_sge send_sgl;
67         struct krping_rdma_info send_buf;/* single send buf */
68         struct ib_mr *send_mr;
69
70         struct ib_send_wr rdma_sq_wr;   /* rdma work request record */
71         struct ib_sge rdma_sgl;         /* rdma single SGE */
72         char *rdma_buf;                 /* used as rdma sink */
73         u64  rdma_addr;
74         struct ib_mr *rdma_mr;
75
76         uint32_t remote_rkey;           /* remote guys RKEY */
77         uint64_t remote_addr;           /* remote guys TO */
78         uint32_t remote_len;            /* remote guys LEN */
79
80         char *start_buf;                /* rdma read src */
81         u64  start_addr;
82         struct ib_mr *start_mr;
83
84         enum test_state state;          /* used for cond/signalling */
85         struct mtx lock;
86         struct krping_stats stats;
87
88         uint16_t port;                  /* dst port in NBO */
89         struct in_addr addr;            /* dst addr in NBO */
90         char *addr_str;                 /* dst addr string */
91         int verbose;                    /* verbose logging */
92         int count;                      /* ping count */
93         int size;                       /* ping data size */
94         int validate;                   /* validate ping data */
95
96         /* CM stuff */
97         struct rdma_cm_id *cm_id;       /* connection on client side,*/
98                                         /* listener on service side. */
99         struct rdma_cm_id *child_cm_id; /* connection on server side */
100         TAILQ_ENTRY(krping_cb) list;    
101         
102         int rlat;                       /* run read latency test */
103         int wlat;                       /* run write latency test */
104         int bw;                         /* run write bw test */
105         int duplex;                     /* run write bw full duplex test */
106         int poll;                       /* poll vs block in rlat */
107         int txdepth;
108 };
109
110 static __inline uint64_t
111 get_cycles(void)
112 {
113         u_int32_t low, high;
114         __asm __volatile("rdtsc" : "=a" (low), "=d" (high));
115         return (low | ((u_int64_t)high << 32)); 
116 }
117
118 #define htonll(x) htobe64((x))
119 #define ntohll(x) be64toh((x))
120
121 typedef uint64_t cycles_t;
122
123 extern struct mtx krping_mutex;
124 TAILQ_HEAD(krping_cb_list, krping_cb);
125 extern struct krping_cb_list krping_cbs;
126
127 int krping_doit(char *cmd);
128 void krping_init(void);