From patchwork Tue Oct 24 13:16:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Boccassi X-Patchwork-Id: 30794 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B629C1B7F0; Tue, 24 Oct 2017 15:16:46 +0200 (CEST) Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by dpdk.org (Postfix) with ESMTP id 18DBC1B7FD for ; Tue, 24 Oct 2017 15:16:43 +0200 (CEST) Received: by mail-wm0-f65.google.com with SMTP id u138so15650275wmu.5 for ; Tue, 24 Oct 2017 06:16:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sAZ0aJlib/wnRbgKjaW/EGzYkzCHxy6S0Xp8z8WSuDQ=; b=I5hG9J2iupjHmmK66+G2RKgObpAhvVk1soVPPb9qnXzUReFrmmy2zRqIL0bKwTnQ2t 5NhBicLcSPHry1Sk4EUb1jaGFBuc0coKgdWony25U57Kmt7fnCb8KbRIrdlq65Lq1m4J NdA9AP4MHx71Ffq9g7P3bVcdhX+WvCosg1EIKMWDq5bxuj8VBMCOm5pZ1hbCjS4ZPguJ l6Irwg7nQQcf066tS3AGsW7KMrsQ/Tosb4LbRb3on66MEaoXS/fgY8jLbPuGLGRqk+8w SMZ4RCrPu6X/0sz7nqVC5+FUTpv66k5p7kWqXczk0pFnGvgbQpNgHOr39YNaXVxHleoZ kxKQ== 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=sAZ0aJlib/wnRbgKjaW/EGzYkzCHxy6S0Xp8z8WSuDQ=; b=EukrhLm37FN3rqhTXYpeJmcCj8BUTVzJmjEwW/eMUOFfGFV9WELPMS6KCKi9jDVbdj uqAe/ULUMTGA1rlT9kS48Zc9wHaoPrnsxyEicr5xCUDyqUpoTplbbATNAGy3D2PPBxec aUr/K4Xq0FKvzJLEiO20jh4FDwczt7bPvd5kGEFvWhrnmCKVhlr/txB8dsMKhfIzGFw0 jqiUycm7/ciWRQrGSeGka+tA4HP+MqVnmQCMFb3QT4xxb9HC8db8/wzYsL7IH72ayn2B +JHrRetq/WKrapA+T1DpWCDNRuNus3iBQ08++tV1k+jM+uvgMD4zzEataCks0TaLq2yP kmIA== X-Gm-Message-State: AMCzsaU98BUq+TOhStHYt+347ShCdaVykFgzVP0nhPqqBcpqGufLaPxb wo1qgj2cHouNL6HIthvEcKPhlNaF X-Google-Smtp-Source: ABhQp+QWTDiI7AR4x5eIx0APq4keCwlaumwp636DkddV448DgGG5Vjb+AW7TBlj4NjUiyFdnWIk8bw== X-Received: by 10.80.215.209 with SMTP id m17mr6785656edj.63.1508851002481; Tue, 24 Oct 2017 06:16:42 -0700 (PDT) Received: from localhost ([213.251.34.151]) by smtp.gmail.com with ESMTPSA id a99sm179938edf.54.2017.10.24.06.16.41 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 24 Oct 2017 06:16:41 -0700 (PDT) From: luca.boccassi@gmail.com To: dev@dpdk.org Cc: wenzhuo.lu@intel.com, wei.dai@intel.com, remy.horton@intel.com, Luca Boccassi Date: Tue, 24 Oct 2017 14:16:28 +0100 Message-Id: <20171024131630.16595-2-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171024131630.16595-1-luca.boccassi@gmail.com> References: <20171024131630.16595-1-luca.boccassi@gmail.com> Subject: [dpdk-dev] [PATCH 1/3] net/i40e: implement VF reset X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Luca Boccassi This reset function will detach then re-attach the device, reconfigure it, and re-setup the Rx/Tx queues. Signed-off-by: Luca Boccassi --- drivers/net/i40e/i40e_ethdev.h | 3 +++ drivers/net/i40e/i40e_ethdev_vf.c | 56 ++++++++++++++++++++++++++++++++++++--- drivers/net/i40e/i40e_rxtx.c | 11 ++++++++ drivers/net/i40e/i40e_rxtx.h | 4 +++ 4 files changed, 70 insertions(+), 4 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h index 2f1905e13..45714959a 100644 --- a/drivers/net/i40e/i40e_ethdev.h +++ b/drivers/net/i40e/i40e_ethdev.h @@ -1047,6 +1047,9 @@ struct i40e_adapter { struct rte_timecounter rx_tstamp_tc; struct rte_timecounter tx_tstamp_tc; + /* For VF reset */ + uint8_t reset_number; + /* ptype mapping table */ uint32_t ptype_tbl[I40E_MAX_PKT_TYPE] __rte_cache_min_aligned; /* flow type to pctype mapping table */ diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c index 9f1487509..333ddb4ca 100644 --- a/drivers/net/i40e/i40e_ethdev_vf.c +++ b/drivers/net/i40e/i40e_ethdev_vf.c @@ -2294,21 +2294,69 @@ i40evf_dev_close(struct rte_eth_dev *dev) i40evf_disable_irq0(hw); } -/* - * Reset VF device only to re-initialize resources in PMD layer - */ +static void +i40e_vf_queue_reset(struct rte_eth_dev *dev) +{ + uint16_t i; + + for (i = 0; i < dev->data->nb_rx_queues; i++) { + struct i40e_rx_queue *rxq = dev->data->rx_queues[i]; + + if (rxq->q_set) { + i40e_dev_rx_queue_setup(dev, + rxq->queue_id, + rxq->nb_rx_desc, + rxq->socket_id, + &rxq->rxconf, + rxq->mp); + } + } + for (i = 0; i < dev->data->nb_tx_queues; i++) { + struct i40e_tx_queue *txq = dev->data->tx_queues[i]; + + if (txq->q_set) { + i40e_dev_tx_queue_setup(dev, + txq->queue_id, + txq->nb_tx_desc, + txq->socket_id, + &txq->txconf); + } + } +} + static int i40evf_dev_reset(struct rte_eth_dev *dev) { int ret; + struct i40e_adapter *adapter = + I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); + if (!dev->data->dev_started) + return -EAGAIN; + + adapter->reset_number = 1; + i40evf_dev_close(dev); + PMD_DRV_LOG(DEBUG, "i40evf dev close complete"); ret = i40evf_dev_uninit(dev); if (ret) return ret; + PMD_DRV_LOG(DEBUG, "i40evf dev detached"); + memset(dev->data->dev_private, 0, + (uint64_t)&adapter->reset_number - (uint64_t)adapter); + i40evf_dev_configure(dev); ret = i40evf_dev_init(dev); + if (ret) + return ret; + PMD_DRV_LOG(DEBUG, "i40evf dev attached"); - return ret; + i40e_vf_queue_reset(dev); + PMD_DRV_LOG(DEBUG, "i40evf queue reset"); + i40evf_dev_start(dev); + PMD_DRV_LOG(DEBUG, "i40evf dev restart"); + adapter->reset_number = 0; + + return 0; } static int diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c index f21c1c5d2..3d5125260 100644 --- a/drivers/net/i40e/i40e_rxtx.c +++ b/drivers/net/i40e/i40e_rxtx.c @@ -1745,6 +1745,7 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev, uint32_t ring_size; uint16_t len, i; uint16_t reg_idx, base, bsf, tc_mapping; + struct rte_eth_rxconf conf = *rx_conf; int q_offset, use_def_burst_func = 1; if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) { @@ -1789,6 +1790,8 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev, return -ENOMEM; } rxq->mp = mp; + rxq->socket_id = socket_id; + rxq->rxconf = conf; rxq->nb_rx_desc = nb_desc; rxq->rx_free_thresh = rx_conf->rx_free_thresh; rxq->queue_id = queue_idx; @@ -2024,6 +2027,8 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t reg_idx, i, base, bsf, tc_mapping; int q_offset; + struct rte_eth_txconf conf = *tx_conf; + if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) { vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); vsi = &vf->vsi; @@ -2149,6 +2154,8 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev, } txq->nb_tx_desc = nb_desc; + txq->socket_id = socket_id; + txq->txconf = conf; txq->tx_rs_thresh = tx_rs_thresh; txq->tx_free_thresh = tx_free_thresh; txq->pthresh = tx_conf->tx_thresh.pthresh; @@ -2628,8 +2635,12 @@ void i40e_dev_free_queues(struct rte_eth_dev *dev) { uint16_t i; + struct i40e_adapter *adapter = + I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); PMD_INIT_FUNC_TRACE(); + if (adapter->reset_number) + return; for (i = 0; i < dev->data->nb_rx_queues; i++) { if (!dev->data->rx_queues[i]) diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h index 06c6a6592..43e227a52 100644 --- a/drivers/net/i40e/i40e_rxtx.h +++ b/drivers/net/i40e/i40e_rxtx.h @@ -136,6 +136,8 @@ struct i40e_rx_queue { bool rx_deferred_start; /**< don't start this queue in dev start */ uint16_t rx_using_sse; /**