[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH V4 RESEND 12/22] tap: add Linux multiqueue support
From: |
Jason Wang |
Subject: |
[Qemu-devel] [PATCH V4 RESEND 12/22] tap: add Linux multiqueue support |
Date: |
Fri, 1 Feb 2013 15:39:46 +0800 |
This patch add basic multiqueue support for Linux. When multiqueue is needed, we
will first check whether kernel support multiqueue tap before creating more
queues. Two new functions tap_fd_enable() and tap_fd_disable() were introduced
to enable and disable a specific queue. Since the multiqueue is only supported
in Linux, return error on other platforms.
Signed-off-by: Jason Wang <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
net/tap-aix.c | 10 ++++++++++
net/tap-bsd.c | 10 ++++++++++
net/tap-haiku.c | 10 ++++++++++
net/tap-linux.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
net/tap-solaris.c | 10 ++++++++++
net/tap_int.h | 2 ++
6 files changed, 93 insertions(+), 0 deletions(-)
diff --git a/net/tap-aix.c b/net/tap-aix.c
index aff6c52..66e0574 100644
--- a/net/tap-aix.c
+++ b/net/tap-aix.c
@@ -59,3 +59,13 @@ void tap_fd_set_offload(int fd, int csum, int tso4,
int tso6, int ecn, int ufo)
{
}
+
+int tap_fd_enable(int fd)
+{
+ return -1;
+}
+
+int tap_fd_disable(int fd)
+{
+ return -1;
+}
diff --git a/net/tap-bsd.c b/net/tap-bsd.c
index 01c705b..5ed2d16 100644
--- a/net/tap-bsd.c
+++ b/net/tap-bsd.c
@@ -145,3 +145,13 @@ void tap_fd_set_offload(int fd, int csum, int tso4,
int tso6, int ecn, int ufo)
{
}
+
+int tap_fd_enable(int fd)
+{
+ return -1;
+}
+
+int tap_fd_disable(int fd)
+{
+ return -1;
+}
diff --git a/net/tap-haiku.c b/net/tap-haiku.c
index 08cc034..0f1b1fe 100644
--- a/net/tap-haiku.c
+++ b/net/tap-haiku.c
@@ -59,3 +59,13 @@ void tap_fd_set_offload(int fd, int csum, int tso4,
int tso6, int ecn, int ufo)
{
}
+
+int tap_fd_enable(int fd)
+{
+ return -1;
+}
+
+int tap_fd_disable(int fd)
+{
+ return -1;
+}
diff --git a/net/tap-linux.c b/net/tap-linux.c
index 0a6acc7..42376cc 100644
--- a/net/tap-linux.c
+++ b/net/tap-linux.c
@@ -41,6 +41,7 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
int vnet_hdr_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) {
@@ -76,6 +77,20 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
int vnet_hdr_required
ioctl(fd, TUNSETVNETHDRSZ, &len);
}
+ if (mq_required) {
+ unsigned int features;
+
+ if ((ioctl(fd, TUNGETFEATURES, &features) != 0) ||
+ !(features & IFF_MULTI_QUEUE)) {
+ error_report("multiqueue required, but no kernel "
+ "support for IFF_MULTI_QUEUE available");
+ close(fd);
+ return -1;
+ } else {
+ ifr.ifr_flags |= IFF_MULTI_QUEUE;
+ }
+ }
+
if (ifname[0] != '\0')
pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
else
@@ -209,3 +224,39 @@ void tap_fd_set_offload(int fd, int csum, int tso4,
}
}
}
+
+/* Enable a specific queue of tap. */
+int tap_fd_enable(int fd)
+{
+ struct ifreq ifr;
+ int ret;
+
+ memset(&ifr, 0, sizeof(ifr));
+
+ ifr.ifr_flags = IFF_ATTACH_QUEUE;
+ ret = ioctl(fd, TUNSETQUEUE, (void *) &ifr);
+
+ if (ret != 0) {
+ error_report("could not enable queue");
+ }
+
+ return ret;
+}
+
+/* Disable a specific queue of tap/ */
+int tap_fd_disable(int fd)
+{
+ struct ifreq ifr;
+ int ret;
+
+ memset(&ifr, 0, sizeof(ifr));
+
+ ifr.ifr_flags = IFF_DETACH_QUEUE;
+ ret = ioctl(fd, TUNSETQUEUE, (void *) &ifr);
+
+ if (ret != 0) {
+ error_report("could not disable queue");
+ }
+
+ return ret;
+}
diff --git a/net/tap-solaris.c b/net/tap-solaris.c
index 486a7ea..cc08e9e 100644
--- a/net/tap-solaris.c
+++ b/net/tap-solaris.c
@@ -225,3 +225,13 @@ void tap_fd_set_offload(int fd, int csum, int tso4,
int tso6, int ecn, int ufo)
{
}
+
+int tap_fd_enable(int fd)
+{
+ return -1;
+}
+
+int tap_fd_disable(int fd)
+{
+ return -1;
+}
diff --git a/net/tap_int.h b/net/tap_int.h
index 1dffe12..ca1c21b 100644
--- a/net/tap_int.h
+++ b/net/tap_int.h
@@ -42,5 +42,7 @@ int tap_probe_vnet_hdr_len(int fd, int len);
int tap_probe_has_ufo(int fd);
void tap_fd_set_offload(int fd, int csum, int tso4, int tso6, int ecn, int
ufo);
void tap_fd_set_vnet_hdr_len(int fd, int len);
+int tap_fd_enable(int fd);
+int tap_fd_disable(int fd);
#endif /* QEMU_TAP_H */
--
1.7.1
- [Qemu-devel] [PATCH V4 RESEND 13/22] tap: support enabling or disabling a queue, (continued)
- [Qemu-devel] [PATCH V4 RESEND 13/22] tap: support enabling or disabling a queue, Jason Wang, 2013/02/01
- [Qemu-devel] [PATCH V4 RESEND 14/22] tap: introduce a helper to get the name of an interface, Jason Wang, 2013/02/01
- [Qemu-devel] [PATCH V4 RESEND 18/22] virtio: add a queue_index to VirtQueue, Jason Wang, 2013/02/01
- [Qemu-devel] [PATCH V4 RESEND 19/22] virtio-net: separate virtqueue from VirtIONet, Jason Wang, 2013/02/01
- [Qemu-devel] [PATCH V4 RESEND 15/22] tap: multiqueue support, Jason Wang, 2013/02/01
- [Qemu-devel] [PATCH V4 RESEND 17/22] virtio: introduce virtio_del_queue(), Jason Wang, 2013/02/01
- [Qemu-devel] [PATCH V4 RESEND 21/22] virtio-net: migration support for multiqueue, Jason Wang, 2013/02/01
- [Qemu-devel] [PATCH V4 RESEND 12/22] tap: add Linux multiqueue support,
Jason Wang <=
- [Qemu-devel] [PATCH V4 RESEND 22/22] virtio-net: compat multiqueue support, Jason Wang, 2013/02/01
- [Qemu-devel] [PATCH V4 RESEND 09/22] net: multiqueue support, Jason Wang, 2013/02/01
- Re: [Qemu-devel] [PATCH V4 RESEND 00/22] Multiqueue virtio-net, Jason Wang, 2013/02/01
- [Qemu-devel] [PATCH V4 RESEND 20/22] virtio-net: multiqueue support, Jason Wang, 2013/02/01
- [Qemu-devel] [PATCH V4 RESEND 10/22] tap: import linux multiqueue constants, Jason Wang, 2013/02/01
- [Qemu-devel] [PATCH V4 RESEND 11/22] tap: factor out common tap initialization, Jason Wang, 2013/02/01
- Re: [Qemu-devel] [PATCH V4 RESEND 00/22] Multiqueue virtio-net, Anthony Liguori, 2013/02/04