From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 671AF7DFF for ; Fri, 26 Sep 2014 16:13:17 +0200 (CEST) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga103.fm.intel.com with ESMTP; 26 Sep 2014 07:10:07 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.97,862,1389772800"; d="scan'208";a="392033905" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by FMSMGA003.fm.intel.com with ESMTP; 26 Sep 2014 07:13:17 -0700 Received: from sivswdev02.ir.intel.com (sivswdev02.ir.intel.com [10.237.217.46]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id s8QEJJ70017942 for ; Fri, 26 Sep 2014 15:19:19 +0100 Received: from sivswdev02.ir.intel.com (localhost [127.0.0.1]) by sivswdev02.ir.intel.com with ESMTP id s8QEJJcV006720 for ; Fri, 26 Sep 2014 15:19:19 +0100 Received: (from pdelarax@localhost) by sivswdev02.ir.intel.com with id s8QEJJo6006716 for dev@dpdk.org; Fri, 26 Sep 2014 15:19:19 +0100 From: Pablo de Lara To: dev@dpdk.org Date: Fri, 26 Sep 2014 15:19:18 +0100 Message-Id: <1411741159-6671-2-git-send-email-pablo.de.lara.guarch@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1411741159-6671-1-git-send-email-pablo.de.lara.guarch@intel.com> References: <1411741159-6671-1-git-send-email-pablo.de.lara.guarch@intel.com> Subject: [dpdk-dev] [PATCH 1/2] pmd: Added rte_eth_rxconf_defaults and rte_eth_txconf defaults functions X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 26 Sep 2014 14:13:19 -0000 Many sample apps use duplicated code to set rte_eth_txconf and rte_eth_rxconf structures. This patch allows the user to get a default optimal RX/TX configuration through these two functions, and still any parameters may be tweaked as wished, before setting up queues. Signed-off-by: Pablo de Lara --- lib/librte_ether/rte_ethdev.c | 68 +++++++++++++++++++++++++++++++++++ lib/librte_ether/rte_ethdev.h | 29 +++++++++++++++ lib/librte_pmd_e1000/igb_ethdev.c | 56 ++++++++++++++++++++++++++++- lib/librte_pmd_i40e/i40e_ethdev.c | 56 ++++++++++++++++++++++++++++ lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 59 ++++++++++++++++++++++++++++++ 5 files changed, 267 insertions(+), 1 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index fd1010a..3c24040 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -928,6 +928,7 @@ rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id, struct rte_eth_dev *dev; struct rte_pktmbuf_pool_private *mbp_priv; struct rte_eth_dev_info dev_info; + const struct rte_eth_rxconf *conf; /* This function is only safe when called from the primary process * in a multi-process setup*/ @@ -937,6 +938,16 @@ rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id, PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); return (-EINVAL); } + + conf = rx_conf; + if (conf == NULL) { + conf = rte_eth_rxconf_defaults(port_id, NULL); + if (conf == NULL) { + PMD_DEBUG_TRACE("Invalid RX port configuration\n"); + return (-EINVAL); + } + } + dev = &rte_eth_devices[port_id]; if (rx_queue_id >= dev->data->nb_rx_queues) { PMD_DEBUG_TRACE("Invalid RX queue_id=%d\n", rx_queue_id); @@ -997,6 +1008,7 @@ rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id, const struct rte_eth_txconf *tx_conf) { struct rte_eth_dev *dev; + const struct rte_eth_txconf *conf; /* This function is only safe when called from the primary process * in a multi-process setup*/ @@ -1006,6 +1018,16 @@ rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id, PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); return (-EINVAL); } + + conf = tx_conf; + if (conf == NULL) { + conf = rte_eth_txconf_defaults(port_id, NULL); + if (conf == NULL) { + PMD_DEBUG_TRACE("Invalid TX port configuration\n"); + return (-EINVAL); + } + } + dev = &rte_eth_devices[port_id]; if (tx_queue_id >= dev->data->nb_tx_queues) { PMD_DEBUG_TRACE("Invalid TX queue_id=%d\n", tx_queue_id); @@ -3002,3 +3024,49 @@ rte_eth_dev_get_flex_filter(uint8_t port_id, uint16_t index, return (*dev->dev_ops->get_flex_filter)(dev, index, filter, rx_queue); } + +const struct rte_eth_rxconf * +rte_eth_rxconf_defaults(uint8_t port_id, struct rte_eth_rxconf *conf) +{ + struct rte_eth_dev *dev; + static const struct rte_eth_rxconf defaults; + + if (port_id >= nb_ports) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return NULL; + } + + dev = &rte_eth_devices[port_id]; + + if (dev->dev_ops->rxconf_defaults) { + return (*dev->dev_ops->rxconf_defaults)(conf); + } else { + if (conf == NULL) + return &defaults; + *conf = defaults; + } + return conf; +} + +const struct rte_eth_txconf * +rte_eth_txconf_defaults(uint8_t port_id, struct rte_eth_txconf *conf) +{ + struct rte_eth_dev *dev; + static const struct rte_eth_txconf defaults; + + if (port_id >= nb_ports) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return NULL; + } + + dev = &rte_eth_devices[port_id]; + + if (dev->dev_ops->txconf_defaults) { + return (*dev->dev_ops->txconf_defaults)(conf); + } else { + if (conf == NULL) + return &defaults; + *conf = defaults; + } + return conf; +} diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 50df654..70026fd 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -1361,6 +1361,12 @@ typedef int (*eth_get_flex_filter_t)(struct rte_eth_dev *dev, uint16_t *rx_queue); /**< @internal Get a flex filter rule on an Ethernet device */ +typedef const struct rte_eth_rxconf * (*eth_rxconf_defaults_t) (struct rte_eth_rxconf *conf); +/**< @internal Get the default RX port configuration on an Ethernet device */ + +typedef const struct rte_eth_txconf * (*eth_txconf_defaults_t) (struct rte_eth_txconf *conf); +/**< @internal Get the default TX port configuration on an Ethernet device */ + /** * @internal A structure containing the functions exported by an Ethernet driver. */ @@ -1467,6 +1473,8 @@ struct eth_dev_ops { eth_add_flex_filter_t add_flex_filter; /**< add flex filter. */ eth_remove_flex_filter_t remove_flex_filter; /**< remove flex filter. */ eth_get_flex_filter_t get_flex_filter; /**< get flex filter. */ + eth_rxconf_defaults_t rxconf_defaults; /**< get default RX configuration. */ + eth_txconf_defaults_t txconf_defaults; /**< get default TX configuration. */ }; /** @@ -3557,6 +3565,27 @@ int rte_eth_dev_remove_flex_filter(uint8_t port_id, uint16_t index); int rte_eth_dev_get_flex_filter(uint8_t port_id, uint16_t index, struct rte_flex_filter *filter, uint16_t *rx_queue); +/** + * Get default port configuration. + * @param port_id + * The port identifier of the Ethernet device. + * @param port_conf_default + * Pointer to get the struct rte_eth_conf + * @param rx_conf_default + * Pointer to get the struct rte_eth_rxconf + * @param tx_conf_default: + * Pointer to get the struct rte_eth_txconf + * @param burst_size + * Pointer to get the default burst size + * @return + * - (0) if successful. + * - (-ENODEV) if *port_id* invalid. + */ +const struct rte_eth_rxconf *rte_eth_rxconf_defaults(uint8_t port_id, + struct rte_eth_rxconf *conf); + +const struct rte_eth_txconf *rte_eth_txconf_defaults(uint8_t port_id, + struct rte_eth_txconf *conf); #ifdef __cplusplus } #endif diff --git a/lib/librte_pmd_e1000/igb_ethdev.c b/lib/librte_pmd_e1000/igb_ethdev.c index 3187d92..30f1ee3 100644 --- a/lib/librte_pmd_e1000/igb_ethdev.c +++ b/lib/librte_pmd_e1000/igb_ethdev.c @@ -57,6 +57,18 @@ #include "e1000/e1000_api.h" #include "e1000_ethdev.h" +/** + * Default values for port configuration + */ +#define IGB_DEFAULT_RX_FREE_THRESH 32 +#define IGB_DEFAULT_RX_PTHRESH 8 +#define IGB_DEFAULT_RX_HTHRESH 8 +#define IGB_DEFAULT_RX_WTHRESH 0 + +#define IGB_DEFAULT_TX_PTHRESH 32 +#define IGB_DEFAULT_TX_HTHRESH 0 +#define IGB_DEFAULT_TX_WTHRESH 0 + static int eth_igb_configure(struct rte_eth_dev *dev); static int eth_igb_start(struct rte_eth_dev *dev); static void eth_igb_stop(struct rte_eth_dev *dev); @@ -165,7 +177,8 @@ static int eth_igb_remove_5tuple_filter(struct rte_eth_dev *dev, static int eth_igb_get_5tuple_filter(struct rte_eth_dev *dev, uint16_t index, struct rte_5tuple_filter *filter, uint16_t *rx_queue); - +static const struct rte_eth_rxconf *eth_igb_rxconf_defaults(struct rte_eth_rxconf *conf); +static const struct rte_eth_txconf *eth_igb_txconf_defaults(struct rte_eth_txconf *conf); /* * Define VF Stats MACRO for Non "cleared on read" register */ @@ -255,6 +268,8 @@ static struct eth_dev_ops eth_igb_ops = { .add_5tuple_filter = eth_igb_add_5tuple_filter, .remove_5tuple_filter = eth_igb_remove_5tuple_filter, .get_5tuple_filter = eth_igb_get_5tuple_filter, + .rxconf_defaults = eth_igb_rxconf_defaults, + .txconf_defaults = eth_igb_txconf_defaults, }; /* @@ -3008,6 +3023,45 @@ eth_igb_get_5tuple_filter(struct rte_eth_dev *dev, uint16_t index, return -ENOENT; } +static const struct rte_eth_rxconf * +eth_igb_rxconf_defaults(struct rte_eth_rxconf *conf) +{ + static const struct rte_eth_rxconf defaults = { + .rx_thresh = { + .pthresh = IGB_DEFAULT_RX_PTHRESH, + .hthresh = IGB_DEFAULT_RX_HTHRESH, + .wthresh = IGB_DEFAULT_RX_WTHRESH, + }, + .rx_free_thresh = IGB_DEFAULT_RX_FREE_THRESH, + .rx_drop_en = 0, + }; + + if (conf == NULL) + return &defaults; + *conf = defaults; + + return conf; +} + +static const struct rte_eth_txconf * +eth_igb_txconf_defaults(struct rte_eth_txconf *conf) +{ + static const struct rte_eth_txconf defaults = { + .tx_thresh = { + .pthresh = IGB_DEFAULT_TX_PTHRESH, + .hthresh = IGB_DEFAULT_TX_HTHRESH, + .wthresh = IGB_DEFAULT_TX_WTHRESH, + }, + .txq_flags = 0, + }; + + if (conf == NULL) + return &defaults; + *conf = defaults; + + return conf; +} + static int eth_igb_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) { diff --git a/lib/librte_pmd_i40e/i40e_ethdev.c b/lib/librte_pmd_i40e/i40e_ethdev.c index 9ed31b5..b89b896 100644 --- a/lib/librte_pmd_i40e/i40e_ethdev.c +++ b/lib/librte_pmd_i40e/i40e_ethdev.c @@ -58,6 +58,17 @@ #include "i40e_rxtx.h" #include "i40e_pf.h" +#define I40E_DEFAULT_RX_FREE_THRESH 32 +#define I40E_DEFAULT_RX_PTHRESH 8 +#define I40E_DEFAULT_RX_HTHRESH 8 +#define I40E_DEFAULT_RX_WTHRESH 0 + +#define I40E_DEFAULT_TX_FREE_THRESH 32 +#define I40E_DEFAULT_TX_PTHRESH 32 +#define I40E_DEFAULT_TX_HTHRESH 0 +#define I40E_DEFAULT_TX_WTHRESH 0 +#define I40E_DEFAULT_TX_RSBIT_THRESH 32 + /* Maximun number of MAC addresses */ #define I40E_NUM_MACADDR_MAX 64 #define I40E_CLEAR_PXE_WAIT_MS 200 @@ -203,6 +214,8 @@ static int i40e_dev_rss_hash_update(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_conf); static int i40e_dev_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_conf); +static const struct rte_eth_rxconf *i40e_rxconf_defaults(struct rte_eth_rxconf *conf); +static const struct rte_eth_txconf *i40e_txconf_defaults(struct rte_eth_txconf *conf); /* Default hash key buffer for RSS */ static uint32_t rss_key_default[I40E_PFQF_HKEY_MAX_INDEX + 1]; @@ -248,6 +261,8 @@ static struct eth_dev_ops i40e_eth_dev_ops = { .reta_query = i40e_dev_rss_reta_query, .rss_hash_update = i40e_dev_rss_hash_update, .rss_hash_conf_get = i40e_dev_rss_hash_conf_get, + .rxconf_defaults = i40e_rxconf_defaults, + .txconf_defaults = i40e_txconf_defaults, }; static struct eth_driver rte_i40e_pmd = { @@ -3956,3 +3971,44 @@ i40e_pf_config_mq_rx(struct i40e_pf *pf) return 0; } + +static const struct rte_eth_rxconf * +i40e_rxconf_defaults(struct rte_eth_rxconf *conf) +{ + static const struct rte_eth_rxconf defaults = { + .rx_thresh = { + .pthresh = I40E_DEFAULT_RX_PTHRESH, + .hthresh = I40E_DEFAULT_RX_HTHRESH, + .wthresh = I40E_DEFAULT_RX_WTHRESH, + }, + .rx_free_thresh = I40E_DEFAULT_RX_FREE_THRESH, + .rx_drop_en = 0, + }; + + if (conf == NULL) + return &defaults; + *conf = defaults; + + return conf; +} + +static const struct rte_eth_txconf * +i40e_txconf_defaults(struct rte_eth_txconf *conf) +{ + static const struct rte_eth_txconf defaults = { + .tx_thresh = { + .pthresh = I40E_DEFAULT_TX_PTHRESH, + .hthresh = I40E_DEFAULT_TX_HTHRESH, + .wthresh = I40E_DEFAULT_TX_WTHRESH, + }, + .tx_free_thresh = I40E_DEFAULT_TX_FREE_THRESH, + .tx_rs_thresh = I40E_DEFAULT_TX_RSBIT_THRESH, + .txq_flags = ETH_TXQ_FLAGS_NOMULTSEGS | ETH_TXQ_FLAGS_NOOFFLOADS, + }; + + if (conf == NULL) + return &defaults; + *conf = defaults; + + return conf; +} diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c index 59122a1..7f61d00 100644 --- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c +++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c @@ -92,6 +92,20 @@ #define IXGBE_MMW_SIZE_DEFAULT 0x4 #define IXGBE_MMW_SIZE_JUMBO_FRAME 0x14 +/** + * Default values for RX/TX configuration + */ +#define IXGBE_DEFAULT_RX_FREE_THRESH 32 +#define IXGBE_DEFAULT_RX_PTHRESH 8 +#define IXGBE_DEFAULT_RX_HTHRESH 8 +#define IXGBE_DEFAULT_RX_WTHRESH 0 + +#define IXGBE_DEFAULT_TX_FREE_THRESH 32 +#define IXGBE_DEFAULT_TX_PTHRESH 32 +#define IXGBE_DEFAULT_TX_HTHRESH 0 +#define IXGBE_DEFAULT_TX_WTHRESH 0 +#define IXGBE_DEFAULT_TX_RSBIT_THRESH 32 + #define IXGBEVF_PMD_NAME "rte_ixgbevf_pmd" /* PMD name */ #define IXGBE_QUEUE_STAT_COUNTERS (sizeof(hw_stats->qprc) / sizeof(hw_stats->qprc[0])) @@ -219,6 +233,8 @@ static int ixgbe_remove_5tuple_filter(struct rte_eth_dev *dev, uint16_t index); static int ixgbe_get_5tuple_filter(struct rte_eth_dev *dev, uint16_t index, struct rte_5tuple_filter *filter, uint16_t *rx_queue); +static const struct rte_eth_rxconf *ixgbe_rxconf_defaults(struct rte_eth_rxconf *conf); +static const struct rte_eth_txconf *ixgbe_txconf_defaults(struct rte_eth_txconf *conf); static int ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu); @@ -362,6 +378,8 @@ static struct eth_dev_ops ixgbe_eth_dev_ops = { .add_5tuple_filter = ixgbe_add_5tuple_filter, .remove_5tuple_filter = ixgbe_remove_5tuple_filter, .get_5tuple_filter = ixgbe_get_5tuple_filter, + .rxconf_defaults = ixgbe_rxconf_defaults, + .txconf_defaults = ixgbe_txconf_defaults, }; /* @@ -388,6 +406,8 @@ static struct eth_dev_ops ixgbevf_eth_dev_ops = { .tx_queue_release = ixgbe_dev_tx_queue_release, .mac_addr_add = ixgbevf_add_mac_addr, .mac_addr_remove = ixgbevf_remove_mac_addr, + .rxconf_defaults = ixgbe_rxconf_defaults, + .txconf_defaults = ixgbe_txconf_defaults, }; /** @@ -3940,6 +3960,45 @@ ixgbe_get_5tuple_filter(struct rte_eth_dev *dev, uint16_t index, return -ENOENT; } +const struct rte_eth_rxconf * +ixgbe_rxconf_defaults(struct rte_eth_rxconf *conf) +{ + static const struct rte_eth_rxconf defaults = { + .rx_thresh = { + .pthresh = IXGBE_DEFAULT_RX_PTHRESH, + .hthresh = IXGBE_DEFAULT_RX_HTHRESH, + .wthresh = IXGBE_DEFAULT_RX_WTHRESH, + }, + .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH, + .rx_drop_en = 0, + }; + if (conf == NULL) + return &defaults; + *conf = defaults; + + return conf; +} + +const struct rte_eth_txconf * +ixgbe_txconf_defaults(struct rte_eth_txconf *conf) +{ + static const struct rte_eth_txconf defaults = { + .tx_thresh = { + .pthresh = IXGBE_DEFAULT_TX_PTHRESH, + .hthresh = IXGBE_DEFAULT_TX_HTHRESH, + .wthresh = IXGBE_DEFAULT_TX_WTHRESH, + }, + .tx_free_thresh = IXGBE_DEFAULT_TX_FREE_THRESH, + .tx_rs_thresh = IXGBE_DEFAULT_TX_RSBIT_THRESH, + .txq_flags = ETH_TXQ_FLAGS_NOMULTSEGS | ETH_TXQ_FLAGS_NOOFFLOADS, + }; + if (conf == NULL) + return &defaults; + *conf = defaults; + + return conf; +} + static int ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) { -- 1.7.7.6