All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Wang <jasowang@redhat.com>
To: mst@redhat.com, qemu-devel@nongnu.org, aliguori@us.ibm.com,
	shajnocz@redhat.com
Cc: krkumar2@in.ibm.com, kvm@vger.kernel.org, mprivozn@redhat.com,
	rusty@rustcorp.com.au, jwhan@filewood.snu.ac.kr,
	shiyer@redhat.com, gaowanlong@cn.fujitsu.com,
	Jason Wang <jasowang@redhat.com>
Subject: [PATCH V3 10/20] tap: add Linux multiqueue support
Date: Tue, 29 Jan 2013 21:51:22 +0800	[thread overview]
Message-ID: <1359467492-31704-11-git-send-email-jasowang@redhat.com> (raw)
In-Reply-To: <1359467492-31704-1-git-send-email-jasowang@redhat.com>

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 <jasowang@redhat.com>
---
 net/tap-aix.c     |   10 ++++++++++
 net/tap-bsd.c     |   11 +++++++++++
 net/tap-haiku.c   |   11 +++++++++++
 net/tap-linux.c   |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 net/tap-solaris.c |   11 +++++++++++
 net/tap_int.h     |    2 ++
 6 files changed, 97 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..cfc7a28 100644
--- a/net/tap-bsd.c
+++ b/net/tap-bsd.c
@@ -145,3 +145,14 @@ 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..664d40f 100644
--- a/net/tap-haiku.c
+++ b/net/tap-haiku.c
@@ -59,3 +59,14 @@ 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 059f5f3..60ea8d0 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,40 @@ 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..12cc392 100644
--- a/net/tap-solaris.c
+++ b/net/tap-solaris.c
@@ -225,3 +225,14 @@ 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


  parent reply	other threads:[~2013-01-29 14:01 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-29 13:51 [PATCH V3 00/20] Multiqueue virtio-net Jason Wang
2013-01-29 13:51 ` [PATCH V3 01/20] net: introduce qemu_get_queue() Jason Wang
2013-01-29 13:51 ` [PATCH V3 02/20] net: introduce qemu_get_nic() Jason Wang
2013-01-29 13:51 ` [PATCH V3 03/20] net: intorduce qemu_del_nic() Jason Wang
2013-01-29 13:51 ` [PATCH V3 04/20] net: introduce qemu_find_net_clients_except() Jason Wang
2013-01-29 13:51 ` [PATCH V3 05/20] net: introduce qemu_net_client_setup() Jason Wang
2013-01-29 13:51 ` [PATCH V3 06/20] net: introduce NetClientState destructor Jason Wang
2013-01-29 13:51 ` [PATCH V3 07/20] net: multiqueue support Jason Wang
2013-01-29 13:51 ` [PATCH V3 08/20] tap: import linux multiqueue constants Jason Wang
2013-01-29 13:51 ` [PATCH V3 09/20] tap: factor out common tap initialization Jason Wang
2013-01-29 13:51 ` Jason Wang [this message]
2013-01-29 13:51 ` [PATCH V3 11/20] tap: support enabling or disabling a queue Jason Wang
2013-01-29 13:51 ` [PATCH V3 12/20] tap: introduce a helper to get the name of an interface Jason Wang
2013-01-29 13:51 ` [PATCH V3 13/20] tap: multiqueue support Jason Wang
2013-01-29 13:51 ` [PATCH V3 14/20] vhost: " Jason Wang
2013-01-29 13:51 ` [PATCH V3 15/20] virtio: introduce virtio_del_queue() Jason Wang
2013-01-29 13:51 ` [PATCH V3 16/20] virtio: add a queue_index to VirtQueue Jason Wang
2013-01-29 13:51 ` [PATCH V3 17/20] virtio-net: separate virtqueue from VirtIONet Jason Wang
2013-01-29 13:51 ` [PATCH V3 18/20] virtio-net: multiqueue support Jason Wang
2013-01-29 13:51 ` [PATCH V3 19/20] virtio-net: migration support for multiqueue Jason Wang
2013-01-29 13:51 ` [PATCH V3 20/20] virtio-net: compat multiqueue support Jason Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1359467492-31704-11-git-send-email-jasowang@redhat.com \
    --to=jasowang@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=gaowanlong@cn.fujitsu.com \
    --cc=jwhan@filewood.snu.ac.kr \
    --cc=krkumar2@in.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=mprivozn@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rusty@rustcorp.com.au \
    --cc=shajnocz@redhat.com \
    --cc=shiyer@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.