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:
Alexander Motin 2014-11-22 15:09:18 +00:00
parent 14730efd7e
commit 8b94b5836c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=274853
5 changed files with 24 additions and 2 deletions

View File

@ -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.

View File

@ -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) {

View File

@ -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;

View File

@ -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);

View File

@ -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;