Merge branch 'work.sock_recvmsg' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull kern_recvmsg reduction from Al Viro: "kernel_recvmsg() is a set_fs()-using wrapper for sock_recvmsg(). In all but one case that is not needed - use of ITER_KVEC for ->msg_iter takes care of the data and does not care about set_fs(). The only exception is svc_udp_recvfrom() where we want cmsg to be store into kernel object; everything else can just use sock_recvmsg() and be done with that. A followup converting svc_udp_recvfrom() away from set_fs() (and killing kernel_recvmsg() off) is *NOT* in here - I'd like to hear what netdev folks think of the approach proposed in that followup)" * 'work.sock_recvmsg' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: tipc: switch to sock_recvmsg() smc: switch to sock_recvmsg() ipvs: switch to sock_recvmsg() mISDN: switch to sock_recvmsg() drbd: switch to sock_recvmsg() lustre lnet_sock_read(): switch to sock_recvmsg() cfs2: switch to sock_recvmsg() ncpfs: switch to sock_recvmsg() dlm: switch to sock_recvmsg() svc_recvfrom(): switch to sock_recvmsg()
This commit is contained in:
commit
1ed2d76e02
|
@ -1847,7 +1847,7 @@ int drbd_send(struct drbd_connection *connection, struct socket *sock,
|
||||||
void *buf, size_t size, unsigned msg_flags)
|
void *buf, size_t size, unsigned msg_flags)
|
||||||
{
|
{
|
||||||
struct kvec iov = {.iov_base = buf, .iov_len = size};
|
struct kvec iov = {.iov_base = buf, .iov_len = size};
|
||||||
struct msghdr msg;
|
struct msghdr msg = {.msg_flags = msg_flags | MSG_NOSIGNAL};
|
||||||
int rv, sent = 0;
|
int rv, sent = 0;
|
||||||
|
|
||||||
if (!sock)
|
if (!sock)
|
||||||
|
@ -1855,12 +1855,6 @@ int drbd_send(struct drbd_connection *connection, struct socket *sock,
|
||||||
|
|
||||||
/* THINK if (signal_pending) return ... ? */
|
/* THINK if (signal_pending) return ... ? */
|
||||||
|
|
||||||
msg.msg_name = NULL;
|
|
||||||
msg.msg_namelen = 0;
|
|
||||||
msg.msg_control = NULL;
|
|
||||||
msg.msg_controllen = 0;
|
|
||||||
msg.msg_flags = msg_flags | MSG_NOSIGNAL;
|
|
||||||
|
|
||||||
iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, &iov, 1, size);
|
iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, &iov, 1, size);
|
||||||
|
|
||||||
if (sock == connection->data.socket) {
|
if (sock == connection->data.socket) {
|
||||||
|
|
|
@ -516,7 +516,8 @@ static int drbd_recv_short(struct socket *sock, void *buf, size_t size, int flag
|
||||||
struct msghdr msg = {
|
struct msghdr msg = {
|
||||||
.msg_flags = (flags ? flags : MSG_WAITALL | MSG_NOSIGNAL)
|
.msg_flags = (flags ? flags : MSG_WAITALL | MSG_NOSIGNAL)
|
||||||
};
|
};
|
||||||
return kernel_recvmsg(sock, &msg, &iov, 1, size, msg.msg_flags);
|
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, size);
|
||||||
|
return sock_recvmsg(sock, &msg, msg.msg_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int drbd_recv(struct drbd_connection *connection, void *buf, size_t size)
|
static int drbd_recv(struct drbd_connection *connection, void *buf, size_t size)
|
||||||
|
|
|
@ -645,8 +645,10 @@ l1oip_socket_thread(void *data)
|
||||||
{
|
{
|
||||||
struct l1oip *hc = (struct l1oip *)data;
|
struct l1oip *hc = (struct l1oip *)data;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct msghdr msg;
|
|
||||||
struct sockaddr_in sin_rx;
|
struct sockaddr_in sin_rx;
|
||||||
|
struct kvec iov;
|
||||||
|
struct msghdr msg = {.msg_name = &sin_rx,
|
||||||
|
.msg_namelen = sizeof(sin_rx)};
|
||||||
unsigned char *recvbuf;
|
unsigned char *recvbuf;
|
||||||
size_t recvbuf_size = 1500;
|
size_t recvbuf_size = 1500;
|
||||||
int recvlen;
|
int recvlen;
|
||||||
|
@ -661,6 +663,9 @@ l1oip_socket_thread(void *data)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iov.iov_base = recvbuf;
|
||||||
|
iov.iov_len = recvbuf_size;
|
||||||
|
|
||||||
/* make daemon */
|
/* make daemon */
|
||||||
allow_signal(SIGTERM);
|
allow_signal(SIGTERM);
|
||||||
|
|
||||||
|
@ -697,12 +702,6 @@ l1oip_socket_thread(void *data)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* build receive message */
|
|
||||||
msg.msg_name = &sin_rx;
|
|
||||||
msg.msg_namelen = sizeof(sin_rx);
|
|
||||||
msg.msg_control = NULL;
|
|
||||||
msg.msg_controllen = 0;
|
|
||||||
|
|
||||||
/* build send message */
|
/* build send message */
|
||||||
hc->sendmsg.msg_name = &hc->sin_remote;
|
hc->sendmsg.msg_name = &hc->sin_remote;
|
||||||
hc->sendmsg.msg_namelen = sizeof(hc->sin_remote);
|
hc->sendmsg.msg_namelen = sizeof(hc->sin_remote);
|
||||||
|
@ -719,12 +718,9 @@ l1oip_socket_thread(void *data)
|
||||||
printk(KERN_DEBUG "%s: socket created and open\n",
|
printk(KERN_DEBUG "%s: socket created and open\n",
|
||||||
__func__);
|
__func__);
|
||||||
while (!signal_pending(current)) {
|
while (!signal_pending(current)) {
|
||||||
struct kvec iov = {
|
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1,
|
||||||
.iov_base = recvbuf,
|
recvbuf_size);
|
||||||
.iov_len = recvbuf_size,
|
recvlen = sock_recvmsg(socket, &msg, 0);
|
||||||
};
|
|
||||||
recvlen = kernel_recvmsg(socket, &msg, &iov, 1,
|
|
||||||
recvbuf_size, 0);
|
|
||||||
if (recvlen > 0) {
|
if (recvlen > 0) {
|
||||||
l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen);
|
l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -314,19 +314,20 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout)
|
||||||
long jiffies_left = timeout * msecs_to_jiffies(MSEC_PER_SEC);
|
long jiffies_left = timeout * msecs_to_jiffies(MSEC_PER_SEC);
|
||||||
unsigned long then;
|
unsigned long then;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
struct kvec iov = {
|
||||||
|
.iov_base = buffer,
|
||||||
|
.iov_len = nob
|
||||||
|
};
|
||||||
|
struct msghdr msg = {
|
||||||
|
.msg_flags = 0
|
||||||
|
};
|
||||||
|
|
||||||
LASSERT(nob > 0);
|
LASSERT(nob > 0);
|
||||||
LASSERT(jiffies_left > 0);
|
LASSERT(jiffies_left > 0);
|
||||||
|
|
||||||
for (;;) {
|
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, nob);
|
||||||
struct kvec iov = {
|
|
||||||
.iov_base = buffer,
|
|
||||||
.iov_len = nob
|
|
||||||
};
|
|
||||||
struct msghdr msg = {
|
|
||||||
.msg_flags = 0
|
|
||||||
};
|
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
/* Set receive timeout to remaining time */
|
/* Set receive timeout to remaining time */
|
||||||
jiffies_to_timeval(jiffies_left, &tv);
|
jiffies_to_timeval(jiffies_left, &tv);
|
||||||
rc = kernel_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,
|
rc = kernel_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,
|
||||||
|
@ -338,7 +339,7 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
then = jiffies;
|
then = jiffies;
|
||||||
rc = kernel_recvmsg(sock, &msg, &iov, 1, nob, 0);
|
rc = sock_recvmsg(sock, &msg, 0);
|
||||||
jiffies_left -= jiffies - then;
|
jiffies_left -= jiffies - then;
|
||||||
|
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
|
@ -347,10 +348,7 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout)
|
||||||
if (!rc)
|
if (!rc)
|
||||||
return -ECONNRESET;
|
return -ECONNRESET;
|
||||||
|
|
||||||
buffer = ((char *)buffer) + rc;
|
if (!msg_data_left(&msg))
|
||||||
nob -= rc;
|
|
||||||
|
|
||||||
if (!nob)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (jiffies_left <= 0)
|
if (jiffies_left <= 0)
|
||||||
|
|
|
@ -675,9 +675,9 @@ static int receive_from_sock(struct connection *con)
|
||||||
nvec = 2;
|
nvec = 2;
|
||||||
}
|
}
|
||||||
len = iov[0].iov_len + iov[1].iov_len;
|
len = iov[0].iov_len + iov[1].iov_len;
|
||||||
|
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, iov, nvec, len);
|
||||||
|
|
||||||
r = ret = kernel_recvmsg(con->sock, &msg, iov, nvec, len,
|
r = ret = sock_recvmsg(con->sock, &msg, MSG_DONTWAIT | MSG_NOSIGNAL);
|
||||||
MSG_DONTWAIT | MSG_NOSIGNAL);
|
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
goto out_close;
|
goto out_close;
|
||||||
else if (ret == len)
|
else if (ret == len)
|
||||||
|
|
|
@ -39,7 +39,8 @@ static int _recv(struct socket *sock, void *buf, int size, unsigned flags)
|
||||||
{
|
{
|
||||||
struct msghdr msg = {NULL, };
|
struct msghdr msg = {NULL, };
|
||||||
struct kvec iov = {buf, size};
|
struct kvec iov = {buf, size};
|
||||||
return kernel_recvmsg(sock, &msg, &iov, 1, size, flags);
|
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, size);
|
||||||
|
return sock_recvmsg(sock, &msg, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _send(struct socket *sock, const void *buff, int len)
|
static int _send(struct socket *sock, const void *buff, int len)
|
||||||
|
|
|
@ -918,7 +918,8 @@ static int o2net_recv_tcp_msg(struct socket *sock, void *data, size_t len)
|
||||||
{
|
{
|
||||||
struct kvec vec = { .iov_len = len, .iov_base = data, };
|
struct kvec vec = { .iov_len = len, .iov_base = data, };
|
||||||
struct msghdr msg = { .msg_flags = MSG_DONTWAIT, };
|
struct msghdr msg = { .msg_flags = MSG_DONTWAIT, };
|
||||||
return kernel_recvmsg(sock, &msg, &vec, 1, len, msg.msg_flags);
|
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, len);
|
||||||
|
return sock_recvmsg(sock, &msg, MSG_DONTWAIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int o2net_send_tcp_msg(struct socket *sock, struct kvec *vec,
|
static int o2net_send_tcp_msg(struct socket *sock, struct kvec *vec,
|
||||||
|
|
|
@ -1636,17 +1636,14 @@ static int
|
||||||
ip_vs_receive(struct socket *sock, char *buffer, const size_t buflen)
|
ip_vs_receive(struct socket *sock, char *buffer, const size_t buflen)
|
||||||
{
|
{
|
||||||
struct msghdr msg = {NULL,};
|
struct msghdr msg = {NULL,};
|
||||||
struct kvec iov;
|
struct kvec iov = {buffer, buflen};
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
EnterFunction(7);
|
EnterFunction(7);
|
||||||
|
|
||||||
/* Receive a packet */
|
/* Receive a packet */
|
||||||
iov.iov_base = buffer;
|
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, buflen);
|
||||||
iov.iov_len = (size_t)buflen;
|
len = sock_recvmsg(sock, &msg, MSG_DONTWAIT);
|
||||||
|
|
||||||
len = kernel_recvmsg(sock, &msg, &iov, 1, buflen, MSG_DONTWAIT);
|
|
||||||
|
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
return len;
|
return len;
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
|
||||||
struct smc_clc_msg_hdr *clcm = buf;
|
struct smc_clc_msg_hdr *clcm = buf;
|
||||||
struct msghdr msg = {NULL, 0};
|
struct msghdr msg = {NULL, 0};
|
||||||
int reason_code = 0;
|
int reason_code = 0;
|
||||||
struct kvec vec;
|
struct kvec vec = {buf, buflen};
|
||||||
int len, datlen;
|
int len, datlen;
|
||||||
int krflags;
|
int krflags;
|
||||||
|
|
||||||
|
@ -43,12 +43,15 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
|
||||||
* so we don't consume any subsequent CLC message or payload data
|
* so we don't consume any subsequent CLC message or payload data
|
||||||
* in the TCP byte stream
|
* in the TCP byte stream
|
||||||
*/
|
*/
|
||||||
vec.iov_base = buf;
|
/*
|
||||||
vec.iov_len = buflen;
|
* Caller must make sure that buflen is no less than
|
||||||
|
* sizeof(struct smc_clc_msg_hdr)
|
||||||
|
*/
|
||||||
krflags = MSG_PEEK | MSG_WAITALL;
|
krflags = MSG_PEEK | MSG_WAITALL;
|
||||||
smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME;
|
smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME;
|
||||||
len = kernel_recvmsg(smc->clcsock, &msg, &vec, 1,
|
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1,
|
||||||
sizeof(struct smc_clc_msg_hdr), krflags);
|
sizeof(struct smc_clc_msg_hdr));
|
||||||
|
len = sock_recvmsg(smc->clcsock, &msg, krflags);
|
||||||
if (signal_pending(current)) {
|
if (signal_pending(current)) {
|
||||||
reason_code = -EINTR;
|
reason_code = -EINTR;
|
||||||
clc_sk->sk_err = EINTR;
|
clc_sk->sk_err = EINTR;
|
||||||
|
@ -83,12 +86,11 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* receive the complete CLC message */
|
/* receive the complete CLC message */
|
||||||
vec.iov_base = buf;
|
|
||||||
vec.iov_len = buflen;
|
|
||||||
memset(&msg, 0, sizeof(struct msghdr));
|
memset(&msg, 0, sizeof(struct msghdr));
|
||||||
|
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, buflen);
|
||||||
krflags = MSG_WAITALL;
|
krflags = MSG_WAITALL;
|
||||||
smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME;
|
smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME;
|
||||||
len = kernel_recvmsg(smc->clcsock, &msg, &vec, 1, datlen, krflags);
|
len = sock_recvmsg(smc->clcsock, &msg, krflags);
|
||||||
if (len < datlen) {
|
if (len < datlen) {
|
||||||
smc->sk.sk_err = EPROTO;
|
smc->sk.sk_err = EPROTO;
|
||||||
reason_code = -EPROTO;
|
reason_code = -EPROTO;
|
||||||
|
|
|
@ -338,8 +338,8 @@ static int svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr,
|
||||||
rqstp->rq_xprt_hlen = 0;
|
rqstp->rq_xprt_hlen = 0;
|
||||||
|
|
||||||
clear_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
|
clear_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
|
||||||
len = kernel_recvmsg(svsk->sk_sock, &msg, iov, nr, buflen,
|
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, iov, nr, buflen);
|
||||||
msg.msg_flags);
|
len = sock_recvmsg(svsk->sk_sock, &msg, msg.msg_flags);
|
||||||
/* If we read a full record, then assume there may be more
|
/* If we read a full record, then assume there may be more
|
||||||
* data to read (stream based sockets only!)
|
* data to read (stream based sockets only!)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -264,8 +264,8 @@ static int tipc_receive_from_sock(struct tipc_conn *con)
|
||||||
iov.iov_base = buf;
|
iov.iov_base = buf;
|
||||||
iov.iov_len = s->max_rcvbuf_size;
|
iov.iov_len = s->max_rcvbuf_size;
|
||||||
msg.msg_name = &addr;
|
msg.msg_name = &addr;
|
||||||
ret = kernel_recvmsg(con->sock, &msg, &iov, 1, iov.iov_len,
|
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, iov.iov_len);
|
||||||
MSG_DONTWAIT);
|
ret = sock_recvmsg(con->sock, &msg, MSG_DONTWAIT);
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
kmem_cache_free(s->rcvbuf_cache, buf);
|
kmem_cache_free(s->rcvbuf_cache, buf);
|
||||||
goto out_close;
|
goto out_close;
|
||||||
|
|
Loading…
Reference in New Issue