From patchwork Thu Aug 30 14:27:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sameeh Jubran X-Patchwork-Id: 963904 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=daynix.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=daynix-com.20150623.gappssmtp.com header.i=@daynix-com.20150623.gappssmtp.com header.b="IS9Xr2RO"; dkim-atps=neutral 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 421QHY3MB8z9s7c for ; Fri, 31 Aug 2018 00:44:25 +1000 (AEST) Received: from localhost ([::1]:49306 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fvOBL-00074I-4D for incoming@patchwork.ozlabs.org; Thu, 30 Aug 2018 10:44:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33918) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fvOAP-0005zO-8U for qemu-devel@nongnu.org; Thu, 30 Aug 2018 10:43:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fvNut-0003eS-8Q for qemu-devel@nongnu.org; Thu, 30 Aug 2018 10:27:24 -0400 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:37706) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fvNus-0003d4-Ts for qemu-devel@nongnu.org; Thu, 30 Aug 2018 10:27:23 -0400 Received: by mail-wm0-x242.google.com with SMTP id n11-v6so2227062wmc.2 for ; Thu, 30 Aug 2018 07:27:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+7vau5STesULGW63tq7/sSuCO0T+3e3txQ/MFYTkhwk=; b=IS9Xr2ROac8o4h5c4KD8+5ljTXOY3Y0L2xFCt4x/Cox44jYaXFU13VCPm7NXZuBcw6 iJXCOk9UuAZpKjzZcPC8gtSzLTcSTyY8efH5r7v36CejvbMBqGjJy1CNo+We8EwM/v2z JlZamjddSgOmJxYWoRDLAIDKU0KfvdczRFYEC7R/ZTW1W1NEbwXQr4/tKrFd4Vr659CQ b5h/MNTr2DPq4oHivdjMNN/dwprAj/+CWwX+g4xU+zNNn/h5Ye/SAPCT/4AdKAobXR50 m4P3SOmDvjBrq9jVYeAK8yOWt/QXtzFD50rPZN5LjjU0mOwmHfbU7IyCFNJSID8M/nGu PrjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+7vau5STesULGW63tq7/sSuCO0T+3e3txQ/MFYTkhwk=; b=NJyjwMcMKyfiPTwtcI/K2hmXRbbBxMLaNj8AjTTydXgOSnpI28IsRgWou6yvdY0zh9 adoj+E5lFY89MMXNr0gZyJ3G4kWw3iZsFHs4kQFW5cLvpXpCXa/46DR38pEDd8OTm8QE Yio1pCV0FlTAGOrkD8DvcRGB0hSRwktpYreUO4n7KBNn2jk9KfB+EcWgeC7ECGgxX85l r0aimuuCYFGR8aFlToHvqtrbQO5iXWTfC3YaXNRfFqIFcDPE9ALSWzykiIr8XMgl0CS1 Leq8/vBeGMEj5aRouirQZB9GH6IxIOl40ZhIx3KLiFoMQ3UjxPrKv2CISyiHBB26jOT+ 68qA== X-Gm-Message-State: APzg51C7Fr+gjiRlZc9qctOK/1wDrr7FyDDmShKYdtYVEu2edO1iKfO/ 67a09JB53CPLH0kPX7T6Cmo/DUSEAQg= X-Google-Smtp-Source: ANB0VdZnikA/07uhDz95f+7y7eVDFY89Vz0DLyGUE3xvASOYgM4HFvbs70CFPMvGPdnh0f3izTUXog== X-Received: by 2002:a1c:b213:: with SMTP id b19-v6mr1908407wmf.141.1535639240462; Thu, 30 Aug 2018 07:27:20 -0700 (PDT) Received: from bark.daynix ([141.226.163.173]) by smtp.gmail.com with ESMTPSA id t4-v6sm10483893wrb.45.2018.08.30.07.27.19 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 30 Aug 2018 07:27:19 -0700 (PDT) From: Sameeh Jubran To: qemu-devel@nongnu.org, Jason Wang Date: Thu, 30 Aug 2018 17:27:07 +0300 Message-Id: <20180830142708.14311-6-sameeh@daynix.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180830142708.14311-1-sameeh@daynix.com> References: <20180830142708.14311-1-sameeh@daynix.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [RFC 5/6] virtio-net: steering mode: Implement rss support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Yan Vugenfirer Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Sameeh Jubran Signed-off-by: Sameeh Jubran --- hw/net/virtio-net.c | 122 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 105 insertions(+), 17 deletions(-) diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index e7c4ce6f66..4a52a6a1d0 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -972,41 +972,129 @@ static int virtio_net_handle_mq(VirtIONet *n, uint8_t cmd, return VIRTIO_NET_OK; } -static int virtio_net_ctrl_steering_mode(VirtIONet *n, uint8_t cmd, + +static int virtio_net_ctrl_sm_rss(VirtIONet *n, uint32_t cmd, struct iovec *iov, unsigned int iov_cnt, struct iovec *iov_in, unsigned int iov_cnt_in, - size_t *size_in) + size_t *size_in) +{ + size_t s; + uint32_t supported_hash_function = 0; + + switch (cmd) { + case VIRTIO_NET_SM_CTRL_RSS_GET_SUPPORTED_FUNCTIONS: + supported_hash_function |= RSS_HASH_FUNCTION_TOEPLITZ; + if (!size_in) { + return VIRTIO_NET_ERR; + } + s = iov_from_buf(iov_in, iov_cnt_in, 0, + &supported_hash_function, + supported_hash_function); + if (s != sizeof(n->supported_modes) || + !size_in) { + return VIRTIO_NET_ERR; + } + *size_in = s; + break; + case VIRTIO_NET_SM_CTRL_RSS_SET: + if (!n->rss_conf) { + n->rss_conf = g_malloc0( + sizeof(struct virtio_net_rss_conf)); + } else if (iov == NULL || iov_cnt == 0) { + g_free(n->rss_conf->ptrs.hash_key); + g_free(n->rss_conf->ptrs.indirection_table); + g_free(n->rss_conf); + return VIRTIO_NET_OK; + } + s = iov_to_buf(iov, iov_cnt, 0, n->rss_conf, + sizeof(struct virtio_net_rss_conf) - + sizeof(struct virtio_net_rss_conf_ptrs)); + + if (s != sizeof(struct virtio_net_rss_conf) - + sizeof(struct virtio_net_rss_conf_ptrs)) { + return VIRTIO_NET_ERR; + } + n->rss_conf->ptrs.hash_key = g_malloc0(sizeof(uint8_t) * + n->rss_conf->hash_key_length); + s = iov_to_buf(iov, iov_cnt, 0, n->rss_conf->ptrs.hash_key, + sizeof(uint8_t) * n->rss_conf->hash_key_length); + if (s != sizeof(uint8_t) * n->rss_conf->hash_key_length) { + g_free(n->rss_conf->ptrs.hash_key); + return VIRTIO_NET_ERR; + } + n->rss_conf->ptrs.indirection_table + = g_malloc0(sizeof(uint32_t) * + n->rss_conf->indirection_table_length); + s = iov_to_buf(iov, iov_cnt, 0, + n->rss_conf->ptrs.indirection_table, sizeof(uint32_t) * + n->rss_conf->indirection_table_length); + if (s != sizeof(uint32_t) * + n->rss_conf->indirection_table_length) { + g_free(n->rss_conf->ptrs.hash_key); + g_free(n->rss_conf->ptrs.indirection_table); + return VIRTIO_NET_ERR; + } + /* do bpf magic */ + break; + default: + return VIRTIO_NET_ERR; + } + + return VIRTIO_NET_OK; +} + +static int virtio_net_ctrl_steering_mode(VirtIONet *n, uint8_t cmd, + struct iovec *iov, unsigned int iov_cnt, + struct iovec *iov_in, unsigned int iov_in_cnt, + size_t *size_in) { size_t s; struct virtio_net_steering_mode sm; + int status = 0; + size_t size_in_cmd = 0; switch (cmd) { case VIRTIO_NET_CTRL_SM_GET_SUPPORTED_MODES: if (!size_in) { return VIRTIO_NET_ERR; } - s = iov_from_buf(iov_in, iov_cnt_in, 0, - &n->supported_modes, sizeof(n->supported_modes)); + n->supported_modes.steering_modes |= STEERING_MODE_RSS | + STEERING_MODE_AUTO; + s = iov_from_buf(iov_in, iov_in_cnt, 0, + &n->supported_modes, + sizeof(n->supported_modes)); if (s != sizeof(n->supported_modes) || - !size_in) { + !size_in) { return VIRTIO_NET_ERR; } - *size_in = s; - break; + *size_in = s; + break; case VIRTIO_NET_CTRL_SM_CONTROL: - s = iov_to_buf(iov, iov_cnt, 0, &sm, sizeof(sm) - - sizeof(union command_data)); - if (s != sizeof(sm) - sizeof(union command_data)) { + s = iov_to_buf(iov, iov_cnt, 0, &sm, sizeof(sm)); + if (s != sizeof(sm)) { + return VIRTIO_NET_ERR; + } + iov_discard_front(&iov, &iov_cnt, sizeof(sm)); + /* TODO handle the case where we change mode, call the old */ + /* mode function with null ptrs should do the trick of */ + /* freeing any resources */ + switch (sm.steering_mode) { + case STEERING_MODE_AUTO: + break; + case STEERING_MODE_RSS: + status = virtio_net_ctrl_sm_rss(n, sm.command, + iov, iov_cnt, iov_in, iov_in_cnt, + &size_in_cmd); + if (status == VIRTIO_NET_OK && size_in_cmd > 0) { + *size_in += size_in_cmd; + } + break; + default: return VIRTIO_NET_ERR; } - /* switch (cmd) - { - dafault: - return VIRTIO_NET_ERR; - } */ - break; + break; default: - return VIRTIO_NET_ERR; + return VIRTIO_NET_ERR; } return VIRTIO_NET_OK;