diff options
author | Jason Wang <jasowang@redhat.com> | 2018-09-11 23:17:06 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-09-13 12:25:40 -0400 |
commit | fe8dd45bb7556246c6b76277b1ba4296c91c2505 (patch) | |
tree | 9e31911fda3e7b8ca55238498bf8becead0e3db4 /drivers/vhost | |
parent | 1a097910adda6b3328fc235575bba0e9ee408492 (diff) |
tun: switch to new type of msg_control
This patch introduces to a new tun/tap specific msg_control:
#define TUN_MSG_UBUF 1
#define TUN_MSG_PTR 2
struct tun_msg_ctl {
int type;
void *ptr;
};
This allows us to pass different kinds of msg_control through
sendmsg(). The first supported type is ubuf (TUN_MSG_UBUF) which will
be used by the existed vhost_net zerocopy code. The second is XDP
buff, which allows vhost_net to pass XDP buff to TUN. This could be
used to implement accepting an array of XDP buffs from vhost_net in
the following patches.
Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/vhost')
-rw-r--r-- | drivers/vhost/net.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 4e656f89cb22..fb01ce6d981c 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
@@ -620,6 +620,7 @@ static void handle_tx_zerocopy(struct vhost_net *net, struct socket *sock) | |||
620 | .msg_controllen = 0, | 620 | .msg_controllen = 0, |
621 | .msg_flags = MSG_DONTWAIT, | 621 | .msg_flags = MSG_DONTWAIT, |
622 | }; | 622 | }; |
623 | struct tun_msg_ctl ctl; | ||
623 | size_t len, total_len = 0; | 624 | size_t len, total_len = 0; |
624 | int err; | 625 | int err; |
625 | struct vhost_net_ubuf_ref *uninitialized_var(ubufs); | 626 | struct vhost_net_ubuf_ref *uninitialized_var(ubufs); |
@@ -664,8 +665,10 @@ static void handle_tx_zerocopy(struct vhost_net *net, struct socket *sock) | |||
664 | ubuf->ctx = nvq->ubufs; | 665 | ubuf->ctx = nvq->ubufs; |
665 | ubuf->desc = nvq->upend_idx; | 666 | ubuf->desc = nvq->upend_idx; |
666 | refcount_set(&ubuf->refcnt, 1); | 667 | refcount_set(&ubuf->refcnt, 1); |
667 | msg.msg_control = ubuf; | 668 | msg.msg_control = &ctl; |
668 | msg.msg_controllen = sizeof(ubuf); | 669 | ctl.type = TUN_MSG_UBUF; |
670 | ctl.ptr = ubuf; | ||
671 | msg.msg_controllen = sizeof(ctl); | ||
669 | ubufs = nvq->ubufs; | 672 | ubufs = nvq->ubufs; |
670 | atomic_inc(&ubufs->refcount); | 673 | atomic_inc(&ubufs->refcount); |
671 | nvq->upend_idx = (nvq->upend_idx + 1) % UIO_MAXIOV; | 674 | nvq->upend_idx = (nvq->upend_idx + 1) % UIO_MAXIOV; |