1d50e14abSJason Gunthorpe /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */ 2607ca46eSDavid Howells /* 3b7ff8b10SKa-Cheong Poon * Copyright (c) 2008, 2018 Oracle and/or its affiliates. All rights reserved. 4607ca46eSDavid Howells * 5607ca46eSDavid Howells * This software is available to you under a choice of one of two 6607ca46eSDavid Howells * licenses. You may choose to be licensed under the terms of the GNU 7607ca46eSDavid Howells * General Public License (GPL) Version 2, available from the file 8607ca46eSDavid Howells * COPYING in the main directory of this source tree, or the 9607ca46eSDavid Howells * OpenIB.org BSD license below: 10607ca46eSDavid Howells * 11607ca46eSDavid Howells * Redistribution and use in source and binary forms, with or 12607ca46eSDavid Howells * without modification, are permitted provided that the following 13607ca46eSDavid Howells * conditions are met: 14607ca46eSDavid Howells * 15607ca46eSDavid Howells * - Redistributions of source code must retain the above 16607ca46eSDavid Howells * copyright notice, this list of conditions and the following 17607ca46eSDavid Howells * disclaimer. 18607ca46eSDavid Howells * 19607ca46eSDavid Howells * - Redistributions in binary form must reproduce the above 20607ca46eSDavid Howells * copyright notice, this list of conditions and the following 21607ca46eSDavid Howells * disclaimer in the documentation and/or other materials 22607ca46eSDavid Howells * provided with the distribution. 23607ca46eSDavid Howells * 24607ca46eSDavid Howells * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25607ca46eSDavid Howells * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26607ca46eSDavid Howells * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27607ca46eSDavid Howells * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28607ca46eSDavid Howells * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29607ca46eSDavid Howells * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30607ca46eSDavid Howells * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31607ca46eSDavid Howells * SOFTWARE. 32607ca46eSDavid Howells * 33607ca46eSDavid Howells */ 34607ca46eSDavid Howells 35607ca46eSDavid Howells #ifndef _LINUX_RDS_H 36607ca46eSDavid Howells #define _LINUX_RDS_H 37607ca46eSDavid Howells 38607ca46eSDavid Howells #include <linux/types.h> 391786dbf3SDmitry V. Levin #include <linux/socket.h> /* For __kernel_sockaddr_storage. */ 4059a03feaSVinson Lee #include <linux/in6.h> /* For struct in6_addr. */ 41607ca46eSDavid Howells 42607ca46eSDavid Howells #define RDS_IB_ABI_VERSION 0x301 43607ca46eSDavid Howells 44a28c257cSSowmini Varadhan #define SOL_RDS 276 45a28c257cSSowmini Varadhan 46607ca46eSDavid Howells /* 47607ca46eSDavid Howells * setsockopt/getsockopt for SOL_RDS 48607ca46eSDavid Howells */ 49607ca46eSDavid Howells #define RDS_CANCEL_SENT_TO 1 50607ca46eSDavid Howells #define RDS_GET_MR 2 51607ca46eSDavid Howells #define RDS_FREE_MR 3 52607ca46eSDavid Howells /* deprecated: RDS_BARRIER 4 */ 53607ca46eSDavid Howells #define RDS_RECVERR 5 54607ca46eSDavid Howells #define RDS_CONG_MONITOR 6 55607ca46eSDavid Howells #define RDS_GET_MR_FOR_DEST 7 56a28c257cSSowmini Varadhan #define SO_RDS_TRANSPORT 8 57a28c257cSSowmini Varadhan 583289025aSSantosh Shilimkar /* Socket option to tap receive path latency 593289025aSSantosh Shilimkar * SO_RDS: SO_RDS_MSG_RXPATH_LATENCY 603289025aSSantosh Shilimkar * Format used struct rds_rx_trace_so 613289025aSSantosh Shilimkar */ 623289025aSSantosh Shilimkar #define SO_RDS_MSG_RXPATH_LATENCY 10 633289025aSSantosh Shilimkar 643289025aSSantosh Shilimkar 65a28c257cSSowmini Varadhan /* supported values for SO_RDS_TRANSPORT */ 66a28c257cSSowmini Varadhan #define RDS_TRANS_IB 0 67*4c342f77SRao Shoaib #define RDS_TRANS_GAP 1 68a28c257cSSowmini Varadhan #define RDS_TRANS_TCP 2 69a28c257cSSowmini Varadhan #define RDS_TRANS_COUNT 3 70a28c257cSSowmini Varadhan #define RDS_TRANS_NONE (~0) 71*4c342f77SRao Shoaib /* don't use RDS_TRANS_IWARP - it is deprecated */ 72*4c342f77SRao Shoaib #define RDS_TRANS_IWARP RDS_TRANS_GAP 73607ca46eSDavid Howells 743eb45036SSantosh Shilimkar /* IOCTLS commands for SOL_RDS */ 753eb45036SSantosh Shilimkar #define SIOCRDSSETTOS (SIOCPROTOPRIVATE) 763eb45036SSantosh Shilimkar #define SIOCRDSGETTOS (SIOCPROTOPRIVATE + 1) 773eb45036SSantosh Shilimkar 783eb45036SSantosh Shilimkar typedef __u8 rds_tos_t; 793eb45036SSantosh Shilimkar 80607ca46eSDavid Howells /* 81607ca46eSDavid Howells * Control message types for SOL_RDS. 82607ca46eSDavid Howells * 83607ca46eSDavid Howells * CMSG_RDMA_ARGS (sendmsg) 84607ca46eSDavid Howells * Request a RDMA transfer to/from the specified 85607ca46eSDavid Howells * memory ranges. 86607ca46eSDavid Howells * The cmsg_data is a struct rds_rdma_args. 87607ca46eSDavid Howells * RDS_CMSG_RDMA_DEST (recvmsg, sendmsg) 88607ca46eSDavid Howells * Kernel informs application about intended 89607ca46eSDavid Howells * source/destination of a RDMA transfer 90607ca46eSDavid Howells * RDS_CMSG_RDMA_MAP (sendmsg) 91607ca46eSDavid Howells * Application asks kernel to map the given 92607ca46eSDavid Howells * memory range into a IB MR, and send the 93607ca46eSDavid Howells * R_Key along in an RDS extension header. 94607ca46eSDavid Howells * The cmsg_data is a struct rds_get_mr_args, 95607ca46eSDavid Howells * the same as for the GET_MR setsockopt. 96607ca46eSDavid Howells * RDS_CMSG_RDMA_STATUS (recvmsg) 97607ca46eSDavid Howells * Returns the status of a completed RDMA operation. 983289025aSSantosh Shilimkar * RDS_CMSG_RXPATH_LATENCY(recvmsg) 993289025aSSantosh Shilimkar * Returns rds message latencies in various stages of receive 1003289025aSSantosh Shilimkar * path in nS. Its set per socket using SO_RDS_MSG_RXPATH_LATENCY 1013289025aSSantosh Shilimkar * socket option. Legitimate points are defined in 1023289025aSSantosh Shilimkar * enum rds_message_rxpath_latency. More points can be added in 1033289025aSSantosh Shilimkar * future. CSMG format is struct rds_cmsg_rx_trace. 104607ca46eSDavid Howells */ 105607ca46eSDavid Howells #define RDS_CMSG_RDMA_ARGS 1 106607ca46eSDavid Howells #define RDS_CMSG_RDMA_DEST 2 107607ca46eSDavid Howells #define RDS_CMSG_RDMA_MAP 3 108607ca46eSDavid Howells #define RDS_CMSG_RDMA_STATUS 4 109607ca46eSDavid Howells #define RDS_CMSG_CONG_UPDATE 5 110607ca46eSDavid Howells #define RDS_CMSG_ATOMIC_FADD 6 111607ca46eSDavid Howells #define RDS_CMSG_ATOMIC_CSWP 7 112607ca46eSDavid Howells #define RDS_CMSG_MASKED_ATOMIC_FADD 8 113607ca46eSDavid Howells #define RDS_CMSG_MASKED_ATOMIC_CSWP 9 1143289025aSSantosh Shilimkar #define RDS_CMSG_RXPATH_LATENCY 11 1150cebacceSSowmini Varadhan #define RDS_CMSG_ZCOPY_COOKIE 12 116401910dbSSowmini Varadhan #define RDS_CMSG_ZCOPY_COMPLETION 13 117607ca46eSDavid Howells 118607ca46eSDavid Howells #define RDS_INFO_FIRST 10000 119607ca46eSDavid Howells #define RDS_INFO_COUNTERS 10000 120607ca46eSDavid Howells #define RDS_INFO_CONNECTIONS 10001 121607ca46eSDavid Howells /* 10002 aka RDS_INFO_FLOWS is deprecated */ 122607ca46eSDavid Howells #define RDS_INFO_SEND_MESSAGES 10003 123607ca46eSDavid Howells #define RDS_INFO_RETRANS_MESSAGES 10004 124607ca46eSDavid Howells #define RDS_INFO_RECV_MESSAGES 10005 125607ca46eSDavid Howells #define RDS_INFO_SOCKETS 10006 126607ca46eSDavid Howells #define RDS_INFO_TCP_SOCKETS 10007 127607ca46eSDavid Howells #define RDS_INFO_IB_CONNECTIONS 10008 128607ca46eSDavid Howells #define RDS_INFO_CONNECTION_STATS 10009 129607ca46eSDavid Howells #define RDS_INFO_IWARP_CONNECTIONS 10010 130b7ff8b10SKa-Cheong Poon 131b7ff8b10SKa-Cheong Poon /* PF_RDS6 options */ 132b7ff8b10SKa-Cheong Poon #define RDS6_INFO_CONNECTIONS 10011 133b7ff8b10SKa-Cheong Poon #define RDS6_INFO_SEND_MESSAGES 10012 134b7ff8b10SKa-Cheong Poon #define RDS6_INFO_RETRANS_MESSAGES 10013 135b7ff8b10SKa-Cheong Poon #define RDS6_INFO_RECV_MESSAGES 10014 136b7ff8b10SKa-Cheong Poon #define RDS6_INFO_SOCKETS 10015 137b7ff8b10SKa-Cheong Poon #define RDS6_INFO_TCP_SOCKETS 10016 138b7ff8b10SKa-Cheong Poon #define RDS6_INFO_IB_CONNECTIONS 10017 139b7ff8b10SKa-Cheong Poon 140b7ff8b10SKa-Cheong Poon #define RDS_INFO_LAST 10017 141607ca46eSDavid Howells 142607ca46eSDavid Howells struct rds_info_counter { 143feb0869dSDmitry V. Levin __u8 name[32]; 144feb0869dSDmitry V. Levin __u64 value; 145607ca46eSDavid Howells } __attribute__((packed)); 146607ca46eSDavid Howells 147607ca46eSDavid Howells #define RDS_INFO_CONNECTION_FLAG_SENDING 0x01 148607ca46eSDavid Howells #define RDS_INFO_CONNECTION_FLAG_CONNECTING 0x02 149607ca46eSDavid Howells #define RDS_INFO_CONNECTION_FLAG_CONNECTED 0x04 150607ca46eSDavid Howells 151607ca46eSDavid Howells #define TRANSNAMSIZ 16 152607ca46eSDavid Howells 153607ca46eSDavid Howells struct rds_info_connection { 154feb0869dSDmitry V. Levin __u64 next_tx_seq; 155feb0869dSDmitry V. Levin __u64 next_rx_seq; 156607ca46eSDavid Howells __be32 laddr; 157607ca46eSDavid Howells __be32 faddr; 158feb0869dSDmitry V. Levin __u8 transport[TRANSNAMSIZ]; /* null term ascii */ 159feb0869dSDmitry V. Levin __u8 flags; 1603eb45036SSantosh Shilimkar __u8 tos; 161607ca46eSDavid Howells } __attribute__((packed)); 162607ca46eSDavid Howells 163b7ff8b10SKa-Cheong Poon struct rds6_info_connection { 164b7ff8b10SKa-Cheong Poon __u64 next_tx_seq; 165b7ff8b10SKa-Cheong Poon __u64 next_rx_seq; 166b7ff8b10SKa-Cheong Poon struct in6_addr laddr; 167b7ff8b10SKa-Cheong Poon struct in6_addr faddr; 168b7ff8b10SKa-Cheong Poon __u8 transport[TRANSNAMSIZ]; /* null term ascii */ 169b7ff8b10SKa-Cheong Poon __u8 flags; 170b7ff8b10SKa-Cheong Poon } __attribute__((packed)); 171b7ff8b10SKa-Cheong Poon 172607ca46eSDavid Howells #define RDS_INFO_MESSAGE_FLAG_ACK 0x01 173607ca46eSDavid Howells #define RDS_INFO_MESSAGE_FLAG_FAST_ACK 0x02 174607ca46eSDavid Howells 175607ca46eSDavid Howells struct rds_info_message { 176feb0869dSDmitry V. Levin __u64 seq; 177feb0869dSDmitry V. Levin __u32 len; 178607ca46eSDavid Howells __be32 laddr; 179607ca46eSDavid Howells __be32 faddr; 180607ca46eSDavid Howells __be16 lport; 181607ca46eSDavid Howells __be16 fport; 182feb0869dSDmitry V. Levin __u8 flags; 1833eb45036SSantosh Shilimkar __u8 tos; 184607ca46eSDavid Howells } __attribute__((packed)); 185607ca46eSDavid Howells 186b7ff8b10SKa-Cheong Poon struct rds6_info_message { 187b7ff8b10SKa-Cheong Poon __u64 seq; 188b7ff8b10SKa-Cheong Poon __u32 len; 189b7ff8b10SKa-Cheong Poon struct in6_addr laddr; 190b7ff8b10SKa-Cheong Poon struct in6_addr faddr; 191b7ff8b10SKa-Cheong Poon __be16 lport; 192b7ff8b10SKa-Cheong Poon __be16 fport; 193b7ff8b10SKa-Cheong Poon __u8 flags; 194b7ff8b10SKa-Cheong Poon __u8 tos; 195b7ff8b10SKa-Cheong Poon } __attribute__((packed)); 196b7ff8b10SKa-Cheong Poon 197607ca46eSDavid Howells struct rds_info_socket { 198feb0869dSDmitry V. Levin __u32 sndbuf; 199607ca46eSDavid Howells __be32 bound_addr; 200607ca46eSDavid Howells __be32 connected_addr; 201607ca46eSDavid Howells __be16 bound_port; 202607ca46eSDavid Howells __be16 connected_port; 203feb0869dSDmitry V. Levin __u32 rcvbuf; 204feb0869dSDmitry V. Levin __u64 inum; 205607ca46eSDavid Howells } __attribute__((packed)); 206607ca46eSDavid Howells 207b7ff8b10SKa-Cheong Poon struct rds6_info_socket { 208b7ff8b10SKa-Cheong Poon __u32 sndbuf; 209b7ff8b10SKa-Cheong Poon struct in6_addr bound_addr; 210b7ff8b10SKa-Cheong Poon struct in6_addr connected_addr; 211b7ff8b10SKa-Cheong Poon __be16 bound_port; 212b7ff8b10SKa-Cheong Poon __be16 connected_port; 213b7ff8b10SKa-Cheong Poon __u32 rcvbuf; 214b7ff8b10SKa-Cheong Poon __u64 inum; 215b7ff8b10SKa-Cheong Poon } __attribute__((packed)); 216b7ff8b10SKa-Cheong Poon 217607ca46eSDavid Howells struct rds_info_tcp_socket { 218607ca46eSDavid Howells __be32 local_addr; 219607ca46eSDavid Howells __be16 local_port; 220607ca46eSDavid Howells __be32 peer_addr; 221607ca46eSDavid Howells __be16 peer_port; 222feb0869dSDmitry V. Levin __u64 hdr_rem; 223feb0869dSDmitry V. Levin __u64 data_rem; 224feb0869dSDmitry V. Levin __u32 last_sent_nxt; 225feb0869dSDmitry V. Levin __u32 last_expected_una; 226feb0869dSDmitry V. Levin __u32 last_seen_una; 2273eb45036SSantosh Shilimkar __u8 tos; 228607ca46eSDavid Howells } __attribute__((packed)); 229607ca46eSDavid Howells 230b7ff8b10SKa-Cheong Poon struct rds6_info_tcp_socket { 231b7ff8b10SKa-Cheong Poon struct in6_addr local_addr; 232b7ff8b10SKa-Cheong Poon __be16 local_port; 233b7ff8b10SKa-Cheong Poon struct in6_addr peer_addr; 234b7ff8b10SKa-Cheong Poon __be16 peer_port; 235b7ff8b10SKa-Cheong Poon __u64 hdr_rem; 236b7ff8b10SKa-Cheong Poon __u64 data_rem; 237b7ff8b10SKa-Cheong Poon __u32 last_sent_nxt; 238b7ff8b10SKa-Cheong Poon __u32 last_expected_una; 239b7ff8b10SKa-Cheong Poon __u32 last_seen_una; 240b7ff8b10SKa-Cheong Poon } __attribute__((packed)); 241b7ff8b10SKa-Cheong Poon 242607ca46eSDavid Howells #define RDS_IB_GID_LEN 16 243607ca46eSDavid Howells struct rds_info_rdma_connection { 244607ca46eSDavid Howells __be32 src_addr; 245607ca46eSDavid Howells __be32 dst_addr; 246feb0869dSDmitry V. Levin __u8 src_gid[RDS_IB_GID_LEN]; 247feb0869dSDmitry V. Levin __u8 dst_gid[RDS_IB_GID_LEN]; 248607ca46eSDavid Howells 249feb0869dSDmitry V. Levin __u32 max_send_wr; 250feb0869dSDmitry V. Levin __u32 max_recv_wr; 251feb0869dSDmitry V. Levin __u32 max_send_sge; 252feb0869dSDmitry V. Levin __u32 rdma_mr_max; 253feb0869dSDmitry V. Levin __u32 rdma_mr_size; 2543eb45036SSantosh Shilimkar __u8 tos; 255e0e6d062SZhu Yanjun __u8 sl; 256fe3475afSZhu Yanjun __u32 cache_allocs; 257607ca46eSDavid Howells }; 258607ca46eSDavid Howells 259b7ff8b10SKa-Cheong Poon struct rds6_info_rdma_connection { 260b7ff8b10SKa-Cheong Poon struct in6_addr src_addr; 261b7ff8b10SKa-Cheong Poon struct in6_addr dst_addr; 262b7ff8b10SKa-Cheong Poon __u8 src_gid[RDS_IB_GID_LEN]; 263b7ff8b10SKa-Cheong Poon __u8 dst_gid[RDS_IB_GID_LEN]; 264b7ff8b10SKa-Cheong Poon 265b7ff8b10SKa-Cheong Poon __u32 max_send_wr; 266b7ff8b10SKa-Cheong Poon __u32 max_recv_wr; 267b7ff8b10SKa-Cheong Poon __u32 max_send_sge; 268b7ff8b10SKa-Cheong Poon __u32 rdma_mr_max; 269b7ff8b10SKa-Cheong Poon __u32 rdma_mr_size; 2703eb45036SSantosh Shilimkar __u8 tos; 271e0e6d062SZhu Yanjun __u8 sl; 272fe3475afSZhu Yanjun __u32 cache_allocs; 273b7ff8b10SKa-Cheong Poon }; 274b7ff8b10SKa-Cheong Poon 2753289025aSSantosh Shilimkar /* RDS message Receive Path Latency points */ 2763289025aSSantosh Shilimkar enum rds_message_rxpath_latency { 2773289025aSSantosh Shilimkar RDS_MSG_RX_HDR_TO_DGRAM_START = 0, 2783289025aSSantosh Shilimkar RDS_MSG_RX_DGRAM_REASSEMBLE, 2793289025aSSantosh Shilimkar RDS_MSG_RX_DGRAM_DELIVERED, 2803289025aSSantosh Shilimkar RDS_MSG_RX_DGRAM_TRACE_MAX 2813289025aSSantosh Shilimkar }; 2823289025aSSantosh Shilimkar 2833289025aSSantosh Shilimkar struct rds_rx_trace_so { 284c12f4d76SDmitry V. Levin __u8 rx_traces; 285c12f4d76SDmitry V. Levin __u8 rx_trace_pos[RDS_MSG_RX_DGRAM_TRACE_MAX]; 2863289025aSSantosh Shilimkar }; 2873289025aSSantosh Shilimkar 2883289025aSSantosh Shilimkar struct rds_cmsg_rx_trace { 289c12f4d76SDmitry V. Levin __u8 rx_traces; 290c12f4d76SDmitry V. Levin __u8 rx_trace_pos[RDS_MSG_RX_DGRAM_TRACE_MAX]; 291c12f4d76SDmitry V. Levin __u64 rx_trace[RDS_MSG_RX_DGRAM_TRACE_MAX]; 2923289025aSSantosh Shilimkar }; 2933289025aSSantosh Shilimkar 294607ca46eSDavid Howells /* 295607ca46eSDavid Howells * Congestion monitoring. 296607ca46eSDavid Howells * Congestion control in RDS happens at the host connection 297607ca46eSDavid Howells * level by exchanging a bitmap marking congested ports. 298607ca46eSDavid Howells * By default, a process sleeping in poll() is always woken 299607ca46eSDavid Howells * up when the congestion map is updated. 300607ca46eSDavid Howells * With explicit monitoring, an application can have more 301607ca46eSDavid Howells * fine-grained control. 302607ca46eSDavid Howells * The application installs a 64bit mask value in the socket, 303607ca46eSDavid Howells * where each bit corresponds to a group of ports. 304607ca46eSDavid Howells * When a congestion update arrives, RDS checks the set of 305607ca46eSDavid Howells * ports that are now uncongested against the list bit mask 306607ca46eSDavid Howells * installed in the socket, and if they overlap, we queue a 307607ca46eSDavid Howells * cong_notification on the socket. 308607ca46eSDavid Howells * 309607ca46eSDavid Howells * To install the congestion monitor bitmask, use RDS_CONG_MONITOR 310607ca46eSDavid Howells * with the 64bit mask. 311607ca46eSDavid Howells * Congestion updates are received via RDS_CMSG_CONG_UPDATE 312607ca46eSDavid Howells * control messages. 313607ca46eSDavid Howells * 314607ca46eSDavid Howells * The correspondence between bits and ports is 315607ca46eSDavid Howells * 1 << (portnum % 64) 316607ca46eSDavid Howells */ 317607ca46eSDavid Howells #define RDS_CONG_MONITOR_SIZE 64 318607ca46eSDavid Howells #define RDS_CONG_MONITOR_BIT(port) (((unsigned int) port) % RDS_CONG_MONITOR_SIZE) 319607ca46eSDavid Howells #define RDS_CONG_MONITOR_MASK(port) (1ULL << RDS_CONG_MONITOR_BIT(port)) 320607ca46eSDavid Howells 321607ca46eSDavid Howells /* 322607ca46eSDavid Howells * RDMA related types 323607ca46eSDavid Howells */ 324607ca46eSDavid Howells 325607ca46eSDavid Howells /* 326607ca46eSDavid Howells * This encapsulates a remote memory location. 327607ca46eSDavid Howells * In the current implementation, it contains the R_Key 328607ca46eSDavid Howells * of the remote memory region, and the offset into it 329607ca46eSDavid Howells * (so that the application does not have to worry about 330607ca46eSDavid Howells * alignment). 331607ca46eSDavid Howells */ 332feb0869dSDmitry V. Levin typedef __u64 rds_rdma_cookie_t; 333607ca46eSDavid Howells 334607ca46eSDavid Howells struct rds_iovec { 335feb0869dSDmitry V. Levin __u64 addr; 336feb0869dSDmitry V. Levin __u64 bytes; 337607ca46eSDavid Howells }; 338607ca46eSDavid Howells 339607ca46eSDavid Howells struct rds_get_mr_args { 340607ca46eSDavid Howells struct rds_iovec vec; 341feb0869dSDmitry V. Levin __u64 cookie_addr; 342feb0869dSDmitry V. Levin __u64 flags; 343607ca46eSDavid Howells }; 344607ca46eSDavid Howells 345607ca46eSDavid Howells struct rds_get_mr_for_dest_args { 3461786dbf3SDmitry V. Levin struct __kernel_sockaddr_storage dest_addr; 347607ca46eSDavid Howells struct rds_iovec vec; 348feb0869dSDmitry V. Levin __u64 cookie_addr; 349feb0869dSDmitry V. Levin __u64 flags; 350607ca46eSDavid Howells }; 351607ca46eSDavid Howells 352607ca46eSDavid Howells struct rds_free_mr_args { 353607ca46eSDavid Howells rds_rdma_cookie_t cookie; 354feb0869dSDmitry V. Levin __u64 flags; 355607ca46eSDavid Howells }; 356607ca46eSDavid Howells 357607ca46eSDavid Howells struct rds_rdma_args { 358607ca46eSDavid Howells rds_rdma_cookie_t cookie; 359607ca46eSDavid Howells struct rds_iovec remote_vec; 360feb0869dSDmitry V. Levin __u64 local_vec_addr; 361feb0869dSDmitry V. Levin __u64 nr_local; 362feb0869dSDmitry V. Levin __u64 flags; 363feb0869dSDmitry V. Levin __u64 user_token; 364607ca46eSDavid Howells }; 365607ca46eSDavid Howells 366607ca46eSDavid Howells struct rds_atomic_args { 367607ca46eSDavid Howells rds_rdma_cookie_t cookie; 368feb0869dSDmitry V. Levin __u64 local_addr; 369feb0869dSDmitry V. Levin __u64 remote_addr; 370607ca46eSDavid Howells union { 371607ca46eSDavid Howells struct { 372feb0869dSDmitry V. Levin __u64 compare; 373feb0869dSDmitry V. Levin __u64 swap; 374607ca46eSDavid Howells } cswp; 375607ca46eSDavid Howells struct { 376feb0869dSDmitry V. Levin __u64 add; 377607ca46eSDavid Howells } fadd; 378607ca46eSDavid Howells struct { 379feb0869dSDmitry V. Levin __u64 compare; 380feb0869dSDmitry V. Levin __u64 swap; 381feb0869dSDmitry V. Levin __u64 compare_mask; 382feb0869dSDmitry V. Levin __u64 swap_mask; 383607ca46eSDavid Howells } m_cswp; 384607ca46eSDavid Howells struct { 385feb0869dSDmitry V. Levin __u64 add; 386feb0869dSDmitry V. Levin __u64 nocarry_mask; 387607ca46eSDavid Howells } m_fadd; 388607ca46eSDavid Howells }; 389feb0869dSDmitry V. Levin __u64 flags; 390feb0869dSDmitry V. Levin __u64 user_token; 391607ca46eSDavid Howells }; 392607ca46eSDavid Howells 393607ca46eSDavid Howells struct rds_rdma_notify { 394feb0869dSDmitry V. Levin __u64 user_token; 395feb0869dSDmitry V. Levin __s32 status; 396607ca46eSDavid Howells }; 397607ca46eSDavid Howells 398607ca46eSDavid Howells #define RDS_RDMA_SUCCESS 0 399607ca46eSDavid Howells #define RDS_RDMA_REMOTE_ERROR 1 400607ca46eSDavid Howells #define RDS_RDMA_CANCELED 2 401607ca46eSDavid Howells #define RDS_RDMA_DROPPED 3 402607ca46eSDavid Howells #define RDS_RDMA_OTHER_ERROR 4 403607ca46eSDavid Howells 404401910dbSSowmini Varadhan #define RDS_MAX_ZCOOKIES 8 405401910dbSSowmini Varadhan struct rds_zcopy_cookies { 406401910dbSSowmini Varadhan __u32 num; 407401910dbSSowmini Varadhan __u32 cookies[RDS_MAX_ZCOOKIES]; 408401910dbSSowmini Varadhan }; 409401910dbSSowmini Varadhan 410607ca46eSDavid Howells /* 411607ca46eSDavid Howells * Common set of flags for all RDMA related structs 412607ca46eSDavid Howells */ 413607ca46eSDavid Howells #define RDS_RDMA_READWRITE 0x0001 414607ca46eSDavid Howells #define RDS_RDMA_FENCE 0x0002 /* use FENCE for immediate send */ 415607ca46eSDavid Howells #define RDS_RDMA_INVALIDATE 0x0004 /* invalidate R_Key after freeing MR */ 416607ca46eSDavid Howells #define RDS_RDMA_USE_ONCE 0x0008 /* free MR after use */ 417607ca46eSDavid Howells #define RDS_RDMA_DONTWAIT 0x0010 /* Don't wait in SET_BARRIER */ 418607ca46eSDavid Howells #define RDS_RDMA_NOTIFY_ME 0x0020 /* Notify when operation completes */ 419607ca46eSDavid Howells #define RDS_RDMA_SILENT 0x0040 /* Do not interrupt remote */ 420607ca46eSDavid Howells 421607ca46eSDavid Howells #endif /* IB_RDS_H */ 422