1589 lines · 41.7 KB · C
RawDownload
/* * Copyright (c) 2006, 2018 Oracle and/or its affiliates. All rights reserved. * * This software is available to you under a choice of one of two * licenses.  You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * *     Redistribution and use in source and binary forms, with or *     without modification, are permitted provided that the following *     conditions are met: * *      - Redistributions of source code must retain the above *        copyright notice, this list of conditions and the following *        disclaimer. * *      - Redistributions in binary form must reproduce the above *        copyright notice, this list of conditions and the following *        disclaimer in the documentation and/or other materials *        provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */#include <linux/kernel.h>#include <linux/moduleparam.h>#include <linux/gfp.h>#include <net/sock.h>#include <linux/in.h>#include <linux/list.h>#include <linux/ratelimit.h>#include <linux/export.h>#include <linux/sizes.h> #include "rds.h" /* When transmitting messages in rds_send_xmit, we need to emerge from * time to time and briefly release the CPU. Otherwise the softlock watchdog * will kick our shin. * Also, it seems fairer to not let one busy connection stall all the * others. * * send_batch_count is the number of times we'll loop in send_xmit. Setting * it to 0 will restore the old behavior (where we looped until we had * drained the queue). */static int send_batch_count = SZ_1K;module_param(send_batch_count, int, 0444);MODULE_PARM_DESC(send_batch_count, " batch factor when working the send queue"); static void rds_send_remove_from_sock(struct list_head *messages, int status); /* * Reset the send state.  Callers must ensure that this doesn't race with * rds_send_xmit(). */void rds_send_path_reset(struct rds_conn_path *cp){	struct rds_message *rm, *tmp;	unsigned long flags; 	if (cp->cp_xmit_rm) {		rm = cp->cp_xmit_rm;		cp->cp_xmit_rm = NULL;		/* Tell the user the RDMA op is no longer mapped by the		 * transport. This isn't entirely true (it's flushed out		 * independently) but as the connection is down, there's		 * no ongoing RDMA to/from that memory */		rds_message_unmapped(rm);		rds_message_put(rm);	} 	cp->cp_xmit_sg = 0;	cp->cp_xmit_hdr_off = 0;	cp->cp_xmit_data_off = 0;	cp->cp_xmit_atomic_sent = 0;	cp->cp_xmit_rdma_sent = 0;	cp->cp_xmit_data_sent = 0; 	cp->cp_conn->c_map_queued = 0; 	cp->cp_unacked_packets = rds_sysctl_max_unacked_packets;	cp->cp_unacked_bytes = rds_sysctl_max_unacked_bytes; 	/* Mark messages as retransmissions, and move them to the send q */	spin_lock_irqsave(&cp->cp_lock, flags);	list_for_each_entry_safe(rm, tmp, &cp->cp_retrans, m_conn_item) {		set_bit(RDS_MSG_ACK_REQUIRED, &rm->m_flags);		set_bit(RDS_MSG_RETRANSMITTED, &rm->m_flags);	}	list_splice_init(&cp->cp_retrans, &cp->cp_send_queue);	spin_unlock_irqrestore(&cp->cp_lock, flags);}EXPORT_SYMBOL_GPL(rds_send_path_reset); static int acquire_in_xmit(struct rds_conn_path *cp){	return test_and_set_bit_lock(RDS_IN_XMIT, &cp->cp_flags) == 0;} static void release_in_xmit(struct rds_conn_path *cp){	clear_bit_unlock(RDS_IN_XMIT, &cp->cp_flags);	/*	 * We don't use wait_on_bit()/wake_up_bit() because our waking is in a	 * hot path and finding waiters is very rare.  We don't want to walk	 * the system-wide hashed waitqueue buckets in the fast path only to	 * almost never find waiters.	 *	 * wq_has_sleeper() supplies the full barrier that orders the wait	 * queue read after the bit clear; clear_bit_unlock() alone is only	 * a release and would let this check read a stale empty queue,	 * losing the wake-up.	 */	if (wq_has_sleeper(&cp->cp_waitq))		wake_up_all(&cp->cp_waitq);} /* * Helper function for multipath fanout to ensure lane 0 transmits queued * messages before other lanes to prevent out-of-order delivery. * * Returns true if lane 0 still has messages or false otherwise */static bool rds_mprds_cp0_catchup(struct rds_connection *conn){	struct rds_conn_path *cp0 = conn->c_path;	struct rds_message *rm0;	unsigned long flags;	bool ret = false; 	spin_lock_irqsave(&cp0->cp_lock, flags); 	/* the oldest / first message in the retransmit queue	 * has to be at or beyond c_cp0_mprds_catchup_tx_seq	 */	if (!list_empty(&cp0->cp_retrans)) {		rm0 = list_entry(cp0->cp_retrans.next, struct rds_message,				 m_conn_item);		if (be64_to_cpu(rm0->m_inc.i_hdr.h_sequence) <		    conn->c_cp0_mprds_catchup_tx_seq) {			/* the retransmit queue of cp_index#0 has not			 * quite caught up yet			 */			ret = true;			goto unlock;		}	} 	/* the oldest / first message of the send queue	 * has to be at or beyond c_cp0_mprds_catchup_tx_seq	 */	rm0 = cp0->cp_xmit_rm;	if (!rm0 && !list_empty(&cp0->cp_send_queue))		rm0 = list_entry(cp0->cp_send_queue.next, struct rds_message,				 m_conn_item);	if (rm0 && be64_to_cpu(rm0->m_inc.i_hdr.h_sequence) <	    conn->c_cp0_mprds_catchup_tx_seq) {		/* the send queue of cp_index#0 has not quite		 * caught up yet		 */		ret = true;	} unlock:	spin_unlock_irqrestore(&cp0->cp_lock, flags);	return ret;} /* * We're making the conscious trade-off here to only send one message * down the connection at a time. *   Pro: *      - tx queueing is a simple fifo list *   	- reassembly is optional and easily done by transports per conn *      - no per flow rx lookup at all, straight to the socket *   	- less per-frag memory and wire overhead *   Con: *      - queued acks can be delayed behind large messages *   Depends: *      - small message latency is higher behind queued large messages *      - large message latency isn't starved by intervening small sends */int rds_send_xmit(struct rds_conn_path *cp){	struct rds_connection *conn = cp->cp_conn;	struct rds_message *rm;	unsigned long flags;	unsigned int tmp;	struct scatterlist *sg;	int ret = 0;	LIST_HEAD(to_be_dropped);	int batch_count;	unsigned long send_gen = 0;	int same_rm = 0; restart:	batch_count = 0; 	/* The drop processing after over_batch relies on	 * rds_send_remove_from_sock() emptying to_be_dropped entry by	 * entry; warn if that post-condition ever stops holding, and	 * re-initialize the list head.	 */	WARN_ON_ONCE(!list_empty(&to_be_dropped));	INIT_LIST_HEAD(&to_be_dropped); 	/*	 * sendmsg calls here after having queued its message on the send	 * queue.  We only have one task feeding the connection at a time.  If	 * another thread is already feeding the queue then we back off.  This	 * avoids blocking the caller and trading per-connection data between	 * caches per message.	 */	if (!acquire_in_xmit(cp)) {		rds_stats_inc(s_send_lock_contention);		ret = -ENOMEM;		goto out;	} 	if (rds_destroy_pending(cp->cp_conn)) {		release_in_xmit(cp);		ret = -ENETUNREACH; /* dont requeue send work */		goto out;	} 	/*	 * we record the send generation after doing the xmit acquire.	 * if someone else manages to jump in and do some work, we'll use	 * this to avoid a goto restart farther down.	 *	 * The acquire_in_xmit() check above ensures that only one	 * caller can increment c_send_gen at any time.	 */	send_gen = READ_ONCE(cp->cp_send_gen) + 1;	WRITE_ONCE(cp->cp_send_gen, send_gen); 	/*	 * rds_conn_shutdown() sets the conn state and then acquires	 * RDS_IN_XMIT; we take the lock first and then check the state.	 * Ownership is decided by the atomic RMW on the cp_flags word:	 * if the teardown won the bit we back off here, and if we won	 * it the teardown waits until we release it.	 */	if (!rds_conn_path_up(cp)) {		release_in_xmit(cp);		ret = 0;		goto out;	} 	if (conn->c_trans->xmit_path_prepare)		conn->c_trans->xmit_path_prepare(cp); 	/*	 * spin trying to push headers and data down the connection until	 * the connection doesn't make forward progress.	 */	while (1) { 		rm = cp->cp_xmit_rm; 		if (!rm) {			same_rm = 0;		} else {			same_rm++;			if (same_rm >= 4096) {				rds_stats_inc(s_send_stuck_rm);				ret = -EAGAIN;				break;			}		} 		/*		 * If between sending messages, we can send a pending congestion		 * map update.		 */		if (!rm && test_and_clear_bit(0, &conn->c_map_queued)) {			rm = rds_cong_update_alloc(conn);			if (IS_ERR(rm)) {				ret = PTR_ERR(rm);				break;			}			rm->data.op_active = 1;			rm->m_inc.i_conn_path = cp;			rm->m_inc.i_conn = cp->cp_conn; 			cp->cp_xmit_rm = rm;		} 		/*		 * If not already working on one, grab the next message.		 *		 * cp_xmit_rm holds a ref while we're sending this message down		 * the connection.  We can use this ref while holding the		 * send_sem.. rds_send_path_reset() is serialized with it.		 */		if (!rm) {			unsigned int len; 			batch_count++; 			/* we want to process as big a batch as we can, but			 * we also want to avoid softlockups.  If we've been			 * through a lot of messages, lets back off and see			 * if anyone else jumps in			 */			if (batch_count >= send_batch_count)				goto over_batch; 			/* make sure cp_index#0 caught up during fan-out in			 * order to avoid lane races			 */			if (cp->cp_index > 0 && rds_mprds_cp0_catchup(conn)) {				rds_stats_inc(s_mprds_catchup_tx0_retries);				goto over_batch;			} 			spin_lock_irqsave(&cp->cp_lock, flags); 			if (!list_empty(&cp->cp_send_queue)) {				rm = list_entry(cp->cp_send_queue.next,						struct rds_message,						m_conn_item);				rds_message_addref(rm); 				/*				 * Move the message from the send queue to the retransmit				 * list right away.				 */				list_move_tail(&rm->m_conn_item,					       &cp->cp_retrans);			} 			spin_unlock_irqrestore(&cp->cp_lock, flags); 			if (!rm)				break; 			/* Unfortunately, the way Infiniband deals with			 * RDMA to a bad MR key is by moving the entire			 * queue pair to error state. We could possibly			 * recover from that, but right now we drop the			 * connection.			 * Therefore, we never retransmit messages with RDMA ops.			 */			if (test_bit(RDS_MSG_FLUSH, &rm->m_flags) ||			    (rm->rdma.op_active &&			    test_bit(RDS_MSG_RETRANSMITTED, &rm->m_flags))) {				spin_lock_irqsave(&cp->cp_lock, flags);				if (test_and_clear_bit(RDS_MSG_ON_CONN,						       &rm->m_flags)) {					/* our ref is put after the batch */					list_move(&rm->m_conn_item,						  &to_be_dropped);					spin_unlock_irqrestore(&cp->cp_lock,							       flags);				} else {					/* already off the conn list; drop					 * the ref taken above ourselves					 */					spin_unlock_irqrestore(&cp->cp_lock,							       flags);					rds_message_put(rm);				}				continue;			} 			/* Require an ACK every once in a while */			len = ntohl(rm->m_inc.i_hdr.h_len);			if (cp->cp_unacked_packets == 0 ||			    cp->cp_unacked_bytes < len) {				set_bit(RDS_MSG_ACK_REQUIRED, &rm->m_flags); 				cp->cp_unacked_packets =					rds_sysctl_max_unacked_packets;				cp->cp_unacked_bytes =					rds_sysctl_max_unacked_bytes;				rds_stats_inc(s_send_ack_required);			} else {				cp->cp_unacked_bytes -= len;				cp->cp_unacked_packets--;			} 			cp->cp_xmit_rm = rm;		} 		/* The transport either sends the whole rdma or none of it */		if (rm->rdma.op_active && !cp->cp_xmit_rdma_sent) {			rm->m_final_op = &rm->rdma;			/* The transport owns the mapped memory for now.			 * You can't unmap it while it's on the send queue			 */			set_bit(RDS_MSG_MAPPED, &rm->m_flags);			ret = conn->c_trans->xmit_rdma(conn, &rm->rdma);			if (ret) {				clear_bit(RDS_MSG_MAPPED, &rm->m_flags);				wake_up_interruptible(&rm->m_flush_wait);				break;			}			cp->cp_xmit_rdma_sent = 1; 		} 		if (rm->atomic.op_active && !cp->cp_xmit_atomic_sent) {			rm->m_final_op = &rm->atomic;			/* The transport owns the mapped memory for now.			 * You can't unmap it while it's on the send queue			 */			set_bit(RDS_MSG_MAPPED, &rm->m_flags);			ret = conn->c_trans->xmit_atomic(conn, &rm->atomic);			if (ret) {				clear_bit(RDS_MSG_MAPPED, &rm->m_flags);				wake_up_interruptible(&rm->m_flush_wait);				break;			}			cp->cp_xmit_atomic_sent = 1; 		} 		/*		 * A number of cases require an RDS header to be sent		 * even if there is no data.		 * We permit 0-byte sends; rds-ping depends on this.		 * However, if there are exclusively attached silent ops,		 * we skip the hdr/data send, to enable silent operation.		 */		if (rm->data.op_nents == 0) {			int ops_present;			int all_ops_are_silent = 1; 			ops_present = (rm->atomic.op_active || rm->rdma.op_active);			if (rm->atomic.op_active && !rm->atomic.op_silent)				all_ops_are_silent = 0;			if (rm->rdma.op_active && !rm->rdma.op_silent)				all_ops_are_silent = 0; 			if (ops_present && all_ops_are_silent			    && !rm->m_rdma_cookie)				rm->data.op_active = 0;		} 		if (rm->data.op_active && !cp->cp_xmit_data_sent) {			rm->m_final_op = &rm->data; 			ret = conn->c_trans->xmit(conn, rm,						  cp->cp_xmit_hdr_off,						  cp->cp_xmit_sg,						  cp->cp_xmit_data_off);			if (ret <= 0)				break; 			if (cp->cp_xmit_hdr_off < sizeof(struct rds_header)) {				tmp = min_t(int, ret,					    sizeof(struct rds_header) -					    cp->cp_xmit_hdr_off);				cp->cp_xmit_hdr_off += tmp;				ret -= tmp;			} 			sg = &rm->data.op_sg[cp->cp_xmit_sg];			while (ret) {				tmp = min_t(int, ret, sg->length -						      cp->cp_xmit_data_off);				cp->cp_xmit_data_off += tmp;				ret -= tmp;				if (cp->cp_xmit_data_off == sg->length) {					cp->cp_xmit_data_off = 0;					sg++;					cp->cp_xmit_sg++;					BUG_ON(ret != 0 && cp->cp_xmit_sg ==					       rm->data.op_nents);				}			} 			if (cp->cp_xmit_hdr_off == sizeof(struct rds_header) &&			    (cp->cp_xmit_sg == rm->data.op_nents))				cp->cp_xmit_data_sent = 1;		} 		/*		 * A rm will only take multiple times through this loop		 * if there is a data op. Thus, if the data is sent (or there was		 * none), then we're done with the rm.		 */		if (!rm->data.op_active || cp->cp_xmit_data_sent) {			cp->cp_xmit_rm = NULL;			cp->cp_xmit_sg = 0;			cp->cp_xmit_hdr_off = 0;			cp->cp_xmit_data_off = 0;			cp->cp_xmit_rdma_sent = 0;			cp->cp_xmit_atomic_sent = 0;			cp->cp_xmit_data_sent = 0;

Lines 1–500 of 1589.