~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/networking/rds.rst

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. SPDX-License-Identifier: GPL-2.0
  2 
  3 ===
  4 RDS
  5 ===
  6 
  7 Overview
  8 ========
  9 
 10 This readme tries to provide some background on the hows and whys of RDS,
 11 and will hopefully help you find your way around the code.
 12 
 13 In addition, please see this email about RDS origins:
 14 http://oss.oracle.com/pipermail/rds-devel/2007-November/000228.html
 15 
 16 RDS Architecture
 17 ================
 18 
 19 RDS provides reliable, ordered datagram delivery by using a single
 20 reliable connection between any two nodes in the cluster. This allows
 21 applications to use a single socket to talk to any other process in the
 22 cluster - so in a cluster with N processes you need N sockets, in contrast
 23 to N*N if you use a connection-oriented socket transport like TCP.
 24 
 25 RDS is not Infiniband-specific; it was designed to support different
 26 transports.  The current implementation used to support RDS over TCP as well
 27 as IB.
 28 
 29 The high-level semantics of RDS from the application's point of view are
 30 
 31  *      Addressing
 32 
 33         RDS uses IPv4 addresses and 16bit port numbers to identify
 34         the end point of a connection. All socket operations that involve
 35         passing addresses between kernel and user space generally
 36         use a struct sockaddr_in.
 37 
 38         The fact that IPv4 addresses are used does not mean the underlying
 39         transport has to be IP-based. In fact, RDS over IB uses a
 40         reliable IB connection; the IP address is used exclusively to
 41         locate the remote node's GID (by ARPing for the given IP).
 42 
 43         The port space is entirely independent of UDP, TCP or any other
 44         protocol.
 45 
 46  *      Socket interface
 47 
 48         RDS sockets work *mostly* as you would expect from a BSD
 49         socket. The next section will cover the details. At any rate,
 50         all I/O is performed through the standard BSD socket API.
 51         Some additions like zerocopy support are implemented through
 52         control messages, while other extensions use the getsockopt/
 53         setsockopt calls.
 54 
 55         Sockets must be bound before you can send or receive data.
 56         This is needed because binding also selects a transport and
 57         attaches it to the socket. Once bound, the transport assignment
 58         does not change. RDS will tolerate IPs moving around (eg in
 59         a active-active HA scenario), but only as long as the address
 60         doesn't move to a different transport.
 61 
 62  *      sysctls
 63 
 64         RDS supports a number of sysctls in /proc/sys/net/rds
 65 
 66 
 67 Socket Interface
 68 ================
 69 
 70   AF_RDS, PF_RDS, SOL_RDS
 71         AF_RDS and PF_RDS are the domain type to be used with socket(2)
 72         to create RDS sockets. SOL_RDS is the socket-level to be used
 73         with setsockopt(2) and getsockopt(2) for RDS specific socket
 74         options.
 75 
 76   fd = socket(PF_RDS, SOCK_SEQPACKET, 0);
 77         This creates a new, unbound RDS socket.
 78 
 79   setsockopt(SOL_SOCKET): send and receive buffer size
 80         RDS honors the send and receive buffer size socket options.
 81         You are not allowed to queue more than SO_SNDSIZE bytes to
 82         a socket. A message is queued when sendmsg is called, and
 83         it leaves the queue when the remote system acknowledges
 84         its arrival.
 85 
 86         The SO_RCVSIZE option controls the maximum receive queue length.
 87         This is a soft limit rather than a hard limit - RDS will
 88         continue to accept and queue incoming messages, even if that
 89         takes the queue length over the limit. However, it will also
 90         mark the port as "congested" and send a congestion update to
 91         the source node. The source node is supposed to throttle any
 92         processes sending to this congested port.
 93 
 94   bind(fd, &sockaddr_in, ...)
 95         This binds the socket to a local IP address and port, and a
 96         transport, if one has not already been selected via the
 97         SO_RDS_TRANSPORT socket option
 98 
 99   sendmsg(fd, ...)
