Commit 264986e2 authored by Jason Wang's avatar Jason Wang Committed by Anthony Liguori
Browse files

tap: multiqueue support



Recently, linux support multiqueue tap which could let userspace call TUNSETIFF
for a signle device many times to create multiple file descriptors as
independent queues. User could also enable/disabe a specific queue through
TUNSETQUEUE.

The patch adds the generic infrastructure to create multiqueue taps. To achieve
this a new parameter "queues" were introduced to specify how many queues were
expected to be created for tap by qemu itself. Alternatively, management could
also pass multiple pre-created tap file descriptors separated with ':' through a
new parameter fds like -netdev tap,id=hn0,fds="X:Y:..:Z". Multiple vhost file
descriptors could also be passed in this way.

Each TAPState were still associated to a tap fd, which mean multiple TAPStates
were created when user needs multiqueue taps. Since each TAPState contains one
NetClientState, with the multiqueue nic support, an N peers of NetClientState
were built up.

A new parameter, mq_required were introduce in tap_open() to create multiqueue
tap fds.

Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent e5dc0b40
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@ void tap_set_offload(NetClientState *nc, int csum, int tso4, int tso6, int ecn,
void tap_set_vnet_hdr_len(NetClientState *nc, int len);
int tap_enable(NetClientState *nc);
int tap_disable(NetClientState *nc);
int tap_get_ifname(NetClientState *nc, char *ifname);

int tap_get_fd(NetClientState *nc);

+2 −1
Original line number Diff line number Diff line
@@ -25,7 +25,8 @@
#include "tap_int.h"
#include <stdio.h>

int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required)
int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
             int vnet_hdr_required, int mq_required)
{
    fprintf(stderr, "no tap on AIX\n");
    return -1;
+2 −1
Original line number Diff line number Diff line
@@ -33,7 +33,8 @@
#include <net/if_tap.h>
#endif

int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required)
int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
             int vnet_hdr_required, int mq_required)
{
    int fd;
#ifdef TAPGIFNAME
+2 −1
Original line number Diff line number Diff line
@@ -25,7 +25,8 @@
#include "tap_int.h"
#include <stdio.h>

int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required)
int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
             int vnet_hdr_required, int mq_required)
{
    fprintf(stderr, "no tap on Haiku\n");
    return -1;
+2 −2
Original line number Diff line number Diff line
@@ -36,12 +36,12 @@

#define PATH_NET_TUN "/dev/net/tun"

int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required)
int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
             int vnet_hdr_required, int mq_required)
{
    struct ifreq ifr;
    int fd, ret;
    int len = sizeof(struct virtio_net_hdr);
    int mq_required = 0;

    TFR(fd = open(PATH_NET_TUN, O_RDWR));
    if (fd < 0) {
Loading