For both iSCSI initiator and target increase socket buffer sizes before
establishing connection. This is a workaround for Chelsio TOE driver, that does not update socket buffer size in hardware after connection established, and unless that is done beforehand, kernel code will stuck, attempting to send/receive full PDU at once. MFC after: 1 week
This commit is contained in:
parent
14730efd7e
commit
8b94b5836c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=274853
@ -1199,6 +1199,8 @@ icl_conn_start(struct icl_conn *ic)
|
|||||||
icl_conn_close(ic);
|
icl_conn_close(ic);
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
ic->ic_socket->so_snd.sb_flags |= SB_AUTOSIZE;
|
||||||
|
ic->ic_socket->so_rcv.sb_flags |= SB_AUTOSIZE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disable Nagle.
|
* Disable Nagle.
|
||||||
|
@ -1602,7 +1602,7 @@ conf_apply(struct conf *oldconf, struct conf *newconf)
|
|||||||
struct portal *oldp, *newp;
|
struct portal *oldp, *newp;
|
||||||
struct isns *oldns, *newns;
|
struct isns *oldns, *newns;
|
||||||
pid_t otherpid;
|
pid_t otherpid;
|
||||||
int changed, cumulated_error = 0, error;
|
int changed, cumulated_error = 0, error, sockbuf;
|
||||||
int one = 1;
|
int one = 1;
|
||||||
|
|
||||||
if (oldconf->conf_debug != newconf->conf_debug) {
|
if (oldconf->conf_debug != newconf->conf_debug) {
|
||||||
@ -1899,6 +1899,16 @@ conf_apply(struct conf *oldconf, struct conf *newconf)
|
|||||||
cumulated_error++;
|
cumulated_error++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
sockbuf = SOCKBUF_SIZE;
|
||||||
|
if (setsockopt(newp->p_socket, SOL_SOCKET, SO_RCVBUF,
|
||||||
|
&sockbuf, sizeof(sockbuf)) == -1)
|
||||||
|
log_warn("setsockopt(SO_RCVBUF) failed "
|
||||||
|
"for %s", newp->p_listen);
|
||||||
|
sockbuf = SOCKBUF_SIZE;
|
||||||
|
if (setsockopt(newp->p_socket, SOL_SOCKET, SO_SNDBUF,
|
||||||
|
&sockbuf, sizeof(sockbuf)) == -1)
|
||||||
|
log_warn("setsockopt(SO_SNDBUF) failed "
|
||||||
|
"for %s", newp->p_listen);
|
||||||
error = setsockopt(newp->p_socket, SOL_SOCKET,
|
error = setsockopt(newp->p_socket, SOL_SOCKET,
|
||||||
SO_REUSEADDR, &one, sizeof(one));
|
SO_REUSEADDR, &one, sizeof(one));
|
||||||
if (error != 0) {
|
if (error != 0) {
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
#define MAX_NAME_LEN 223
|
#define MAX_NAME_LEN 223
|
||||||
#define MAX_DATA_SEGMENT_LENGTH (128 * 1024)
|
#define MAX_DATA_SEGMENT_LENGTH (128 * 1024)
|
||||||
#define MAX_BURST_LENGTH 16776192
|
#define MAX_BURST_LENGTH 16776192
|
||||||
|
#define SOCKBUF_SIZE 1048576
|
||||||
|
|
||||||
struct auth {
|
struct auth {
|
||||||
TAILQ_ENTRY(auth) a_next;
|
TAILQ_ENTRY(auth) a_next;
|
||||||
|
@ -160,7 +160,7 @@ connection_new(unsigned int session_id, const uint8_t isid[8], uint16_t tsih,
|
|||||||
#ifdef ICL_KERNEL_PROXY
|
#ifdef ICL_KERNEL_PROXY
|
||||||
struct iscsi_daemon_connect idc;
|
struct iscsi_daemon_connect idc;
|
||||||
#endif
|
#endif
|
||||||
int error;
|
int error, sockbuf;
|
||||||
|
|
||||||
conn = calloc(1, sizeof(*conn));
|
conn = calloc(1, sizeof(*conn));
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
@ -237,6 +237,14 @@ connection_new(unsigned int session_id, const uint8_t isid[8], uint16_t tsih,
|
|||||||
fail(conn, strerror(errno));
|
fail(conn, strerror(errno));
|
||||||
log_err(1, "failed to create socket for %s", from_addr);
|
log_err(1, "failed to create socket for %s", from_addr);
|
||||||
}
|
}
|
||||||
|
sockbuf = SOCKBUF_SIZE;
|
||||||
|
if (setsockopt(conn->conn_socket, SOL_SOCKET, SO_RCVBUF,
|
||||||
|
&sockbuf, sizeof(sockbuf)) == -1)
|
||||||
|
log_warn("setsockopt(SO_RCVBUF) failed");
|
||||||
|
sockbuf = SOCKBUF_SIZE;
|
||||||
|
if (setsockopt(conn->conn_socket, SOL_SOCKET, SO_SNDBUF,
|
||||||
|
&sockbuf, sizeof(sockbuf)) == -1)
|
||||||
|
log_warn("setsockopt(SO_SNDBUF) failed");
|
||||||
if (from_ai != NULL) {
|
if (from_ai != NULL) {
|
||||||
error = bind(conn->conn_socket, from_ai->ai_addr,
|
error = bind(conn->conn_socket, from_ai->ai_addr,
|
||||||
from_ai->ai_addrlen);
|
from_ai->ai_addrlen);
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#define CONN_DIGEST_CRC32C 1
|
#define CONN_DIGEST_CRC32C 1
|
||||||
|
|
||||||
#define CONN_MUTUAL_CHALLENGE_LEN 1024
|
#define CONN_MUTUAL_CHALLENGE_LEN 1024
|
||||||
|
#define SOCKBUF_SIZE 1048576
|
||||||
|
|
||||||
struct connection {
|
struct connection {
|
||||||
int conn_iscsi_fd;
|
int conn_iscsi_fd;
|
||||||
|
Loading…
Reference in New Issue
Block a user