|
@@ -81,7 +81,7 @@ static inline void smc_cdc_add_pending_send(struct smc_connection *conn,
|
|
sizeof(struct smc_cdc_msg) > SMC_WR_BUF_SIZE,
|
|
sizeof(struct smc_cdc_msg) > SMC_WR_BUF_SIZE,
|
|
"must increase SMC_WR_BUF_SIZE to at least sizeof(struct smc_cdc_msg)");
|
|
"must increase SMC_WR_BUF_SIZE to at least sizeof(struct smc_cdc_msg)");
|
|
BUILD_BUG_ON_MSG(
|
|
BUILD_BUG_ON_MSG(
|
|
- sizeof(struct smc_cdc_msg) != SMC_WR_TX_SIZE,
|
|
|
|
|
|
+ offsetofend(struct smc_cdc_msg, reserved) > SMC_WR_TX_SIZE,
|
|
"must adapt SMC_WR_TX_SIZE to sizeof(struct smc_cdc_msg); if not all smc_wr upper layer protocols use the same message size any more, must start to set link->wr_tx_sges[i].length on each individual smc_wr_tx_send()");
|
|
"must adapt SMC_WR_TX_SIZE to sizeof(struct smc_cdc_msg); if not all smc_wr upper layer protocols use the same message size any more, must start to set link->wr_tx_sges[i].length on each individual smc_wr_tx_send()");
|
|
BUILD_BUG_ON_MSG(
|
|
BUILD_BUG_ON_MSG(
|
|
sizeof(struct smc_cdc_tx_pend) > SMC_WR_TX_PEND_PRIV_SIZE,
|
|
sizeof(struct smc_cdc_tx_pend) > SMC_WR_TX_PEND_PRIV_SIZE,
|
|
@@ -177,23 +177,24 @@ void smc_cdc_tx_dismiss_slots(struct smc_connection *conn)
|
|
int smcd_cdc_msg_send(struct smc_connection *conn)
|
|
int smcd_cdc_msg_send(struct smc_connection *conn)
|
|
{
|
|
{
|
|
struct smc_sock *smc = container_of(conn, struct smc_sock, conn);
|
|
struct smc_sock *smc = container_of(conn, struct smc_sock, conn);
|
|
|
|
+ union smc_host_cursor curs;
|
|
struct smcd_cdc_msg cdc;
|
|
struct smcd_cdc_msg cdc;
|
|
int rc, diff;
|
|
int rc, diff;
|
|
|
|
|
|
memset(&cdc, 0, sizeof(cdc));
|
|
memset(&cdc, 0, sizeof(cdc));
|
|
cdc.common.type = SMC_CDC_MSG_TYPE;
|
|
cdc.common.type = SMC_CDC_MSG_TYPE;
|
|
- cdc.prod_wrap = conn->local_tx_ctrl.prod.wrap;
|
|
|
|
- cdc.prod_count = conn->local_tx_ctrl.prod.count;
|
|
|
|
-
|
|
|
|
- cdc.cons_wrap = conn->local_tx_ctrl.cons.wrap;
|
|
|
|
- cdc.cons_count = conn->local_tx_ctrl.cons.count;
|
|
|
|
- cdc.prod_flags = conn->local_tx_ctrl.prod_flags;
|
|
|
|
- cdc.conn_state_flags = conn->local_tx_ctrl.conn_state_flags;
|
|
|
|
|
|
+ curs.acurs.counter = atomic64_read(&conn->local_tx_ctrl.prod.acurs);
|
|
|
|
+ cdc.prod.wrap = curs.wrap;
|
|
|
|
+ cdc.prod.count = curs.count;
|
|
|
|
+ curs.acurs.counter = atomic64_read(&conn->local_tx_ctrl.cons.acurs);
|
|
|
|
+ cdc.cons.wrap = curs.wrap;
|
|
|
|
+ cdc.cons.count = curs.count;
|
|
|
|
+ cdc.cons.prod_flags = conn->local_tx_ctrl.prod_flags;
|
|
|
|
+ cdc.cons.conn_state_flags = conn->local_tx_ctrl.conn_state_flags;
|
|
rc = smcd_tx_ism_write(conn, &cdc, sizeof(cdc), 0, 1);
|
|
rc = smcd_tx_ism_write(conn, &cdc, sizeof(cdc), 0, 1);
|
|
if (rc)
|
|
if (rc)
|
|
return rc;
|
|
return rc;
|
|
- smc_curs_copy(&conn->rx_curs_confirmed, &conn->local_tx_ctrl.cons,
|
|
|
|
- conn);
|
|
|
|
|
|
+ smc_curs_copy(&conn->rx_curs_confirmed, &curs, conn);
|
|
/* Calculate transmitted data and increment free send buffer space */
|
|
/* Calculate transmitted data and increment free send buffer space */
|
|
diff = smc_curs_diff(conn->sndbuf_desc->len, &conn->tx_curs_fin,
|
|
diff = smc_curs_diff(conn->sndbuf_desc->len, &conn->tx_curs_fin,
|
|
&conn->tx_curs_sent);
|
|
&conn->tx_curs_sent);
|
|
@@ -331,13 +332,16 @@ static void smc_cdc_msg_recv(struct smc_sock *smc, struct smc_cdc_msg *cdc)
|
|
static void smcd_cdc_rx_tsklet(unsigned long data)
|
|
static void smcd_cdc_rx_tsklet(unsigned long data)
|
|
{
|
|
{
|
|
struct smc_connection *conn = (struct smc_connection *)data;
|
|
struct smc_connection *conn = (struct smc_connection *)data;
|
|
|
|
+ struct smcd_cdc_msg *data_cdc;
|
|
struct smcd_cdc_msg cdc;
|
|
struct smcd_cdc_msg cdc;
|
|
struct smc_sock *smc;
|
|
struct smc_sock *smc;
|
|
|
|
|
|
if (!conn)
|
|
if (!conn)
|
|
return;
|
|
return;
|
|
|
|
|
|
- memcpy(&cdc, conn->rmb_desc->cpu_addr, sizeof(cdc));
|
|
|
|
|
|
+ data_cdc = (struct smcd_cdc_msg *)conn->rmb_desc->cpu_addr;
|
|
|
|
+ smcd_curs_copy(&cdc.prod, &data_cdc->prod, conn);
|
|
|
|
+ smcd_curs_copy(&cdc.cons, &data_cdc->cons, conn);
|
|
smc = container_of(conn, struct smc_sock, conn);
|
|
smc = container_of(conn, struct smc_sock, conn);
|
|
smc_cdc_msg_recv(smc, (struct smc_cdc_msg *)&cdc);
|
|
smc_cdc_msg_recv(smc, (struct smc_cdc_msg *)&cdc);
|
|
}
|
|
}
|