switch ksocknal_lib_recv_...() to use of iov_iter_for_each_range()

... and fold kvec and bio_vec variants in one

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2017-09-25 13:58:39 -04:00
parent 33ec9c5cae
commit 8ececffa12
3 changed files with 25 additions and 109 deletions

View File

@ -696,8 +696,7 @@ int ksocknal_lib_setup_sock(struct socket *so);
int ksocknal_lib_send_iov(struct ksock_conn *conn, struct ksock_tx *tx);
int ksocknal_lib_send_kiov(struct ksock_conn *conn, struct ksock_tx *tx);
void ksocknal_lib_eager_ack(struct ksock_conn *conn);
int ksocknal_lib_recv_iov(struct ksock_conn *conn);
int ksocknal_lib_recv_kiov(struct ksock_conn *conn);
int ksocknal_lib_recv(struct ksock_conn *conn);
int ksocknal_lib_get_conn_tunables(struct ksock_conn *conn, int *txmem,
int *rxmem, int *nagle);

View File

@ -249,16 +249,16 @@ ksocknal_transmit(struct ksock_conn *conn, struct ksock_tx *tx)
}
static int
ksocknal_recv_iov(struct ksock_conn *conn)
ksocknal_recv_iter(struct ksock_conn *conn)
{
int nob;
int rc;
/*
* Never touch conn->ksnc_rx_to or change connection
* status inside ksocknal_lib_recv_iov
* status inside ksocknal_lib_recv
*/
rc = ksocknal_lib_recv_iov(conn);
rc = ksocknal_lib_recv(conn);
if (rc <= 0)
return rc;
@ -274,38 +274,6 @@ ksocknal_recv_iov(struct ksock_conn *conn)
conn->ksnc_rx_nob_left -= nob;
iov_iter_advance(&conn->ksnc_rx_to, nob);
if (iov_iter_count(&conn->ksnc_rx_to))
return -EAGAIN;
return rc;
}
static int
ksocknal_recv_kiov(struct ksock_conn *conn)
{
int nob;
int rc;
/*
* Never touch conn->ksnc_rx_to or change connection
* status inside ksocknal_lib_recv_iov
*/
rc = ksocknal_lib_recv_kiov(conn);
if (rc <= 0)
return rc;
/* received something... */
nob = rc;
conn->ksnc_peer->ksnp_last_alive = cfs_time_current();
conn->ksnc_rx_deadline =
cfs_time_shift(*ksocknal_tunables.ksnd_timeout);
mb(); /* order with setting rx_started */
conn->ksnc_rx_started = 1;
conn->ksnc_rx_nob_left -= nob;
iov_iter_advance(&conn->ksnc_rx_to, nob);
if (iov_iter_count(&conn->ksnc_rx_to))
return -EAGAIN;
@ -335,11 +303,7 @@ ksocknal_receive(struct ksock_conn *conn)
}
for (;;) {
if (conn->ksnc_rx_to.type & ITER_KVEC)
rc = ksocknal_recv_iov(conn);
else
rc = ksocknal_recv_kiov(conn);
rc = ksocknal_recv_iter(conn);
if (rc <= 0) {
/* error/EOF or partial receive */
if (rc == -EAGAIN) {

View File

@ -161,86 +161,39 @@ ksocknal_lib_eager_ack(struct ksock_conn *conn)
sizeof(opt));
}
int
ksocknal_lib_recv_iov(struct ksock_conn *conn)
static int lustre_csum(struct kvec *v, void *context)
{
unsigned int niov = conn->ksnc_rx_to.nr_segs;
const struct iovec *iov = conn->ksnc_rx_to.iov;
struct msghdr msg = {
.msg_flags = 0
};
int i;
int rc;
int fragnob;
int sum;
__u32 saved_csum;
int off = conn->ksnc_rx_to.iov_offset;
msg.msg_iter = conn->ksnc_rx_to;
rc = sock_recvmsg(conn->ksnc_sock, &msg, MSG_DONTWAIT);
saved_csum = 0;
if (conn->ksnc_proto == &ksocknal_protocol_v2x) {
saved_csum = conn->ksnc_msg.ksm_csum;
conn->ksnc_msg.ksm_csum = 0;
}
if (saved_csum) {
/* accumulate checksum */
for (i = 0, sum = rc; sum > 0; i++, sum -= fragnob) {
LASSERT(i < niov);
fragnob = iov[i].iov_len - off;
if (fragnob > sum)
fragnob = sum;
conn->ksnc_rx_csum = crc32_le(conn->ksnc_rx_csum,
iov[i].iov_base + off,
fragnob);
off = 0;
}
conn->ksnc_msg.ksm_csum = saved_csum;
}
return rc;
struct ksock_conn *conn = context;
conn->ksnc_rx_csum = crc32_le(conn->ksnc_rx_csum,
v->iov_base, v->iov_len);
return 0;
}
int
ksocknal_lib_recv_kiov(struct ksock_conn *conn)
ksocknal_lib_recv(struct ksock_conn *conn)
{
unsigned int niov = conn->ksnc_rx_to.nr_segs;
const struct bio_vec *kiov = conn->ksnc_rx_to.bvec;
int off = conn->ksnc_rx_to.iov_offset;
struct msghdr msg = {
.msg_flags = 0
};
int i;
struct msghdr msg = { .msg_iter = conn->ksnc_rx_to };
__u32 saved_csum;
int rc;
void *base;
int sum;
int fragnob;
msg.msg_iter = conn->ksnc_rx_to;
rc = sock_recvmsg(conn->ksnc_sock, &msg, MSG_DONTWAIT);
if (rc <= 0)
return rc;
if (conn->ksnc_msg.ksm_csum) {
for (i = 0, sum = rc; sum > 0; i++, sum -= fragnob) {
LASSERT(i < niov);
saved_csum = conn->ksnc_msg.ksm_csum;
if (!saved_csum)
return rc;
base = kmap(kiov[i].bv_page) + kiov[i].bv_offset + off;
fragnob = kiov[i].bv_len - off;
if (fragnob > sum)
fragnob = sum;
/* header is included only in V2 - V3 checksums only the bulk data */
if (!(conn->ksnc_rx_to.type & ITER_BVEC) &&
conn->ksnc_proto != &ksocknal_protocol_v2x)
return rc;
/* accumulate checksum */
conn->ksnc_msg.ksm_csum = 0;
iov_iter_for_each_range(&conn->ksnc_rx_to, rc, lustre_csum, conn);
conn->ksnc_msg.ksm_csum = saved_csum;
conn->ksnc_rx_csum = crc32_le(conn->ksnc_rx_csum,
base, fragnob);
kunmap(kiov[i].bv_page);
off = 0;
}
}
return rc;
}