100         Sends a message to the indicated recipient. The kernel will
101         transparently establish the underlying reliable connection
102         if it isn't up yet.
103 
104         An attempt to send a message that exceeds SO_SNDSIZE will
105         return with -EMSGSIZE
106 
107         An attempt to send a message that would take the total number
108         of queued bytes over the SO_SNDSIZE threshold will return
109         EAGAIN.
110 
111         An attempt to send a message to a destination that is marked
112         as "congested" will return ENOBUFS.
113 
114   recvmsg(fd, ...)
115         Receives a message that was queued to this socket. The sockets
116         recv queue accounting is adjusted, and if the queue length
117         drops below SO_SNDSIZE, the port is marked uncongested, and
118         a congestion update is sent to all peers.
119 
120         Applications can ask the RDS kernel module to receive
121         notifications via control messages (for instance, there is a
122         notification when a congestion update arrived, or when a RDMA
123         operation completes). These notifications are received through
124         the msg.msg_control buffer of struct msghdr. The format of the
125         messages is described in manpages.
126 
127   poll(fd)
128         RDS supports the poll interface to allow the application
129         to implement async I/O.
130 
131         POLLIN handling is pretty straightforward. When there's an
132         incoming message queued to the socket, or a pending notification,
133         we signal POLLIN.
134 
135         POLLOUT is a little harder. Since you can essentially send
136         to any destination, RDS will always signal POLLOUT as long as
137         there's room on the send queue (ie the number of bytes queued
138         is less than the sendbuf size).
139 
140         However, the kernel will refuse to accept messages to
141         a destination marked congested - in this case you will loop
142         forever if you rely on poll to tell you what to do.
143         This isn't a trivial problem, but applications can deal with
144         this - by using congestion notifications, and by checking for
145         ENOBUFS errors returned by sendmsg.
146 
147   setsockopt(SOL_RDS, RDS_CANCEL_SENT_TO, &sockaddr_in)
148         This allows the application to discard all messages queued to a
149         specific destination on this particular socket.
150 
151         This allows the application to cancel outstanding messages if
152         it detects a timeout. For instance, if it tried to send a message,
153         and the remote host is unreachable, RDS will keep trying forever.
154         The application may decide it's not worth it, and cancel the
155         operation. In this case, it would use RDS_CANCEL_SENT_TO to
156         nuke any pending messages.
157 
158   ``setsockopt(fd, SOL_RDS, SO_RDS_TRANSPORT, (int *)&transport ..), getsockopt(fd, SOL_RDS, SO_RDS_TRANSPORT, (int *)&transport ..)``
159         Set or read an integer defining  the underlying
160         encapsulating transport to be used for RDS packets on the
161         socket. When setting the option, integer argument may be
162         one of RDS_TRANS_TCP or RDS_TRANS_IB. When retrieving the
163         value, RDS_TRANS_NONE will be returned on an unbound socket.
164         This socket option may only be set exactly once on the socket,
165         prior to binding it via the bind(2) system call. Attempts to
166         set SO_RDS_TRANSPORT on a socket for which the transport has
167         been previously attached explicitly (by SO_RDS_TRANSPORT) or
168         implicitly (via bind(2)) will return an error of EOPNOTSUPP.
169         An attempt to set SO_RDS_TRANSPORT to RDS_TRANS_NONE will
170         always return EINVAL.
171 
172 RDMA for RDS
173 ============
174 
175   see rds-rdma(7) manpage (available in rds-tools)
176 
177 
178 Congestion Notifications
179 ========================
180 
181   see rds(7) manpage
182 
183 
184 RDS Protocol
185 ============
186 
187   Message header
188 
189     The message header is a 'struct rds_header' (see rds.h):
190 
191     Fields:
192 
193       h_sequence:
194           per-packet sequence number
195       h_ack:
196           piggybacked acknowledgment of last packet received
197       h_len:
198           length of data, not including header
199       h_sport:
200           source port
201       h_dport:
202           destination port
203       h_flags:
204           Can be:
205 
206           =============  ==================================
207           CONG_BITMAP    this is a congestion update bitmap
208           ACK_REQUIRED   receiver must ack this packet
209           RETRANSMITTED  packet has previously been sent
210           =============  ==================================
211 
212       h_credit:
213           indicate to other end of connection that
214           it has more credits available (i.e. there is
215           more send room)
216       h_padding[4]:
217           unused, for future use
218       h_csum:
219           header checksum
220       h_exthdr:
221           optional data can be passed here. This is currently used for
222           passing RDMA-related information.
223 
224   ACK and retransmit handling
225 
226       One might think that with reliable IB connections you wouldn't need
227       to ack messages that have been received.  The problem is that IB
228       hardware generates an ack message before it has DMAed the message
229       into memory.  This creates a potential message loss if the HCA is
230       disabled for any reason between when it sends the ack and before
231       the message is DMAed and processed.  This is only a potential issue
232       if another HCA is available for fail-over.
233 
234       Sending an ack immediately would allow the sender to free the sent
235       message from their send queue quickly, but could cause excessive
236       traffic to be used for acks. RDS piggybacks acks on sent data
237       packets.  Ack-only packets are reduced by only allowing one to be
238       in flight at a time, and by the sender only asking for acks when
239       its send buffers start to fill up. All retransmissions are also
240       acked.
241 
242   Flow Control
243 
244       RDS's IB transport uses a credit-based mechanism to verify that
245       there is space in the peer's receive buffers for more data. This
246       eliminates the need for hardware retries on the connection.
247 
248   Congestion
249 
250       Messages waiting in the receive queue on the receiving socket
251       are accounted against the sockets SO_RCVBUF option value.  Only
252       the payload bytes in the message are accounted for.  If the
253       number of bytes queued equals or exceeds rcvbuf then the socket
254       is congested.  All sends attempted to this socket's address
255       should return block or return -EWOULDBLOCK.
256 
257       Applications are expected to be reasonably tuned such that this
258       situation very rarely occurs.  An application encountering this
259       "back-pressure" is considered a bug.
260 
261       This is implemented by having each node maintain bitmaps which
262       indicate which ports on bound addresses are congested.  As the
263       bitmap changes it is sent through all the connections which
264       terminate in the local address of the bitmap which changed.
265 
266       The bitmaps are allocated as connections are brought up.  This
267       avoids allocation in the interrupt handling path which queues
268       sages on sockets.  The dense bitmaps let transports send the
269       entire bitmap on any bitmap change reasonably efficiently.  This
270       is much easier to implement than some finer-grained
271       communication of per-port congestion.  The sender does a very
272       inexpensive bit test to test if the port it's about to send to
273       is congested or not.
274 
275 
276 RDS Transport Layer
277 ===================
278 
279   As mentioned above, RDS is not IB-specific. Its code is divided
280   into a general RDS layer and a transport layer.
281 
282   The general layer handles the socket API, congestion handling,
283   loopback, stats, usermem pinning, and the connection state machine.
284 
285   The transport layer handles the details of the transport. The IB
286   transport, for example, handles all the queue pairs, work requests,
287   CM event handlers, and other Infiniband details.
288 
289 
290 RDS Kernel Structures
291 =====================
292 
293   struct rds_message
294     aka possibly "rds_outgoing", the generic RDS layer copies data to
295     be sent and sets header fields as needed, based on the socket API.
296     This is then queued for the individual connection and sent by the
297     connection's transport.
298 
299   struct rds_incoming
300     a generic struct referring to incoming data that can be handed from
301     the transport to the general code and queued by the general code
302     while the socket is awoken. It is then passed back to the transport
303     code to handle the actual copy-to-user.
304 
305   struct rds_socket
306     per-socket information
307 
308   struct rds_connection
309     per-connection information
310 
311   struct rds_transport
312     pointers to transport-specific functions
313 
314   struct rds_statistics
315     non-transport-specific statistics
316 
317   struct rds_cong_map
318     wraps the raw congestion bitmap, contains rbnode, waitq, etc.
319 
320 Connection management
321 =====================
322 
323   Connections may be in UP, DOWN, CONNECTING, DISCONNECTING, and
324   ERROR states.
325 
326   The first time an attempt is made by an RDS socket to send data to
327   a node, a connection is allocated and connected. That connection is
328   then maintained forever -- if there are transport errors, the
329   connection will be dropped and re-established.
330 
331   Dropping a connection while packets are queued will cause queued or
332   partially-sent datagrams to be retransmitted when the connection is
333   re-established.
334 
335 
336 The send path
337 =============
338 
339   rds_sendmsg()
340     - struct rds_message built from incoming data
341     - CMSGs parsed (e.g. RDMA ops)
342     - transport connection alloced and connected if not already
343     - rds_message placed on send queue
344     - send worker awoken
345 
346   rds_send_worker()
347     - calls rds_send_xmit() until queue is empty
348 
349   rds_send_xmit()
350     - transmits congestion map if one is pending
351     - may set ACK_REQUIRED
352     - calls transport to send either non-RDMA or RDMA message
353       (RDMA ops never retransmitted)
354 
355   rds_ib_xmit()
356     - allocs work requests from send ring
357     - adds any new send credits available to peer (h_credits)
358     - maps the rds_message's sg list
359     - piggybacks ack
360     - populates work requests
361     - post send to connection's queue pair
362 
363 The recv path
364 =============
365 
366   rds_ib_recv_cq_comp_handler()
367     - looks at write completions
368     - unmaps recv buffer from device
369     - no errors, call rds_ib_process_recv()
370     - refill recv ring
371 
372   rds_ib_process_recv()
373     - validate header checksum
374     - copy header to rds_ib_incoming struct if start of a new datagram
375     - add to ibinc's fraglist
376     - if competed datagram:
377          - update cong map if datagram was cong update
378          - call rds_recv_incoming() otherwise
379          - note if ack is required
380 
381   rds_recv_incoming()
382     - drop duplicate packets
383     - respond to pings
384     - find the sock associated with this datagram
385     - add to sock queue
386     - wake up sock
387     - do some congestion calculations
388   rds_recvmsg
389     - copy data into user iovec
390     - handle CMSGs
391     - return to application
392 
393 Multipath RDS (mprds)
394 =====================
395   Mprds is multipathed-RDS, primarily intended for RDS-over-TCP
396   (though the concept can be extended to other transports). The classical
397   implementation of RDS-over-TCP is implemented by demultiplexing multiple
398   PF_RDS sockets between any 2 endpoints (where endpoint == [IP address,
399   port]) over a single TCP socket between the 2 IP addresses involved. This
400   has the limitation that it ends up funneling multiple RDS flows over a
401   single TCP flow, thus it is
402   (a) upper-bounded to the single-flow bandwidth,
403   (b) suffers from head-of-line blocking for all the RDS sockets.
404 
405   Better throughput (for a fixed small packet size, MTU) can be achieved
406   by having multiple TCP/IP flows per rds/tcp connection, i.e., multipathed
407   RDS (mprds).  Each such TCP/IP flow constitutes a path for the rds/tcp
408   connection. RDS sockets will be attached to a path based on some hash
409   (e.g., of local address and RDS port number) and packets for that RDS
410   socket will be sent over the attached path using TCP to segment/reassemble
411   RDS datagrams on that path.
412 
413   Multipathed RDS is implemented by splitting the struct rds_connection into
414   a common (to all paths) part, and a per-path struct rds_conn_path. All
415   I/O workqs and reconnect threads are driven from the rds_conn_path.
416   Transports such as TCP that are multipath capable may then set up a
417   TCP socket per rds_conn_path, and this is managed by the transport via
418   the transport privatee cp_transport_data pointer.
419 
420   Transports announce themselves as multipath capable by setting the
421   t_mp_capable bit during registration with the rds core module. When the
422   transport is multipath-capable, rds_sendmsg() hashes outgoing traffic
423   across multiple paths. The outgoing hash is computed based on the
424   local address and port that the PF_RDS socket is bound to.
425 
426   Additionally, even if the transport is MP capable, we may be
427   peering with some node that does not support mprds, or supports
428   a different number of paths. As a result, the peering nodes need
429   to agree on the number of paths to be used for the connection.
430   This is done by sending out a control packet exchange before the
431   first data packet. The control packet exchange must have completed
432   prior to outgoing hash completion in rds_sendmsg() when the transport
433   is mutlipath capable.
434 
435   The control packet is an RDS ping packet (i.e., packet to rds dest
436   port 0) with the ping packet having a rds extension header option  of
437   type RDS_EXTHDR_NPATHS, length 2 bytes, and the value is the
438   number of paths supported by the sender. The "probe" ping packet will
439   get sent from some reserved port, RDS_FLAG_PROBE_PORT (in <linux/rds.h>)
440   The receiver of a ping from RDS_FLAG_PROBE_PORT will thus immediately
441   be able to compute the min(sender_paths, rcvr_paths). The pong
442   sent in response to a probe-ping should contain the rcvr's npaths
443   when the rcvr is mprds-capable.
444 
445   If the rcvr is not mprds-capable, the exthdr in the ping will be
446   ignored.  In this case the pong will not have any exthdrs, so the sender
447   of the probe-ping can default to single-path mprds.
448 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php