From patchwork Mon Jan 20 17:07:05 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vincenzo Maffione X-Patchwork-Id: 312679 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 1075E2C009B for ; Tue, 21 Jan 2014 04:12:08 +1100 (EST) Received: from localhost ([::1]:53770 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W5IOL-0003xB-SY for incoming@patchwork.ozlabs.org; Mon, 20 Jan 2014 12:12:05 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40184) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W5IMV-00025G-Ej for qemu-devel@nongnu.org; Mon, 20 Jan 2014 12:10:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W5IMM-0002AN-G3 for qemu-devel@nongnu.org; Mon, 20 Jan 2014 12:10:11 -0500 Received: from mail-ea0-x22e.google.com ([2a00:1450:4013:c01::22e]:58574) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W5IMM-00026l-5j for qemu-devel@nongnu.org; Mon, 20 Jan 2014 12:10:02 -0500 Received: by mail-ea0-f174.google.com with SMTP id b10so3198511eae.5 for ; Mon, 20 Jan 2014 09:10:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=b1mZJOfXkqI1FWV4fUlAGXsM3UPPdS+CYWNyFNMVwQY=; b=NPvTddi1uTxgn28NQKAP1NNyKzHnxYfQ93ClebiBRLRyxMcKxy47XXQQJHXUhdoXB9 LTQ/ZAooO4ZmmlPa0+IhAqOU7Pcrqe9NU/N3BPdW6dyxgbcecxCdttcJswR5Gh4iuhRi 73dA5nZmPtDF5npm9mUE4ZqivClMlg7AzSc3GJ8VvhtdKY6qMpzftlaOAZiYItickWmm 0O1VKEtoyWKz71gsq8k+q7n9ptPXGObWrYU2K4tUKktuKmw7nuEtw6hyGzsSjaN5oxKC iC3NFd6+PE6G7GbRZRND0Jb5uT3+i4GtHmJc4/7Rjx7fI/ZwGpJhb5SVsYVxQL8p7Kfl fMaQ== X-Received: by 10.15.31.196 with SMTP id y44mr2878026eeu.96.1390237801388; Mon, 20 Jan 2014 09:10:01 -0800 (PST) Received: from localhost.localdomain (prova.iet.unipi.it. [131.114.58.86]) by mx.google.com with ESMTPSA id k41sm5157239eey.0.2014.01.20.09.09.59 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 20 Jan 2014 09:10:00 -0800 (PST) From: Vincenzo Maffione To: qemu-devel@nongnu.org Date: Mon, 20 Jan 2014 18:07:05 +0100 Message-Id: <1390237625-29304-6-git-send-email-v.maffione@gmail.com> X-Mailer: git-send-email 1.8.5.2 In-Reply-To: <1390237625-29304-1-git-send-email-v.maffione@gmail.com> References: <1390237625-29304-1-git-send-email-v.maffione@gmail.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:4013:c01::22e Cc: aliguori@amazon.com, marcel.a@redhat.com, jasowang@redhat.com, Vincenzo Maffione , lcapitulino@redhat.com, stefanha@redhat.com, dmitry@daynix.com, pbonzini@redhat.com, g.lettieri@iet.unipi.it, rizzo@iet.unipi.it Subject: [Qemu-devel] [PATCH v3 5/5] net: add offloading support to netmap backend X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Whit this patch, the netmap backend supports TSO/UFO/CSUM offloadings, and accepts the virtio-net header, similarly to what happens with TAP. The offloading callbacks in the NetClientInfo interface have been implemented. Signed-off-by: Vincenzo Maffione --- net/netmap.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/net/netmap.c b/net/netmap.c index 0ccc497..73f6d7a 100644 --- a/net/netmap.c +++ b/net/netmap.c @@ -31,6 +31,7 @@ #include #include "net/net.h" +#include "net/tap.h" #include "clients.h" #include "sysemu/sysemu.h" #include "qemu/error-report.h" @@ -54,6 +55,7 @@ typedef struct NetmapState { bool read_poll; bool write_poll; struct iovec iov[IOV_MAX]; + int vnet_hdr_len; /* Current virtio-net header length. */ } NetmapState; #define D(format, ...) \ @@ -274,7 +276,7 @@ static ssize_t netmap_receive_iov(NetClientState *nc, return iov_size(iov, iovcnt); } - i = ring->cur; + last = i = ring->cur; avail = ring->avail; if (avail < iovcnt) { @@ -394,6 +396,63 @@ static void netmap_cleanup(NetClientState *nc) s->me.fd = -1; } +/* Offloading manipulation support callbacks. */ +static bool netmap_has_ufo(NetClientState *nc) +{ + return true; +} + +static bool netmap_has_vnet_hdr(NetClientState *nc) +{ + return true; +} + +static bool netmap_has_vnet_hdr_len(NetClientState *nc, int len) +{ + return len == 0 || len == sizeof(struct virtio_net_hdr) || + len == sizeof(struct virtio_net_hdr_mrg_rxbuf); +} + +static void netmap_using_vnet_hdr(NetClientState *nc, bool enable) +{ +} + +static void netmap_set_vnet_hdr_len(NetClientState *nc, int len) +{ + NetmapState *s = DO_UPCAST(NetmapState, nc, nc); + int err; + struct nmreq req; + + /* Issue a NETMAP_BDG_VNET_HDR command to change the virtio-net header + * length for the netmap adapter associated to 'me->ifname'. + */ + memset(&req, 0, sizeof(req)); + pstrcpy(req.nr_name, sizeof(req.nr_name), s->me.ifname); + req.nr_version = NETMAP_API; + req.nr_cmd = NETMAP_BDG_VNET_HDR; + req.nr_arg1 = len; + err = ioctl(s->me.fd, NIOCREGIF, &req); + if (err) { + error_report("Unable to execute NETMAP_BDG_VNET_HDR on %s: %s", + s->me.ifname, strerror(errno)); + } else { + /* Keep track of the current length. */ + s->vnet_hdr_len = len; + } +} + +static void netmap_set_offload(NetClientState *nc, int csum, int tso4, int tso6, + int ecn, int ufo) +{ + NetmapState *s = DO_UPCAST(NetmapState, nc, nc); + + /* Setting a virtio-net header length greater than zero automatically + * enables the offloadings. + */ + if (!s->vnet_hdr_len) { + netmap_set_vnet_hdr_len(nc, sizeof(struct virtio_net_hdr)); + } +} /* NetClientInfo methods */ static NetClientInfo net_netmap_info = { @@ -403,6 +462,12 @@ static NetClientInfo net_netmap_info = { .receive_iov = netmap_receive_iov, .poll = netmap_poll, .cleanup = netmap_cleanup, + .has_ufo = netmap_has_ufo, + .has_vnet_hdr = netmap_has_vnet_hdr, + .has_vnet_hdr_len = netmap_has_vnet_hdr_len, + .using_vnet_hdr = netmap_using_vnet_hdr, + .set_offload = netmap_set_offload, + .set_vnet_hdr_len = netmap_set_vnet_hdr_len, }; /* The exported init function @@ -428,6 +493,7 @@ int net_init_netmap(const NetClientOptions *opts, nc = qemu_new_net_client(&net_netmap_info, peer, "netmap", name); s = DO_UPCAST(NetmapState, nc, nc); s->me = me; + s->vnet_hdr_len = 0; netmap_read_poll(s, true); /* Initially only poll for reads. */ return 0;