Skip to content

Commit 6e5f59a

Browse files
committed
Merge branch 'for-davem-2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
More iov_iter work for the networking from Al Viro. Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 6c702fa + 218321e commit 6e5f59a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+628
-1038
lines changed

crypto/algif_hash.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
4242
struct alg_sock *ask = alg_sk(sk);
4343
struct hash_ctx *ctx = ask->private;
4444
unsigned long iovlen;
45-
struct iovec *iov;
45+
const struct iovec *iov;
4646
long copied = 0;
4747
int err;
4848

@@ -58,7 +58,7 @@ static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
5858

5959
ctx->more = 0;
6060

61-
for (iov = msg->msg_iov, iovlen = msg->msg_iovlen; iovlen > 0;
61+
for (iov = msg->msg_iter.iov, iovlen = msg->msg_iter.nr_segs; iovlen > 0;
6262
iovlen--, iov++) {
6363
unsigned long seglen = iov->iov_len;
6464
char __user *from = iov->iov_base;

crypto/algif_skcipher.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,13 +429,13 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock,
429429
struct skcipher_sg_list *sgl;
430430
struct scatterlist *sg;
431431
unsigned long iovlen;
432-
struct iovec *iov;
432+
const struct iovec *iov;
433433
int err = -EAGAIN;
434434
int used;
435435
long copied = 0;
436436

437437
lock_sock(sk);
438-
for (iov = msg->msg_iov, iovlen = msg->msg_iovlen; iovlen > 0;
438+
for (iov = msg->msg_iter.iov, iovlen = msg->msg_iter.nr_segs; iovlen > 0;
439439
iovlen--, iov++) {
440440
unsigned long seglen = iov->iov_len;
441441
char __user *from = iov->iov_base;

drivers/misc/vmw_vmci/vmci_queue_pair.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <linux/uio.h>
2828
#include <linux/wait.h>
2929
#include <linux/vmalloc.h>
30+
#include <linux/skbuff.h>
3031

3132
#include "vmci_handle_array.h"
3233
#include "vmci_queue_pair.h"
@@ -429,11 +430,11 @@ static int __qp_memcpy_from_queue(void *dest,
429430
to_copy = size - bytes_copied;
430431

431432
if (is_iovec) {
432-
struct iovec *iov = (struct iovec *)dest;
433+
struct msghdr *msg = dest;
433434
int err;
434435

435436
/* The iovec will track bytes_copied internally. */
436-
err = memcpy_toiovec(iov, (u8 *)va + page_offset,
437+
err = memcpy_to_msg(msg, (u8 *)va + page_offset,
437438
to_copy);
438439
if (err != 0) {
439440
if (kernel_if->host)
@@ -3264,13 +3265,13 @@ EXPORT_SYMBOL_GPL(vmci_qpair_enquev);
32643265
* of bytes dequeued or < 0 on error.
32653266
*/
32663267
ssize_t vmci_qpair_dequev(struct vmci_qp *qpair,
3267-
void *iov,
3268+
struct msghdr *msg,
32683269
size_t iov_size,
32693270
int buf_type)
32703271
{
32713272
ssize_t result;
32723273

3273-
if (!qpair || !iov)
3274+
if (!qpair)
32743275
return VMCI_ERROR_INVALID_ARGS;
32753276

32763277
qp_lock(qpair);
@@ -3279,7 +3280,7 @@ ssize_t vmci_qpair_dequev(struct vmci_qp *qpair,
32793280
result = qp_dequeue_locked(qpair->produce_q,
32803281
qpair->consume_q,
32813282
qpair->consume_q_size,
3282-
iov, iov_size,
3283+
msg, iov_size,
32833284
qp_memcpy_from_queue_iov,
32843285
true);
32853286

@@ -3308,13 +3309,13 @@ EXPORT_SYMBOL_GPL(vmci_qpair_dequev);
33083309
* of bytes peeked or < 0 on error.
33093310
*/
33103311
ssize_t vmci_qpair_peekv(struct vmci_qp *qpair,
3311-
void *iov,
3312+
struct msghdr *msg,
33123313
size_t iov_size,
33133314
int buf_type)
33143315
{
33153316
ssize_t result;
33163317

3317-
if (!qpair || !iov)
3318+
if (!qpair)
33183319
return VMCI_ERROR_INVALID_ARGS;
33193320

33203321
qp_lock(qpair);
@@ -3323,7 +3324,7 @@ ssize_t vmci_qpair_peekv(struct vmci_qp *qpair,
33233324
result = qp_dequeue_locked(qpair->produce_q,
33243325
qpair->consume_q,
33253326
qpair->consume_q_size,
3326-
iov, iov_size,
3327+
msg, iov_size,
33273328
qp_memcpy_from_queue_iov,
33283329
false);
33293330

drivers/net/macvtap.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,22 +1095,18 @@ static int macvtap_sendmsg(struct kiocb *iocb, struct socket *sock,
10951095
struct msghdr *m, size_t total_len)
10961096
{
10971097
struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock);
1098-
struct iov_iter from;
1099-
iov_iter_init(&from, WRITE, m->msg_iov, m->msg_iovlen, total_len);
1100-
return macvtap_get_user(q, m, &from, m->msg_flags & MSG_DONTWAIT);
1098+
return macvtap_get_user(q, m, &m->msg_iter, m->msg_flags & MSG_DONTWAIT);
11011099
}
11021100

11031101
static int macvtap_recvmsg(struct kiocb *iocb, struct socket *sock,
11041102
struct msghdr *m, size_t total_len,
11051103
int flags)
11061104
{
11071105
struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock);
1108-
struct iov_iter to;
11091106
int ret;
11101107
if (flags & ~(MSG_DONTWAIT|MSG_TRUNC))
11111108
return -EINVAL;
1112-
iov_iter_init(&to, READ, m->msg_iov, m->msg_iovlen, total_len);
1113-
ret = macvtap_do_read(q, &to, flags & MSG_DONTWAIT);
1109+
ret = macvtap_do_read(q, &m->msg_iter, flags & MSG_DONTWAIT);
11141110
if (ret > total_len) {
11151111
m->msg_flags |= MSG_TRUNC;
11161112
ret = flags & MSG_TRUNC ? ret : total_len;

drivers/net/ppp/ppp_generic.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ static ssize_t ppp_read(struct file *file, char __user *buf,
417417
ssize_t ret;
418418
struct sk_buff *skb = NULL;
419419
struct iovec iov;
420+
struct iov_iter to;
420421

421422
ret = count;
422423

@@ -462,7 +463,8 @@ static ssize_t ppp_read(struct file *file, char __user *buf,
462463
ret = -EFAULT;
463464
iov.iov_base = buf;
464465
iov.iov_len = count;
465-
if (skb_copy_datagram_iovec(skb, 0, &iov, skb->len))
466+
iov_iter_init(&to, READ, &iov, 1, count);
467+
if (skb_copy_datagram_iter(skb, 0, &to, skb->len))
466468
goto outf;
467469
ret = skb->len;
468470

drivers/net/tun.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,13 +1449,11 @@ static int tun_sendmsg(struct kiocb *iocb, struct socket *sock,
14491449
int ret;
14501450
struct tun_file *tfile = container_of(sock, struct tun_file, socket);
14511451
struct tun_struct *tun = __tun_get(tfile);
1452-
struct iov_iter from;
14531452

14541453
if (!tun)
14551454
return -EBADFD;
14561455

1457-
iov_iter_init(&from, WRITE, m->msg_iov, m->msg_iovlen, total_len);
1458-
ret = tun_get_user(tun, tfile, m->msg_control, &from,
1456+
ret = tun_get_user(tun, tfile, m->msg_control, &m->msg_iter,
14591457
m->msg_flags & MSG_DONTWAIT);
14601458
tun_put(tun);
14611459
return ret;
@@ -1467,7 +1465,6 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
14671465
{
14681466
struct tun_file *tfile = container_of(sock, struct tun_file, socket);
14691467
struct tun_struct *tun = __tun_get(tfile);
1470-
struct iov_iter to;
14711468
int ret;
14721469

14731470
if (!tun)
@@ -1482,8 +1479,7 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
14821479
SOL_PACKET, TUN_TX_TIMESTAMP);
14831480
goto out;
14841481
}
1485-
iov_iter_init(&to, READ, m->msg_iov, m->msg_iovlen, total_len);
1486-
ret = tun_do_read(tun, tfile, &to, flags & MSG_DONTWAIT);
1482+
ret = tun_do_read(tun, tfile, &m->msg_iter, flags & MSG_DONTWAIT);
14871483
if (ret > total_len) {
14881484
m->msg_flags |= MSG_TRUNC;
14891485
ret = flags & MSG_TRUNC ? ret : total_len;

drivers/target/iscsi/iscsi_target_util.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,21 +1326,19 @@ static int iscsit_do_rx_data(
13261326
struct iscsi_conn *conn,
13271327
struct iscsi_data_count *count)
13281328
{
1329-
int data = count->data_length, rx_loop = 0, total_rx = 0, iov_len;
1330-
struct kvec *iov_p;
1329+
int data = count->data_length, rx_loop = 0, total_rx = 0;
13311330
struct msghdr msg;
13321331

13331332
if (!conn || !conn->sock || !conn->conn_ops)
13341333
return -1;
13351334

13361335
memset(&msg, 0, sizeof(struct msghdr));
1337-
1338-
iov_p = count->iov;
1339-
iov_len = count->iov_count;
1336+
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC,
1337+
count->iov, count->iov_count, data);
13401338

13411339
while (total_rx < data) {
1342-
rx_loop = kernel_recvmsg(conn->sock, &msg, iov_p, iov_len,
1343-
(data - total_rx), MSG_WAITALL);
1340+
rx_loop = sock_recvmsg(conn->sock, &msg,
1341+
(data - total_rx), MSG_WAITALL);
13441342
if (rx_loop <= 0) {
13451343
pr_debug("rx_loop: %d total_rx: %d\n",
13461344
rx_loop, total_rx);

drivers/vhost/net.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,6 @@ static void handle_tx(struct vhost_net *net)
342342
.msg_namelen = 0,
343343
.msg_control = NULL,
344344
.msg_controllen = 0,
345-
.msg_iov = vq->iov,
346345
.msg_flags = MSG_DONTWAIT,
347346
};
348347
size_t len, total_len = 0;
@@ -396,8 +395,8 @@ static void handle_tx(struct vhost_net *net)
396395
}
397396
/* Skip header. TODO: support TSO. */
398397
s = move_iovec_hdr(vq->iov, nvq->hdr, hdr_size, out);
399-
msg.msg_iovlen = out;
400398
len = iov_length(vq->iov, out);
399+
iov_iter_init(&msg.msg_iter, WRITE, vq->iov, out, len);
401400
/* Sanity check */
402401
if (!len) {
403402
vq_err(vq, "Unexpected header len for TX: "
@@ -562,7 +561,6 @@ static void handle_rx(struct vhost_net *net)
562561
.msg_namelen = 0,
563562
.msg_control = NULL, /* FIXME: get and handle RX aux data. */
564563
.msg_controllen = 0,
565-
.msg_iov = vq->iov,
566564
.msg_flags = MSG_DONTWAIT,
567565
};
568566
struct virtio_net_hdr_mrg_rxbuf hdr = {
@@ -600,7 +598,7 @@ static void handle_rx(struct vhost_net *net)
600598
break;
601599
/* On overrun, truncate and discard */
602600
if (unlikely(headcount > UIO_MAXIOV)) {
603-
msg.msg_iovlen = 1;
601+
iov_iter_init(&msg.msg_iter, READ, vq->iov, 1, 1);
604602
err = sock->ops->recvmsg(NULL, sock, &msg,
605603
1, MSG_DONTWAIT | MSG_TRUNC);
606604
pr_debug("Discarded rx packet: len %zd\n", sock_len);
@@ -626,7 +624,7 @@ static void handle_rx(struct vhost_net *net)
626624
/* Copy the header for use in VIRTIO_NET_F_MRG_RXBUF:
627625
* needed because recvmsg can modify msg_iov. */
628626
copy_iovec_hdr(vq->iov, nvq->hdr, sock_hlen, in);
629-
msg.msg_iovlen = in;
627+
iov_iter_init(&msg.msg_iter, READ, vq->iov, in, sock_len);
630628
err = sock->ops->recvmsg(NULL, sock, &msg,
631629
sock_len, MSG_DONTWAIT | MSG_TRUNC);
632630
/* Userspace might have consumed the packet meanwhile:

fs/afs/rxrpc.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,8 @@ static int afs_send_pages(struct afs_call *call, struct msghdr *msg,
306306

307307
_debug("- range %u-%u%s",
308308
offset, to, msg->msg_flags ? " [more]" : "");
309-
msg->msg_iov = (struct iovec *) iov;
310-
msg->msg_iovlen = 1;
309+
iov_iter_init(&msg->msg_iter, WRITE,
310+
(struct iovec *) iov, 1, to - offset);
311311

312312
/* have to change the state *before* sending the last
313313
* packet as RxRPC might give us the reply before it
@@ -384,8 +384,8 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
384384

385385
msg.msg_name = NULL;
386386
msg.msg_namelen = 0;
387-
msg.msg_iov = (struct iovec *) iov;
388-
msg.msg_iovlen = 1;
387+
iov_iter_init(&msg.msg_iter, WRITE, (struct iovec *)iov, 1,
388+
call->request_size);
389389
msg.msg_control = NULL;
390390
msg.msg_controllen = 0;
391391
msg.msg_flags = (call->send_pages ? MSG_MORE : 0);
@@ -778,8 +778,7 @@ void afs_send_empty_reply(struct afs_call *call)
778778
iov[0].iov_len = 0;
779779
msg.msg_name = NULL;
780780
msg.msg_namelen = 0;
781-
msg.msg_iov = iov;
782-
msg.msg_iovlen = 0;
781+
iov_iter_init(&msg.msg_iter, WRITE, iov, 0, 0); /* WTF? */
783782
msg.msg_control = NULL;
784783
msg.msg_controllen = 0;
785784
msg.msg_flags = 0;
@@ -815,8 +814,7 @@ void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len)
815814
iov[0].iov_len = len;
816815
msg.msg_name = NULL;
817816
msg.msg_namelen = 0;
818-
msg.msg_iov = iov;
819-
msg.msg_iovlen = 1;
817+
iov_iter_init(&msg.msg_iter, WRITE, iov, 1, len);
820818
msg.msg_control = NULL;
821819
msg.msg_controllen = 0;
822820
msg.msg_flags = 0;

include/linux/skbuff.h

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2644,24 +2644,17 @@ struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, int noblock,
26442644
int *err);
26452645
unsigned int datagram_poll(struct file *file, struct socket *sock,
26462646
struct poll_table_struct *wait);
2647-
int skb_copy_datagram_iovec(const struct sk_buff *from, int offset,
2648-
struct iovec *to, int size);
2647+
int skb_copy_datagram_iter(const struct sk_buff *from, int offset,
2648+
struct iov_iter *to, int size);
26492649
static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset,
26502650
struct msghdr *msg, int size)
26512651
{
2652-
return skb_copy_datagram_iovec(from, offset, msg->msg_iov, size);
2653-
}
2654-
int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, int hlen,
2655-
struct iovec *iov);
2656-
static inline int skb_copy_and_csum_datagram_msg(struct sk_buff *skb, int hlen,
2657-
struct msghdr *msg)
2658-
{
2659-
return skb_copy_and_csum_datagram_iovec(skb, hlen, msg->msg_iov);
2652+
return skb_copy_datagram_iter(from, offset, &msg->msg_iter, size);
26602653
}
2654+
int skb_copy_and_csum_datagram_msg(struct sk_buff *skb, int hlen,
2655+
struct msghdr *msg);
26612656
int skb_copy_datagram_from_iter(struct sk_buff *skb, int offset,
26622657
struct iov_iter *from, int len);
2663-
int skb_copy_datagram_iter(const struct sk_buff *from, int offset,
2664-
struct iov_iter *to, int size);
26652658
int zerocopy_sg_from_iter(struct sk_buff *skb, struct iov_iter *frm);
26662659
void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
26672660
void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb);
@@ -2689,12 +2682,13 @@ int skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci);
26892682

26902683
static inline int memcpy_from_msg(void *data, struct msghdr *msg, int len)
26912684
{
2692-
return memcpy_fromiovec(data, msg->msg_iov, len);
2685+
/* XXX: stripping const */
2686+
return memcpy_fromiovec(data, (struct iovec *)msg->msg_iter.iov, len);
26932687
}
26942688

26952689
static inline int memcpy_to_msg(struct msghdr *msg, void *data, int len)
26962690
{
2697-
return memcpy_toiovec(msg->msg_iov, data, len);
2691+
return copy_to_iter(data, len, &msg->msg_iter) == len ? 0 : -EFAULT;
26982692
}
26992693

27002694
struct skb_checksum_ops {

include/linux/socket.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ struct linger {
4747
struct msghdr {
4848
void *msg_name; /* ptr to socket address structure */
4949
int msg_namelen; /* size of socket address structure */
50-
struct iovec *msg_iov; /* scatter/gather array */
51-
__kernel_size_t msg_iovlen; /* # elements in msg_iov */
50+
struct iov_iter msg_iter; /* data */
5251
void *msg_control; /* ancillary data */
5352
__kernel_size_t msg_controllen; /* ancillary data buffer length */
5453
unsigned int msg_flags; /* flags on received message */

include/linux/tcp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ struct tcp_sock {
162162
struct {
163163
struct sk_buff_head prequeue;
164164
struct task_struct *task;
165-
struct iovec *iov;
165+
struct msghdr *msg;
166166
int memory;
167167
int len;
168168
} ucopy;

include/linux/uio.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ struct iov_iter {
3131
size_t count;
3232
union {
3333
const struct iovec *iov;
34+
const struct kvec *kvec;
3435
const struct bio_vec *bvec;
3536
};
3637
unsigned long nr_segs;
@@ -82,10 +83,13 @@ size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes,
8283
struct iov_iter *i);
8384
size_t copy_to_iter(void *addr, size_t bytes, struct iov_iter *i);
8485
size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i);
86+
size_t copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i);
8587
size_t iov_iter_zero(size_t bytes, struct iov_iter *);
8688
unsigned long iov_iter_alignment(const struct iov_iter *i);
8789
void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov,
8890
unsigned long nr_segs, size_t count);
91+
void iov_iter_kvec(struct iov_iter *i, int direction, const struct kvec *iov,
92+
unsigned long nr_segs, size_t count);
8993
ssize_t iov_iter_get_pages(struct iov_iter *i, struct page **pages,
9094
size_t maxsize, unsigned maxpages, size_t *start);
9195
ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, struct page ***pages,
@@ -123,9 +127,10 @@ static inline void iov_iter_reexpand(struct iov_iter *i, size_t count)
123127
{
124128
i->count = count;
125129
}
130+
size_t csum_and_copy_to_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i);
131+
size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i);
126132

127133
int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len);
128-
int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len);
129134
int memcpy_fromiovecend(unsigned char *kdata, const struct iovec *iov,
130135
int offset, int len);
131136
int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata,

0 commit comments

Comments
 (0)