Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1393109f authored by Mike Christie's avatar Mike Christie Committed by James Bottomley
Browse files

[SCSI] cxgb3i: fix cpu use abuse during writes



When doing a lot (128) of large writes (256K) we can hit the cxgb3_snd_win
check pretty easily. The driver's xmit thread then takes 100% of the cpu.

The driver should not be returning -EAGAIN for this problem. It should
be returing -ENOBUFS, then when the window is opened again it should
queue the xmit thread (it already wakes the xmit thread).

Signed-off-by: default avatarMike Christie <michaelc@cs.wisc.edu>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent dd0af9f9
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -1737,7 +1737,7 @@ int cxgb3i_c3cn_send_pdus(struct s3_conn *c3cn, struct sk_buff *skb)
		c3cn_tx_debug("c3cn 0x%p, snd %u - %u > %u.\n",
				c3cn, c3cn->write_seq, c3cn->snd_una,
				cxgb3_snd_win);
		err = -EAGAIN;
		err = -ENOBUFS;
		goto out_err;
	}

@@ -1775,6 +1775,8 @@ done:
out_err:
	if (copied == 0 && err == -EPIPE)
		copied = c3cn->err ? c3cn->err : -EPIPE;
	else
		copied = err;
	goto done;
}

+10 −9
Original line number Diff line number Diff line
@@ -400,7 +400,12 @@ int cxgb3i_conn_xmit_pdu(struct iscsi_task *task)
		return 0;
	}

	if (err < 0 && err != -EAGAIN) {
	if (err == -EAGAIN || err == -ENOBUFS) {
		/* reset skb to send when we are called again */
		tdata->skb = skb;
		return err;
	}

	kfree_skb(skb);
	cxgb3i_tx_debug("itt 0x%x, skb 0x%p, len %u/%u, xmit err %d.\n",
			task->itt, skb, skb->len, skb->data_len, err);
@@ -408,10 +413,6 @@ int cxgb3i_conn_xmit_pdu(struct iscsi_task *task)
	iscsi_conn_failure(task->conn, ISCSI_ERR_XMIT_FAILED);
	return err;
}
	/* reset skb to send when we are called again */
	tdata->skb = skb;
	return -EAGAIN;
}

int cxgb3i_pdu_init(void)
{