1c0dd49bdSEiji Ota /* 2*16e76cddSagiri * This file contains definitions used in OFED defined user/kernel 3*16e76cddSagiri * interfaces. These are imported from the OFED header <linux/rds.h>. Oracle 4*16e76cddSagiri * elects to have and use the contents of <linux/rds.h> under and governed 5*16e76cddSagiri * by the OpenIB.org BSD license (see below for full license text). However, 6*16e76cddSagiri * the following notice accompanied the original version of this file: 7*16e76cddSagiri */ 8*16e76cddSagiri /* 9c0dd49bdSEiji Ota * Copyright (c) 2008 Oracle. All rights reserved. 10c0dd49bdSEiji Ota * 11c0dd49bdSEiji Ota * This software is available to you under a choice of one of two 12c0dd49bdSEiji Ota * licenses. You may choose to be licensed under the terms of the GNU 13c0dd49bdSEiji Ota * General Public License (GPL) Version 2, available from the file 14c0dd49bdSEiji Ota * COPYING in the main directory of this source tree, or the 15c0dd49bdSEiji Ota * OpenIB.org BSD license below: 16c0dd49bdSEiji Ota * 17c0dd49bdSEiji Ota * Redistribution and use in source and binary forms, with or 18c0dd49bdSEiji Ota * without modification, are permitted provided that the following 19c0dd49bdSEiji Ota * conditions are met: 20c0dd49bdSEiji Ota * 21c0dd49bdSEiji Ota * - Redistributions of source code must retain the above 22c0dd49bdSEiji Ota * copyright notice, this list of conditions and the following 23c0dd49bdSEiji Ota * disclaimer. 24c0dd49bdSEiji Ota * 25c0dd49bdSEiji Ota * - Redistributions in binary form must reproduce the above 26c0dd49bdSEiji Ota * copyright notice, this list of conditions and the following 27c0dd49bdSEiji Ota * disclaimer in the documentation and/or other materials 28c0dd49bdSEiji Ota * provided with the distribution. 29c0dd49bdSEiji Ota * 30c0dd49bdSEiji Ota * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 31c0dd49bdSEiji Ota * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 32c0dd49bdSEiji Ota * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 33c0dd49bdSEiji Ota * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 34c0dd49bdSEiji Ota * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 35c0dd49bdSEiji Ota * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 36c0dd49bdSEiji Ota * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 37c0dd49bdSEiji Ota * SOFTWARE. 38c0dd49bdSEiji Ota * 39c0dd49bdSEiji Ota */ 40fe817b60SEiji Ota #ifndef _SYS_RDS_H 41fe817b60SEiji Ota #define _SYS_RDS_H 42c0dd49bdSEiji Ota 43c0dd49bdSEiji Ota #ifdef __cplusplus 44c0dd49bdSEiji Ota extern "C" { 45c0dd49bdSEiji Ota #endif 46c0dd49bdSEiji Ota 47fe817b60SEiji Ota #if !(defined(__SVR4) && defined(__sun)) 48fe817b60SEiji Ota #include <linux/types.h> 49fe817b60SEiji Ota #else 50fe817b60SEiji Ota #include <sys/types.h> 51fe817b60SEiji Ota #include <sys/socket.h> 52fe817b60SEiji Ota #endif 53fe817b60SEiji Ota 54fe817b60SEiji Ota /* 55fe817b60SEiji Ota * These sparse annotated types shouldn't be in any user 56fe817b60SEiji Ota * visible header file. We should clean this up rather 57fe817b60SEiji Ota * than kludging around them. 58fe817b60SEiji Ota */ 59fe817b60SEiji Ota #if !(defined(__SVR4) && defined(__sun)) 60fe817b60SEiji Ota #ifndef __KERNEL__ 61fe817b60SEiji Ota #define __be16 u_int16_t 62fe817b60SEiji Ota #define __be32 u_int32_t 63fe817b60SEiji Ota #define __be64 u_int64_t 64fe817b60SEiji Ota #endif 65fe817b60SEiji Ota #else 66fe817b60SEiji Ota #define u_int8_t uint8_t 67fe817b60SEiji Ota #define u_int16_t uint16_t 68fe817b60SEiji Ota #define u_int32_t uint32_t 69fe817b60SEiji Ota #define u_int64_t uint64_t 70fe817b60SEiji Ota #endif 71fe817b60SEiji Ota 72c0dd49bdSEiji Ota #define RDS_IB_ABI_VERSION 0x301 73c0dd49bdSEiji Ota 74c0dd49bdSEiji Ota #define AF_RDS AF_INET_OFFLOAD 75c0dd49bdSEiji Ota #define PF_RDS AF_INET_OFFLOAD 76c0dd49bdSEiji Ota #define SOL_RDS 272 77c0dd49bdSEiji Ota 78c0dd49bdSEiji Ota /* 79c0dd49bdSEiji Ota * setsockopt/getsockopt for SOL_RDS 80c0dd49bdSEiji Ota */ 81fe817b60SEiji Ota #define RDS_CANCEL_SENT_TO 1 82fe817b60SEiji Ota #define RDS_GET_MR 2 83fe817b60SEiji Ota #define RDS_FREE_MR 3 84c0dd49bdSEiji Ota /* deprecated: RDS_BARRIER 4 */ 85fe817b60SEiji Ota #define RDS_RECVERR 5 86fe817b60SEiji Ota #define RDS_CONG_MONITOR 6 87fe817b60SEiji Ota #define RDS_GET_MR_FOR_DEST 7 88fe817b60SEiji Ota 89c0dd49bdSEiji Ota 90c0dd49bdSEiji Ota /* 91c0dd49bdSEiji Ota * Control message types for SOL_RDS. 92c0dd49bdSEiji Ota * 93fe817b60SEiji Ota * CMSG_RDMA_ARGS (sendmsg) 94c0dd49bdSEiji Ota * Request a RDMA transfer to/from the specified 95c0dd49bdSEiji Ota * memory ranges. 96fe817b60SEiji Ota * The cmsg_data is a struct rds_rdma_args. 97c0dd49bdSEiji Ota * RDS_CMSG_RDMA_DEST (recvmsg, sendmsg) 98c0dd49bdSEiji Ota * Kernel informs application about intended 99c0dd49bdSEiji Ota * source/destination of a RDMA transfer 100c0dd49bdSEiji Ota * RDS_CMSG_RDMA_MAP (sendmsg) 101c0dd49bdSEiji Ota * Application asks kernel to map the given 102c0dd49bdSEiji Ota * memory range into a IB MR, and send the 103c0dd49bdSEiji Ota * R_Key along in an RDS extension header. 104fe817b60SEiji Ota * The cmsg_data is a struct rds_get_mr_args, 105c0dd49bdSEiji Ota * the same as for the GET_MR setsockopt. 106c0dd49bdSEiji Ota * RDS_CMSG_RDMA_STATUS (recvmsg) 107c0dd49bdSEiji Ota * Returns the status of a completed RDMA operation. 108c0dd49bdSEiji Ota */ 109fe817b60SEiji Ota #define RDS_CMSG_RDMA_ARGS 1 110fe817b60SEiji Ota #define RDS_CMSG_RDMA_DEST 2 111fe817b60SEiji Ota #define RDS_CMSG_RDMA_MAP 3 112fe817b60SEiji Ota #define RDS_CMSG_RDMA_STATUS 4 113fe817b60SEiji Ota #define RDS_CMSG_CONG_UPDATE 5 114c0dd49bdSEiji Ota 115fe817b60SEiji Ota #define RDS_INFO_FIRST 10000 116fe817b60SEiji Ota #define RDS_INFO_COUNTERS 10000 117fe817b60SEiji Ota #define RDS_INFO_CONNECTIONS 10001 118c0dd49bdSEiji Ota /* 10002 aka RDS_INFO_FLOWS is deprecated */ 119fe817b60SEiji Ota #define RDS_INFO_SEND_MESSAGES 10003 120fe817b60SEiji Ota #define RDS_INFO_RETRANS_MESSAGES 10004 121fe817b60SEiji Ota #define RDS_INFO_RECV_MESSAGES 10005 122fe817b60SEiji Ota #define RDS_INFO_SOCKETS 10006 123fe817b60SEiji Ota #define RDS_INFO_TCP_SOCKETS 10007 124fe817b60SEiji Ota #define RDS_INFO_IB_CONNECTIONS 10008 125fe817b60SEiji Ota #define RDS_INFO_CONNECTION_STATS 10009 126fe817b60SEiji Ota #define RDS_INFO_IWARP_CONNECTIONS 10010 127fe817b60SEiji Ota #define RDS_INFO_LAST 10010 128c0dd49bdSEiji Ota 129fe817b60SEiji Ota #if defined(__SVR4) && defined(__sun) 130b27516f5Sagiri struct rds_info_arg { 131b27516f5Sagiri uint64_t lenp; 132b27516f5Sagiri uint64_t datap; 133b27516f5Sagiri }; 134fe817b60SEiji Ota #endif 135b27516f5Sagiri 136c0dd49bdSEiji Ota #ifndef __lock_lint 137c0dd49bdSEiji Ota #pragma pack(1) 138fe817b60SEiji Ota struct rds_info_counter { 139fe817b60SEiji Ota u_int8_t name[32]; 140fe817b60SEiji Ota u_int64_t value; 141c0dd49bdSEiji Ota } __attribute__((packed)); 142c0dd49bdSEiji Ota #pragma pack() 143c0dd49bdSEiji Ota #else 144fe817b60SEiji Ota struct rds_info_counter { 145fe817b60SEiji Ota u_int8_t name[32]; 146fe817b60SEiji Ota u_int64_t value; 147c0dd49bdSEiji Ota }; 148c0dd49bdSEiji Ota #endif 149c0dd49bdSEiji Ota 150fe817b60SEiji Ota #define RDS_INFO_CONNECTION_FLAG_SENDING 0x01 151fe817b60SEiji Ota #define RDS_INFO_CONNECTION_FLAG_CONNECTING 0x02 152fe817b60SEiji Ota #define RDS_INFO_CONNECTION_FLAG_CONNECTED 0x04 153c0dd49bdSEiji Ota 154cadbfdc3SEiji Ota #define TRANSNAMSIZ 16 155cadbfdc3SEiji Ota 156c0dd49bdSEiji Ota #ifndef __lock_lint 157c0dd49bdSEiji Ota #pragma pack(1) 158fe817b60SEiji Ota struct rds_info_connection { 159fe817b60SEiji Ota u_int64_t next_tx_seq; 160fe817b60SEiji Ota u_int64_t next_rx_seq; 161fe817b60SEiji Ota u_int32_t laddr; 162fe817b60SEiji Ota u_int32_t faddr; 163fe817b60SEiji Ota u_int8_t transport[TRANSNAMSIZ]; /* null term ascii */ 164fe817b60SEiji Ota u_int8_t flags; 165c0dd49bdSEiji Ota } __attribute__((packed)); 166c0dd49bdSEiji Ota #pragma pack() 167c0dd49bdSEiji Ota #else 168fe817b60SEiji Ota struct rds_info_connection { 169fe817b60SEiji Ota u_int64_t next_tx_seq; 170fe817b60SEiji Ota u_int64_t next_rx_seq; 171fe817b60SEiji Ota u_int32_t laddr; 172fe817b60SEiji Ota u_int32_t faddr; 173fe817b60SEiji Ota u_int8_t transport[TRANSNAMSIZ]; /* null term ascii */ 174fe817b60SEiji Ota u_int8_t flags; 175c0dd49bdSEiji Ota }; 176c0dd49bdSEiji Ota #endif 177c0dd49bdSEiji Ota 178c0dd49bdSEiji Ota #ifndef __lock_lint 179c0dd49bdSEiji Ota #pragma pack(1) 180fe817b60SEiji Ota struct rds_info_flow { 181fe817b60SEiji Ota u_int32_t laddr; 182fe817b60SEiji Ota u_int32_t faddr; 183fe817b60SEiji Ota u_int32_t bytes; 184fe817b60SEiji Ota u_int16_t lport; 185fe817b60SEiji Ota u_int16_t fport; 186c0dd49bdSEiji Ota } __attribute__((packed)); 187c0dd49bdSEiji Ota #pragma pack() 188c0dd49bdSEiji Ota #else 189fe817b60SEiji Ota struct rds_info_flow { 190fe817b60SEiji Ota u_int32_t laddr; 191fe817b60SEiji Ota u_int32_t faddr; 192fe817b60SEiji Ota u_int32_t bytes; 193fe817b60SEiji Ota u_int16_t lport; 194fe817b60SEiji Ota u_int16_t fport; 195c0dd49bdSEiji Ota }; 196c0dd49bdSEiji Ota #endif 197c0dd49bdSEiji Ota 198fe817b60SEiji Ota #define RDS_INFO_MESSAGE_FLAG_ACK 0x01 199fe817b60SEiji Ota #define RDS_INFO_MESSAGE_FLAG_FAST_ACK 0x02 200c0dd49bdSEiji Ota 201c0dd49bdSEiji Ota #ifndef __lock_lint 202c0dd49bdSEiji Ota #pragma pack(1) 203fe817b60SEiji Ota struct rds_info_message { 204fe817b60SEiji Ota u_int64_t seq; 205fe817b60SEiji Ota u_int32_t len; 206fe817b60SEiji Ota u_int32_t laddr; 207fe817b60SEiji Ota u_int32_t faddr; 208fe817b60SEiji Ota u_int16_t lport; 209fe817b60SEiji Ota u_int16_t fport; 210fe817b60SEiji Ota u_int8_t flags; 211c0dd49bdSEiji Ota } __attribute__((packed)); 212c0dd49bdSEiji Ota #pragma pack() 213c0dd49bdSEiji Ota #else 214fe817b60SEiji Ota struct rds_info_message { 215fe817b60SEiji Ota u_int64_t seq; 216fe817b60SEiji Ota u_int32_t len; 217fe817b60SEiji Ota u_int32_t laddr; 218fe817b60SEiji Ota u_int32_t faddr; 219fe817b60SEiji Ota u_int16_t lport; 220fe817b60SEiji Ota u_int16_t fport; 221fe817b60SEiji Ota u_int8_t flags; 222c0dd49bdSEiji Ota }; 223c0dd49bdSEiji Ota #endif 224c0dd49bdSEiji Ota 225c0dd49bdSEiji Ota #ifndef __lock_lint 226c0dd49bdSEiji Ota #pragma pack(1) 227fe817b60SEiji Ota struct rds_info_socket { 228fe817b60SEiji Ota u_int32_t sndbuf; 229fe817b60SEiji Ota u_int32_t bound_addr; 230fe817b60SEiji Ota u_int32_t connected_addr; 231fe817b60SEiji Ota u_int16_t bound_port; 232fe817b60SEiji Ota u_int16_t connected_port; 233fe817b60SEiji Ota u_int32_t rcvbuf; 234fe817b60SEiji Ota u_int64_t inum; 235c0dd49bdSEiji Ota } __attribute__((packed)); 236c0dd49bdSEiji Ota #pragma pack() 237c0dd49bdSEiji Ota #else 238fe817b60SEiji Ota struct rds_info_socket { 239fe817b60SEiji Ota u_int32_t sndbuf; 240fe817b60SEiji Ota u_int32_t bound_addr; 241fe817b60SEiji Ota u_int32_t connected_addr; 242fe817b60SEiji Ota u_int16_t bound_port; 243fe817b60SEiji Ota u_int16_t connected_port; 244fe817b60SEiji Ota u_int32_t rcvbuf; 245fe817b60SEiji Ota u_int64_t inum; 246c0dd49bdSEiji Ota }; 247c0dd49bdSEiji Ota #endif 248c0dd49bdSEiji Ota 249c0dd49bdSEiji Ota #ifndef __lock_lint 250c0dd49bdSEiji Ota #pragma pack(1) 251fe817b60SEiji Ota struct rds_info_tcp_socket { 252fe817b60SEiji Ota u_int32_t local_addr; 253fe817b60SEiji Ota u_int16_t local_port; 254fe817b60SEiji Ota u_int32_t peer_addr; 255fe817b60SEiji Ota u_int16_t peer_port; 256fe817b60SEiji Ota u_int64_t hdr_rem; 257fe817b60SEiji Ota u_int64_t data_rem; 258fe817b60SEiji Ota u_int32_t last_sent_nxt; 259fe817b60SEiji Ota u_int32_t last_expected_una; 260fe817b60SEiji Ota u_int32_t last_seen_una; 261c0dd49bdSEiji Ota } __attribute__((packed)); 262c0dd49bdSEiji Ota #pragma pack() 263c0dd49bdSEiji Ota #else 264fe817b60SEiji Ota struct rds_info_tcp_socket { 265fe817b60SEiji Ota u_int32_t local_addr; 266fe817b60SEiji Ota u_int16_t local_port; 267fe817b60SEiji Ota u_int32_t peer_addr; 268fe817b60SEiji Ota u_int16_t peer_port; 269fe817b60SEiji Ota u_int64_t hdr_rem; 270fe817b60SEiji Ota u_int64_t data_rem; 271fe817b60SEiji Ota u_int32_t last_sent_nxt; 272fe817b60SEiji Ota u_int32_t last_expected_una; 273fe817b60SEiji Ota u_int32_t last_seen_una; 274fe817b60SEiji Ota } __attribute__((packed)); 275c0dd49bdSEiji Ota }; 276c0dd49bdSEiji Ota #endif 277c0dd49bdSEiji Ota 278c0dd49bdSEiji Ota #define RDS_IB_GID_LEN 16 279fe817b60SEiji Ota struct rds_info_rdma_connection { 280fe817b60SEiji Ota u_int32_t src_addr; 281fe817b60SEiji Ota u_int32_t dst_addr; 282c0dd49bdSEiji Ota uint8_t src_gid[RDS_IB_GID_LEN]; 283c0dd49bdSEiji Ota uint8_t dst_gid[RDS_IB_GID_LEN]; 284c0dd49bdSEiji Ota 285c0dd49bdSEiji Ota uint32_t max_send_wr; 286c0dd49bdSEiji Ota uint32_t max_recv_wr; 287c0dd49bdSEiji Ota uint32_t max_send_sge; 288c0dd49bdSEiji Ota uint32_t rdma_mr_max; 289c0dd49bdSEiji Ota uint32_t rdma_mr_size; 290c0dd49bdSEiji Ota }; 291c0dd49bdSEiji Ota 292cadbfdc3SEiji Ota /* 293cadbfdc3SEiji Ota * Congestion monitoring. 294cadbfdc3SEiji Ota * Congestion control in RDS happens at the host connection 295cadbfdc3SEiji Ota * level by exchanging a bitmap marking congested ports. 296cadbfdc3SEiji Ota * By default, a process sleeping in poll() is always woken 297cadbfdc3SEiji Ota * up when the congestion map is updated. 298cadbfdc3SEiji Ota * With explicit monitoring, an application can have more 299cadbfdc3SEiji Ota * fine-grained control. 300cadbfdc3SEiji Ota * The application installs a 64bit mask value in the socket, 301cadbfdc3SEiji Ota * where each bit corresponds to a group of ports. 302cadbfdc3SEiji Ota * When a congestion update arrives, RDS checks the set of 303cadbfdc3SEiji Ota * ports that are now uncongested against the list bit mask 304cadbfdc3SEiji Ota * installed in the socket, and if they overlap, we queue a 305cadbfdc3SEiji Ota * cong_notification on the socket. 306cadbfdc3SEiji Ota * 307cadbfdc3SEiji Ota * To install the congestion monitor bitmask, use RDS_CONG_MONITOR 308cadbfdc3SEiji Ota * with the 64bit mask. 309cadbfdc3SEiji Ota * Congestion updates are received via RDS_CMSG_CONG_UPDATE 310cadbfdc3SEiji Ota * control messages. 311cadbfdc3SEiji Ota * 312cadbfdc3SEiji Ota * The correspondence between bits and ports is 313cadbfdc3SEiji Ota * 1 << (portnum % 64) 314cadbfdc3SEiji Ota */ 315fe817b60SEiji Ota #define RDS_CONG_MONITOR_SIZE 64 316fe817b60SEiji Ota #define RDS_CONG_MONITOR_BIT(port) \ 317fe817b60SEiji Ota (((unsigned int) port) % RDS_CONG_MONITOR_SIZE) 318fe817b60SEiji Ota #define RDS_CONG_MONITOR_MASK(port) (1ULL << RDS_CONG_MONITOR_BIT(port)) 319cadbfdc3SEiji Ota 320cadbfdc3SEiji Ota /* 321cadbfdc3SEiji Ota * RDMA related types 322cadbfdc3SEiji Ota */ 323cadbfdc3SEiji Ota 324cadbfdc3SEiji Ota /* 325cadbfdc3SEiji Ota * This encapsulates a remote memory location. 326cadbfdc3SEiji Ota * In the current implementation, it contains the R_Key 327cadbfdc3SEiji Ota * of the remote memory region, and the offset into it 328cadbfdc3SEiji Ota * (so that the application does not have to worry about 329cadbfdc3SEiji Ota * alignment). 330cadbfdc3SEiji Ota */ 331fe817b60SEiji Ota typedef u_int64_t rds_rdma_cookie_t; 332cadbfdc3SEiji Ota 333fe817b60SEiji Ota struct rds_iovec { 334fe817b60SEiji Ota u_int64_t addr; 335fe817b60SEiji Ota u_int64_t bytes; 336cadbfdc3SEiji Ota }; 337cadbfdc3SEiji Ota 338fe817b60SEiji Ota struct rds_get_mr_args { 339fe817b60SEiji Ota struct rds_iovec vec; 340fe817b60SEiji Ota u_int64_t cookie_addr; 341cadbfdc3SEiji Ota uint64_t flags; 342cadbfdc3SEiji Ota }; 343cadbfdc3SEiji Ota 344fe817b60SEiji Ota struct rds_get_mr_for_dest_args { 345cadbfdc3SEiji Ota struct sockaddr_storage dest_addr; 346fe817b60SEiji Ota struct rds_iovec vec; 347fe817b60SEiji Ota u_int64_t cookie_addr; 348cadbfdc3SEiji Ota uint64_t flags; 349cadbfdc3SEiji Ota }; 350cadbfdc3SEiji Ota 351fe817b60SEiji Ota 352fe817b60SEiji Ota struct rds_free_mr_args { 353fe817b60SEiji Ota rds_rdma_cookie_t cookie; 354fe817b60SEiji Ota u_int64_t flags; 355cadbfdc3SEiji Ota }; 356cadbfdc3SEiji Ota 357fe817b60SEiji Ota struct rds_rdma_args { 358fe817b60SEiji Ota rds_rdma_cookie_t cookie; 359fe817b60SEiji Ota struct rds_iovec remote_vec; 360fe817b60SEiji Ota u_int64_t local_vec_addr; 361fe817b60SEiji Ota u_int64_t nr_local; 362fe817b60SEiji Ota u_int64_t flags; 363fe817b60SEiji Ota u_int64_t user_token; 364cadbfdc3SEiji Ota }; 365cadbfdc3SEiji Ota 366fe817b60SEiji Ota struct rds_rdma_notify { 367fe817b60SEiji Ota u_int64_t user_token; 368cadbfdc3SEiji Ota int32_t status; 369cadbfdc3SEiji Ota }; 370cadbfdc3SEiji Ota 371fe817b60SEiji Ota #define RDS_RDMA_SUCCESS 0 372fe817b60SEiji Ota #define RDS_RDMA_REMOTE_ERROR 1 373fe817b60SEiji Ota #define RDS_RDMA_CANCELED 2 374fe817b60SEiji Ota #define RDS_RDMA_DROPPED 3 375fe817b60SEiji Ota #define RDS_RDMA_OTHER_ERROR 4 376cadbfdc3SEiji Ota 377cadbfdc3SEiji Ota /* 378cadbfdc3SEiji Ota * Common set of flags for all RDMA related structs 379cadbfdc3SEiji Ota */ 380fe817b60SEiji Ota #define RDS_RDMA_READWRITE 0x0001 381fe817b60SEiji Ota #define RDS_RDMA_FENCE 0x0002 /* use FENCE for immediate send */ 382fe817b60SEiji Ota #define RDS_RDMA_INVALIDATE 0x0004 /* invalidate R_Key after freeing MR */ 383fe817b60SEiji Ota #define RDS_RDMA_USE_ONCE 0x0008 /* free MR after use */ 384fe817b60SEiji Ota #define RDS_RDMA_DONTWAIT 0x0010 /* Don't wait in SET_BARRIER */ 385fe817b60SEiji Ota #define RDS_RDMA_NOTIFY_ME 0x0020 /* Notify when operation completes */ 386cadbfdc3SEiji Ota 387c0dd49bdSEiji Ota #ifdef __cplusplus 388c0dd49bdSEiji Ota } 389c0dd49bdSEiji Ota #endif 390c0dd49bdSEiji Ota 391fe817b60SEiji Ota #endif /* _SYS_RDS_H */ 392