Commit e7be235f authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'net-smc-improve-termination-handling-part-3'



Karsten Graul says:

====================
net/smc: improve termination handling (part 3)

Part 3 of the SMC termination patches improves the link group
termination processing and introduces the ability to immediately
terminate a link group.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 43da44c8 0b29ec64
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -32,8 +32,6 @@
#define ISM_UNREG_SBA	0x11
#define ISM_UNREG_IEQ	0x12

#define ISM_ERROR	0xFFFF

struct ism_req_hdr {
	u32 cmd;
	u16 : 16;
+4 −0
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ struct smcd_dmb {
#define ISM_EVENT_GID	1
#define ISM_EVENT_SWR	2

#define ISM_ERROR	0xFFFF

struct smcd_event {
	u32 type;
	u32 code;
@@ -77,6 +79,8 @@ struct smcd_dev {
	bool pnetid_by_user;
	struct list_head lgr_list;
	spinlock_t lgr_lock;
	atomic_t lgr_cnt;
	wait_queue_head_t lgrs_deleted;
	u8 going_away : 1;
};

+3 −0
Original line number Diff line number Diff line
@@ -131,6 +131,9 @@ int smc_cdc_get_slot_and_msg_send(struct smc_connection *conn)
{
	int rc;

	if (!conn->lgr || (conn->lgr->is_smcd && conn->lgr->peer_shutdown))
		return -EPIPE;

	if (conn->lgr->is_smcd) {
		spin_lock_bh(&conn->send_lock);
		rc = smcd_cdc_msg_send(conn);
+1 −1
Original line number Diff line number Diff line
@@ -349,7 +349,7 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
		smc->peer_diagnosis = ntohl(dclc->peer_diagnosis);
		if (((struct smc_clc_msg_decline *)buf)->hdr.flag) {
			smc->conn.lgr->sync_err = 1;
			smc_lgr_terminate(smc->conn.lgr);
			smc_lgr_terminate(smc->conn.lgr, true);
		}
	}

+19 −6
Original line number Diff line number Diff line
@@ -110,6 +110,17 @@ int smc_close_abort(struct smc_connection *conn)
	return smc_cdc_get_slot_and_msg_send(conn);
}

static void smc_close_cancel_work(struct smc_sock *smc)
{
	struct sock *sk = &smc->sk;

	release_sock(sk);
	cancel_work_sync(&smc->conn.close_work);
	cancel_delayed_work_sync(&smc->conn.tx_work);
	lock_sock(sk);
	sk->sk_state = SMC_CLOSED;
}

/* terminate smc socket abnormally - active abort
 * link group is terminated, i.e. RDMA communication no longer possible
 */
@@ -126,23 +137,21 @@ void smc_close_active_abort(struct smc_sock *smc)
	switch (sk->sk_state) {
	case SMC_ACTIVE:
		sk->sk_state = SMC_PEERABORTWAIT;
		release_sock(sk);
		cancel_delayed_work_sync(&smc->conn.tx_work);
		lock_sock(sk);
		smc_close_cancel_work(smc);
		sk->sk_state = SMC_CLOSED;
		sock_put(sk); /* passive closing */
		break;
	case SMC_APPCLOSEWAIT1:
	case SMC_APPCLOSEWAIT2:
		release_sock(sk);
		cancel_delayed_work_sync(&smc->conn.tx_work);
		lock_sock(sk);
		smc_close_cancel_work(smc);
		sk->sk_state = SMC_CLOSED;
		sock_put(sk); /* postponed passive closing */
		break;
	case SMC_PEERCLOSEWAIT1:
	case SMC_PEERCLOSEWAIT2:
	case SMC_PEERFINCLOSEWAIT:
		sk->sk_state = SMC_PEERABORTWAIT;
		smc_close_cancel_work(smc);
		sk->sk_state = SMC_CLOSED;
		smc_conn_free(&smc->conn);
		release_clcsock = true;
@@ -150,7 +159,11 @@ void smc_close_active_abort(struct smc_sock *smc)
		break;
	case SMC_PROCESSABORT:
	case SMC_APPFINCLOSEWAIT:
		sk->sk_state = SMC_PEERABORTWAIT;
		smc_close_cancel_work(smc);
		sk->sk_state = SMC_CLOSED;
		smc_conn_free(&smc->conn);
		release_clcsock = true;
		break;
	case SMC_INIT:
	case SMC_PEERABORTWAIT:
Loading