1*4882a593Smuzhiyun /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2008, 2018 Oracle and/or its affiliates. All rights reserved. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This software is available to you under a choice of one of two 6*4882a593Smuzhiyun * licenses. You may choose to be licensed under the terms of the GNU 7*4882a593Smuzhiyun * General Public License (GPL) Version 2, available from the file 8*4882a593Smuzhiyun * COPYING in the main directory of this source tree, or the 9*4882a593Smuzhiyun * OpenIB.org BSD license below: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or 12*4882a593Smuzhiyun * without modification, are permitted provided that the following 13*4882a593Smuzhiyun * conditions are met: 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * - Redistributions of source code must retain the above 16*4882a593Smuzhiyun * copyright notice, this list of conditions and the following 17*4882a593Smuzhiyun * disclaimer. 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * - Redistributions in binary form must reproduce the above 20*4882a593Smuzhiyun * copyright notice, this list of conditions and the following 21*4882a593Smuzhiyun * disclaimer in the documentation and/or other materials 22*4882a593Smuzhiyun * provided with the distribution. 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25*4882a593Smuzhiyun * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26*4882a593Smuzhiyun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27*4882a593Smuzhiyun * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28*4882a593Smuzhiyun * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29*4882a593Smuzhiyun * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30*4882a593Smuzhiyun * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31*4882a593Smuzhiyun * SOFTWARE. 32*4882a593Smuzhiyun * 33*4882a593Smuzhiyun */ 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #ifndef _LINUX_RDS_H 36*4882a593Smuzhiyun #define _LINUX_RDS_H 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #include <linux/types.h> 39*4882a593Smuzhiyun #include <linux/socket.h> /* For __kernel_sockaddr_storage. */ 40*4882a593Smuzhiyun #include <linux/in6.h> /* For struct in6_addr. */ 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define RDS_IB_ABI_VERSION 0x301 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define SOL_RDS 276 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* 47*4882a593Smuzhiyun * setsockopt/getsockopt for SOL_RDS 48*4882a593Smuzhiyun */ 49*4882a593Smuzhiyun #define RDS_CANCEL_SENT_TO 1 50*4882a593Smuzhiyun #define RDS_GET_MR 2 51*4882a593Smuzhiyun #define RDS_FREE_MR 3 52*4882a593Smuzhiyun /* deprecated: RDS_BARRIER 4 */ 53*4882a593Smuzhiyun #define RDS_RECVERR 5 54*4882a593Smuzhiyun #define RDS_CONG_MONITOR 6 55*4882a593Smuzhiyun #define RDS_GET_MR_FOR_DEST 7 56*4882a593Smuzhiyun #define SO_RDS_TRANSPORT 8 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* Socket option to tap receive path latency 59*4882a593Smuzhiyun * SO_RDS: SO_RDS_MSG_RXPATH_LATENCY 60*4882a593Smuzhiyun * Format used struct rds_rx_trace_so 61*4882a593Smuzhiyun */ 62*4882a593Smuzhiyun #define SO_RDS_MSG_RXPATH_LATENCY 10 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* supported values for SO_RDS_TRANSPORT */ 66*4882a593Smuzhiyun #define RDS_TRANS_IB 0 67*4882a593Smuzhiyun #define RDS_TRANS_GAP 1 68*4882a593Smuzhiyun #define RDS_TRANS_TCP 2 69*4882a593Smuzhiyun #define RDS_TRANS_COUNT 3 70*4882a593Smuzhiyun #define RDS_TRANS_NONE (~0) 71*4882a593Smuzhiyun /* don't use RDS_TRANS_IWARP - it is deprecated */ 72*4882a593Smuzhiyun #define RDS_TRANS_IWARP RDS_TRANS_GAP 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* IOCTLS commands for SOL_RDS */ 75*4882a593Smuzhiyun #define SIOCRDSSETTOS (SIOCPROTOPRIVATE) 76*4882a593Smuzhiyun #define SIOCRDSGETTOS (SIOCPROTOPRIVATE + 1) 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun typedef __u8 rds_tos_t; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* 81*4882a593Smuzhiyun * Control message types for SOL_RDS. 82*4882a593Smuzhiyun * 83*4882a593Smuzhiyun * CMSG_RDMA_ARGS (sendmsg) 84*4882a593Smuzhiyun * Request a RDMA transfer to/from the specified 85*4882a593Smuzhiyun * memory ranges. 86*4882a593Smuzhiyun * The cmsg_data is a struct rds_rdma_args. 87*4882a593Smuzhiyun * RDS_CMSG_RDMA_DEST (recvmsg, sendmsg) 88*4882a593Smuzhiyun * Kernel informs application about intended 89*4882a593Smuzhiyun * source/destination of a RDMA transfer 90*4882a593Smuzhiyun * RDS_CMSG_RDMA_MAP (sendmsg) 91*4882a593Smuzhiyun * Application asks kernel to map the given 92*4882a593Smuzhiyun * memory range into a IB MR, and send the 93*4882a593Smuzhiyun * R_Key along in an RDS extension header. 94*4882a593Smuzhiyun * The cmsg_data is a struct rds_get_mr_args, 95*4882a593Smuzhiyun * the same as for the GET_MR setsockopt. 96*4882a593Smuzhiyun * RDS_CMSG_RDMA_STATUS (recvmsg) 97*4882a593Smuzhiyun * Returns the status of a completed RDMA operation. 98*4882a593Smuzhiyun * RDS_CMSG_RXPATH_LATENCY(recvmsg) 99*4882a593Smuzhiyun * Returns rds message latencies in various stages of receive 100*4882a593Smuzhiyun * path in nS. Its set per socket using SO_RDS_MSG_RXPATH_LATENCY 101*4882a593Smuzhiyun * socket option. Legitimate points are defined in 102*4882a593Smuzhiyun * enum rds_message_rxpath_latency. More points can be added in 103*4882a593Smuzhiyun * future. CSMG format is struct rds_cmsg_rx_trace. 104*4882a593Smuzhiyun */ 105*4882a593Smuzhiyun #define RDS_CMSG_RDMA_ARGS 1 106*4882a593Smuzhiyun #define RDS_CMSG_RDMA_DEST 2 107*4882a593Smuzhiyun #define RDS_CMSG_RDMA_MAP 3 108*4882a593Smuzhiyun #define RDS_CMSG_RDMA_STATUS 4 109*4882a593Smuzhiyun #define RDS_CMSG_CONG_UPDATE 5 110*4882a593Smuzhiyun #define RDS_CMSG_ATOMIC_FADD 6 111*4882a593Smuzhiyun #define RDS_CMSG_ATOMIC_CSWP 7 112*4882a593Smuzhiyun #define RDS_CMSG_MASKED_ATOMIC_FADD 8 113*4882a593Smuzhiyun #define RDS_CMSG_MASKED_ATOMIC_CSWP 9 114*4882a593Smuzhiyun #define RDS_CMSG_RXPATH_LATENCY 11 115*4882a593Smuzhiyun #define RDS_CMSG_ZCOPY_COOKIE 12 116*4882a593Smuzhiyun #define RDS_CMSG_ZCOPY_COMPLETION 13 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #define RDS_INFO_FIRST 10000 119*4882a593Smuzhiyun #define RDS_INFO_COUNTERS 10000 120*4882a593Smuzhiyun #define RDS_INFO_CONNECTIONS 10001 121*4882a593Smuzhiyun /* 10002 aka RDS_INFO_FLOWS is deprecated */ 122*4882a593Smuzhiyun #define RDS_INFO_SEND_MESSAGES 10003 123*4882a593Smuzhiyun #define RDS_INFO_RETRANS_MESSAGES 10004 124*4882a593Smuzhiyun #define RDS_INFO_RECV_MESSAGES 10005 125*4882a593Smuzhiyun #define RDS_INFO_SOCKETS 10006 126*4882a593Smuzhiyun #define RDS_INFO_TCP_SOCKETS 10007 127*4882a593Smuzhiyun #define RDS_INFO_IB_CONNECTIONS 10008 128*4882a593Smuzhiyun #define RDS_INFO_CONNECTION_STATS 10009 129*4882a593Smuzhiyun #define RDS_INFO_IWARP_CONNECTIONS 10010 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* PF_RDS6 options */ 132*4882a593Smuzhiyun #define RDS6_INFO_CONNECTIONS 10011 133*4882a593Smuzhiyun #define RDS6_INFO_SEND_MESSAGES 10012 134*4882a593Smuzhiyun #define RDS6_INFO_RETRANS_MESSAGES 10013 135*4882a593Smuzhiyun #define RDS6_INFO_RECV_MESSAGES 10014 136*4882a593Smuzhiyun #define RDS6_INFO_SOCKETS 10015 137*4882a593Smuzhiyun #define RDS6_INFO_TCP_SOCKETS 10016 138*4882a593Smuzhiyun #define RDS6_INFO_IB_CONNECTIONS 10017 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #define RDS_INFO_LAST 10017 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun struct rds_info_counter { 143*4882a593Smuzhiyun __u8 name[32]; 144*4882a593Smuzhiyun __u64 value; 145*4882a593Smuzhiyun } __attribute__((packed)); 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun #define RDS_INFO_CONNECTION_FLAG_SENDING 0x01 148*4882a593Smuzhiyun #define RDS_INFO_CONNECTION_FLAG_CONNECTING 0x02 149*4882a593Smuzhiyun #define RDS_INFO_CONNECTION_FLAG_CONNECTED 0x04 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun #define TRANSNAMSIZ 16 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun struct rds_info_connection { 154*4882a593Smuzhiyun __u64 next_tx_seq; 155*4882a593Smuzhiyun __u64 next_rx_seq; 156*4882a593Smuzhiyun __be32 laddr; 157*4882a593Smuzhiyun __be32 faddr; 158*4882a593Smuzhiyun __u8 transport[TRANSNAMSIZ]; /* null term ascii */ 159*4882a593Smuzhiyun __u8 flags; 160*4882a593Smuzhiyun __u8 tos; 161*4882a593Smuzhiyun } __attribute__((packed)); 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun struct rds6_info_connection { 164*4882a593Smuzhiyun __u64 next_tx_seq; 165*4882a593Smuzhiyun __u64 next_rx_seq; 166*4882a593Smuzhiyun struct in6_addr laddr; 167*4882a593Smuzhiyun struct in6_addr faddr; 168*4882a593Smuzhiyun __u8 transport[TRANSNAMSIZ]; /* null term ascii */ 169*4882a593Smuzhiyun __u8 flags; 170*4882a593Smuzhiyun } __attribute__((packed)); 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #define RDS_INFO_MESSAGE_FLAG_ACK 0x01 173*4882a593Smuzhiyun #define RDS_INFO_MESSAGE_FLAG_FAST_ACK 0x02 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun struct rds_info_message { 176*4882a593Smuzhiyun __u64 seq; 177*4882a593Smuzhiyun __u32 len; 178*4882a593Smuzhiyun __be32 laddr; 179*4882a593Smuzhiyun __be32 faddr; 180*4882a593Smuzhiyun __be16 lport; 181*4882a593Smuzhiyun __be16 fport; 182*4882a593Smuzhiyun __u8 flags; 183*4882a593Smuzhiyun __u8 tos; 184*4882a593Smuzhiyun } __attribute__((packed)); 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun struct rds6_info_message { 187*4882a593Smuzhiyun __u64 seq; 188*4882a593Smuzhiyun __u32 len; 189*4882a593Smuzhiyun struct in6_addr laddr; 190*4882a593Smuzhiyun struct in6_addr faddr; 191*4882a593Smuzhiyun __be16 lport; 192*4882a593Smuzhiyun __be16 fport; 193*4882a593Smuzhiyun __u8 flags; 194*4882a593Smuzhiyun __u8 tos; 195*4882a593Smuzhiyun } __attribute__((packed)); 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun struct rds_info_socket { 198*4882a593Smuzhiyun __u32 sndbuf; 199*4882a593Smuzhiyun __be32 bound_addr; 200*4882a593Smuzhiyun __be32 connected_addr; 201*4882a593Smuzhiyun __be16 bound_port; 202*4882a593Smuzhiyun __be16 connected_port; 203*4882a593Smuzhiyun __u32 rcvbuf; 204*4882a593Smuzhiyun __u64 inum; 205*4882a593Smuzhiyun } __attribute__((packed)); 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun struct rds6_info_socket { 208*4882a593Smuzhiyun __u32 sndbuf; 209*4882a593Smuzhiyun struct in6_addr bound_addr; 210*4882a593Smuzhiyun struct in6_addr connected_addr; 211*4882a593Smuzhiyun __be16 bound_port; 212*4882a593Smuzhiyun __be16 connected_port; 213*4882a593Smuzhiyun __u32 rcvbuf; 214*4882a593Smuzhiyun __u64 inum; 215*4882a593Smuzhiyun } __attribute__((packed)); 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun struct rds_info_tcp_socket { 218*4882a593Smuzhiyun __be32 local_addr; 219*4882a593Smuzhiyun __be16 local_port; 220*4882a593Smuzhiyun __be32 peer_addr; 221*4882a593Smuzhiyun __be16 peer_port; 222*4882a593Smuzhiyun __u64 hdr_rem; 223*4882a593Smuzhiyun __u64 data_rem; 224*4882a593Smuzhiyun __u32 last_sent_nxt; 225*4882a593Smuzhiyun __u32 last_expected_una; 226*4882a593Smuzhiyun __u32 last_seen_una; 227*4882a593Smuzhiyun __u8 tos; 228*4882a593Smuzhiyun } __attribute__((packed)); 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun struct rds6_info_tcp_socket { 231*4882a593Smuzhiyun struct in6_addr local_addr; 232*4882a593Smuzhiyun __be16 local_port; 233*4882a593Smuzhiyun struct in6_addr peer_addr; 234*4882a593Smuzhiyun __be16 peer_port; 235*4882a593Smuzhiyun __u64 hdr_rem; 236*4882a593Smuzhiyun __u64 data_rem; 237*4882a593Smuzhiyun __u32 last_sent_nxt; 238*4882a593Smuzhiyun __u32 last_expected_una; 239*4882a593Smuzhiyun __u32 last_seen_una; 240*4882a593Smuzhiyun } __attribute__((packed)); 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun #define RDS_IB_GID_LEN 16 243*4882a593Smuzhiyun struct rds_info_rdma_connection { 244*4882a593Smuzhiyun __be32 src_addr; 245*4882a593Smuzhiyun __be32 dst_addr; 246*4882a593Smuzhiyun __u8 src_gid[RDS_IB_GID_LEN]; 247*4882a593Smuzhiyun __u8 dst_gid[RDS_IB_GID_LEN]; 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun __u32 max_send_wr; 250*4882a593Smuzhiyun __u32 max_recv_wr; 251*4882a593Smuzhiyun __u32 max_send_sge; 252*4882a593Smuzhiyun __u32 rdma_mr_max; 253*4882a593Smuzhiyun __u32 rdma_mr_size; 254*4882a593Smuzhiyun __u8 tos; 255*4882a593Smuzhiyun __u8 sl; 256*4882a593Smuzhiyun __u32 cache_allocs; 257*4882a593Smuzhiyun }; 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun struct rds6_info_rdma_connection { 260*4882a593Smuzhiyun struct in6_addr src_addr; 261*4882a593Smuzhiyun struct in6_addr dst_addr; 262*4882a593Smuzhiyun __u8 src_gid[RDS_IB_GID_LEN]; 263*4882a593Smuzhiyun __u8 dst_gid[RDS_IB_GID_LEN]; 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun __u32 max_send_wr; 266*4882a593Smuzhiyun __u32 max_recv_wr; 267*4882a593Smuzhiyun __u32 max_send_sge; 268*4882a593Smuzhiyun __u32 rdma_mr_max; 269*4882a593Smuzhiyun __u32 rdma_mr_size; 270*4882a593Smuzhiyun __u8 tos; 271*4882a593Smuzhiyun __u8 sl; 272*4882a593Smuzhiyun __u32 cache_allocs; 273*4882a593Smuzhiyun }; 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun /* RDS message Receive Path Latency points */ 276*4882a593Smuzhiyun enum rds_message_rxpath_latency { 277*4882a593Smuzhiyun RDS_MSG_RX_HDR_TO_DGRAM_START = 0, 278*4882a593Smuzhiyun RDS_MSG_RX_DGRAM_REASSEMBLE, 279*4882a593Smuzhiyun RDS_MSG_RX_DGRAM_DELIVERED, 280*4882a593Smuzhiyun RDS_MSG_RX_DGRAM_TRACE_MAX 281*4882a593Smuzhiyun }; 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun struct rds_rx_trace_so { 284*4882a593Smuzhiyun __u8 rx_traces; 285*4882a593Smuzhiyun __u8 rx_trace_pos[RDS_MSG_RX_DGRAM_TRACE_MAX]; 286*4882a593Smuzhiyun }; 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun struct rds_cmsg_rx_trace { 289*4882a593Smuzhiyun __u8 rx_traces; 290*4882a593Smuzhiyun __u8 rx_trace_pos[RDS_MSG_RX_DGRAM_TRACE_MAX]; 291*4882a593Smuzhiyun __u64 rx_trace[RDS_MSG_RX_DGRAM_TRACE_MAX]; 292*4882a593Smuzhiyun }; 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun /* 295*4882a593Smuzhiyun * Congestion monitoring. 296*4882a593Smuzhiyun * Congestion control in RDS happens at the host connection 297*4882a593Smuzhiyun * level by exchanging a bitmap marking congested ports. 298*4882a593Smuzhiyun * By default, a process sleeping in poll() is always woken 299*4882a593Smuzhiyun * up when the congestion map is updated. 300*4882a593Smuzhiyun * With explicit monitoring, an application can have more 301*4882a593Smuzhiyun * fine-grained control. 302*4882a593Smuzhiyun * The application installs a 64bit mask value in the socket, 303*4882a593Smuzhiyun * where each bit corresponds to a group of ports. 304*4882a593Smuzhiyun * When a congestion update arrives, RDS checks the set of 305*4882a593Smuzhiyun * ports that are now uncongested against the list bit mask 306*4882a593Smuzhiyun * installed in the socket, and if they overlap, we queue a 307*4882a593Smuzhiyun * cong_notification on the socket. 308*4882a593Smuzhiyun * 309*4882a593Smuzhiyun * To install the congestion monitor bitmask, use RDS_CONG_MONITOR 310*4882a593Smuzhiyun * with the 64bit mask. 311*4882a593Smuzhiyun * Congestion updates are received via RDS_CMSG_CONG_UPDATE 312*4882a593Smuzhiyun * control messages. 313*4882a593Smuzhiyun * 314*4882a593Smuzhiyun * The correspondence between bits and ports is 315*4882a593Smuzhiyun * 1 << (portnum % 64) 316*4882a593Smuzhiyun */ 317*4882a593Smuzhiyun #define RDS_CONG_MONITOR_SIZE 64 318*4882a593Smuzhiyun #define RDS_CONG_MONITOR_BIT(port) (((unsigned int) port) % RDS_CONG_MONITOR_SIZE) 319*4882a593Smuzhiyun #define RDS_CONG_MONITOR_MASK(port) (1ULL << RDS_CONG_MONITOR_BIT(port)) 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun /* 322*4882a593Smuzhiyun * RDMA related types 323*4882a593Smuzhiyun */ 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun /* 326*4882a593Smuzhiyun * This encapsulates a remote memory location. 327*4882a593Smuzhiyun * In the current implementation, it contains the R_Key 328*4882a593Smuzhiyun * of the remote memory region, and the offset into it 329*4882a593Smuzhiyun * (so that the application does not have to worry about 330*4882a593Smuzhiyun * alignment). 331*4882a593Smuzhiyun */ 332*4882a593Smuzhiyun typedef __u64 rds_rdma_cookie_t; 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun struct rds_iovec { 335*4882a593Smuzhiyun __u64 addr; 336*4882a593Smuzhiyun __u64 bytes; 337*4882a593Smuzhiyun }; 338*4882a593Smuzhiyun 339*4882a593Smuzhiyun struct rds_get_mr_args { 340*4882a593Smuzhiyun struct rds_iovec vec; 341*4882a593Smuzhiyun __u64 cookie_addr; 342*4882a593Smuzhiyun __u64 flags; 343*4882a593Smuzhiyun }; 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun struct rds_get_mr_for_dest_args { 346*4882a593Smuzhiyun struct __kernel_sockaddr_storage dest_addr; 347*4882a593Smuzhiyun struct rds_iovec vec; 348*4882a593Smuzhiyun __u64 cookie_addr; 349*4882a593Smuzhiyun __u64 flags; 350*4882a593Smuzhiyun }; 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun struct rds_free_mr_args { 353*4882a593Smuzhiyun rds_rdma_cookie_t cookie; 354*4882a593Smuzhiyun __u64 flags; 355*4882a593Smuzhiyun }; 356*4882a593Smuzhiyun 357*4882a593Smuzhiyun struct rds_rdma_args { 358*4882a593Smuzhiyun rds_rdma_cookie_t cookie; 359*4882a593Smuzhiyun struct rds_iovec remote_vec; 360*4882a593Smuzhiyun __u64 local_vec_addr; 361*4882a593Smuzhiyun __u64 nr_local; 362*4882a593Smuzhiyun __u64 flags; 363*4882a593Smuzhiyun __u64 user_token; 364*4882a593Smuzhiyun }; 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun struct rds_atomic_args { 367*4882a593Smuzhiyun rds_rdma_cookie_t cookie; 368*4882a593Smuzhiyun __u64 local_addr; 369*4882a593Smuzhiyun __u64 remote_addr; 370*4882a593Smuzhiyun union { 371*4882a593Smuzhiyun struct { 372*4882a593Smuzhiyun __u64 compare; 373*4882a593Smuzhiyun __u64 swap; 374*4882a593Smuzhiyun } cswp; 375*4882a593Smuzhiyun struct { 376*4882a593Smuzhiyun __u64 add; 377*4882a593Smuzhiyun } fadd; 378*4882a593Smuzhiyun struct { 379*4882a593Smuzhiyun __u64 compare; 380*4882a593Smuzhiyun __u64 swap; 381*4882a593Smuzhiyun __u64 compare_mask; 382*4882a593Smuzhiyun __u64 swap_mask; 383*4882a593Smuzhiyun } m_cswp; 384*4882a593Smuzhiyun struct { 385*4882a593Smuzhiyun __u64 add; 386*4882a593Smuzhiyun __u64 nocarry_mask; 387*4882a593Smuzhiyun } m_fadd; 388*4882a593Smuzhiyun }; 389*4882a593Smuzhiyun __u64 flags; 390*4882a593Smuzhiyun __u64 user_token; 391*4882a593Smuzhiyun }; 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun struct rds_rdma_notify { 394*4882a593Smuzhiyun __u64 user_token; 395*4882a593Smuzhiyun __s32 status; 396*4882a593Smuzhiyun }; 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun #define RDS_RDMA_SUCCESS 0 399*4882a593Smuzhiyun #define RDS_RDMA_REMOTE_ERROR 1 400*4882a593Smuzhiyun #define RDS_RDMA_CANCELED 2 401*4882a593Smuzhiyun #define RDS_RDMA_DROPPED 3 402*4882a593Smuzhiyun #define RDS_RDMA_OTHER_ERROR 4 403*4882a593Smuzhiyun 404*4882a593Smuzhiyun #define RDS_MAX_ZCOOKIES 8 405*4882a593Smuzhiyun struct rds_zcopy_cookies { 406*4882a593Smuzhiyun __u32 num; 407*4882a593Smuzhiyun __u32 cookies[RDS_MAX_ZCOOKIES]; 408*4882a593Smuzhiyun }; 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun /* 411*4882a593Smuzhiyun * Common set of flags for all RDMA related structs 412*4882a593Smuzhiyun */ 413*4882a593Smuzhiyun #define RDS_RDMA_READWRITE 0x0001 414*4882a593Smuzhiyun #define RDS_RDMA_FENCE 0x0002 /* use FENCE for immediate send */ 415*4882a593Smuzhiyun #define RDS_RDMA_INVALIDATE 0x0004 /* invalidate R_Key after freeing MR */ 416*4882a593Smuzhiyun #define RDS_RDMA_USE_ONCE 0x0008 /* free MR after use */ 417*4882a593Smuzhiyun #define RDS_RDMA_DONTWAIT 0x0010 /* Don't wait in SET_BARRIER */ 418*4882a593Smuzhiyun #define RDS_RDMA_NOTIFY_ME 0x0020 /* Notify when operation completes */ 419*4882a593Smuzhiyun #define RDS_RDMA_SILENT 0x0040 /* Do not interrupt remote */ 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun #endif /* IB_RDS_H */ 422