From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id C5618D0B8 for ; Fri, 24 Mar 2017 18:12:45 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=intel.com; i=@intel.com; q=dns/txt; s=intel; t=1490375567; x=1521911567; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=qV+tzRdajHjR4ngVpJ/Bkzxsj6D4dtQ7UWuuzi5WI/s=; b=SDo+01DkeJSwAVnHaQQcxpuArK9cYLgFX/gSbNpAOxlz72B6H+RF4O0R QEPzU72SCcWhqS7iD+tY0VXPstdipw==; Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 Mar 2017 10:11:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,215,1486454400"; d="scan'208";a="1146577028" Received: from sivswdev01.ir.intel.com ([10.237.217.45]) by fmsmga002.fm.intel.com with ESMTP; 24 Mar 2017 10:11:30 -0700 From: Bruce Richardson To: olivier.matz@6wind.com Cc: dev@dpdk.org, jerin.jacob@caviumnetworks.com, thomas.monjalon@6wind.com, Bruce Richardson Date: Fri, 24 Mar 2017 17:10:04 +0000 Message-Id: <20170324171008.29355-11-bruce.richardson@intel.com> X-Mailer: git-send-email 2.8.4 In-Reply-To: <20170324171008.29355-1-bruce.richardson@intel.com> References: <20170307113217.11077-1-bruce.richardson@intel.com> <20170324171008.29355-1-bruce.richardson@intel.com> Subject: [dpdk-dev] [PATCH v3 10/14] examples/quota_watermark: use ring space for watermarks 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: , X-List-Received-Date: Fri, 24 Mar 2017 17:12:48 -0000 Now that the enqueue function returns the amount of space in the ring, we can use that to replace the old watermark functionality. Update the example app to do so, and re-enable it in the examples Makefile. Signed-off-by: Bruce Richardson Acked-by: Olivier Matz --- examples/Makefile | 2 +- examples/quota_watermark/qw/init.c | 5 +++-- examples/quota_watermark/qw/main.c | 16 ++++++++++------ examples/quota_watermark/qw/main.h | 1 + examples/quota_watermark/qwctl/commands.c | 4 ++-- examples/quota_watermark/qwctl/qwctl.c | 2 ++ examples/quota_watermark/qwctl/qwctl.h | 1 + 7 files changed, 20 insertions(+), 11 deletions(-) diff --git a/examples/Makefile b/examples/Makefile index 19cd5ad..da2bfdd 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -81,7 +81,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_REORDER) += packet_ordering DIRS-$(CONFIG_RTE_LIBRTE_IEEE1588) += ptpclient DIRS-$(CONFIG_RTE_LIBRTE_METER) += qos_meter DIRS-$(CONFIG_RTE_LIBRTE_SCHED) += qos_sched -#DIRS-y += quota_watermark +DIRS-y += quota_watermark DIRS-$(CONFIG_RTE_ETHDEV_RXTX_CALLBACKS) += rxtx_callbacks DIRS-y += skeleton ifeq ($(CONFIG_RTE_LIBRTE_HASH),y) diff --git a/examples/quota_watermark/qw/init.c b/examples/quota_watermark/qw/init.c index 95a9f94..6babfea 100644 --- a/examples/quota_watermark/qw/init.c +++ b/examples/quota_watermark/qw/init.c @@ -140,7 +140,7 @@ void init_ring(int lcore_id, uint8_t port_id) if (ring == NULL) rte_exit(EXIT_FAILURE, "%s\n", rte_strerror(rte_errno)); - rte_ring_set_water_mark(ring, 80 * RING_SIZE / 100); + *high_watermark = 80 * RING_SIZE / 100; rings[lcore_id][port_id] = ring; } @@ -168,10 +168,11 @@ setup_shared_variables(void) const struct rte_memzone *qw_memzone; qw_memzone = rte_memzone_reserve(QUOTA_WATERMARK_MEMZONE_NAME, - 2 * sizeof(int), rte_socket_id(), 0); + 3 * sizeof(int), rte_socket_id(), 0); if (qw_memzone == NULL) rte_exit(EXIT_FAILURE, "%s\n", rte_strerror(rte_errno)); quota = qw_memzone->addr; low_watermark = (unsigned int *) qw_memzone->addr + 1; + high_watermark = (unsigned int *) qw_memzone->addr + 2; } diff --git a/examples/quota_watermark/qw/main.c b/examples/quota_watermark/qw/main.c index 2dcddea..bdb8a43 100644 --- a/examples/quota_watermark/qw/main.c +++ b/examples/quota_watermark/qw/main.c @@ -67,6 +67,7 @@ struct ether_fc_frame { int *quota; unsigned int *low_watermark; +unsigned int *high_watermark; uint8_t port_pairs[RTE_MAX_ETHPORTS]; @@ -158,6 +159,7 @@ receive_stage(__attribute__((unused)) void *args) uint16_t nb_rx_pkts; unsigned int lcore_id; + unsigned int free; struct rte_mbuf *pkts[MAX_PKT_QUOTA]; struct rte_ring *ring; @@ -189,13 +191,13 @@ receive_stage(__attribute__((unused)) void *args) nb_rx_pkts = rte_eth_rx_burst(port_id, 0, pkts, (uint16_t) *quota); ret = rte_ring_enqueue_bulk(ring, (void *) pkts, - nb_rx_pkts); - if (ret == -EDQUOT) { + nb_rx_pkts, &free); + if (RING_SIZE - free > *high_watermark) { ring_state[port_id] = RING_OVERLOADED; send_pause_frame(port_id, 1337); } - else if (ret == -ENOBUFS) { + if (ret == 0) { /* * Return mbufs to the pool, @@ -217,6 +219,7 @@ pipeline_stage(__attribute__((unused)) void *args) uint8_t port_id; unsigned int lcore_id, previous_lcore_id; + unsigned int free; void *pkts[MAX_PKT_QUOTA]; struct rte_ring *rx, *tx; @@ -253,11 +256,12 @@ pipeline_stage(__attribute__((unused)) void *args) continue; /* Enqueue them on tx */ - ret = rte_ring_enqueue_bulk(tx, pkts, nb_dq_pkts); - if (ret == -EDQUOT) + ret = rte_ring_enqueue_bulk(tx, pkts, + nb_dq_pkts, &free); + if (RING_SIZE - free > *high_watermark) ring_state[port_id] = RING_OVERLOADED; - else if (ret == -ENOBUFS) { + if (ret == 0) { /* * Return mbufs to the pool, diff --git a/examples/quota_watermark/qw/main.h b/examples/quota_watermark/qw/main.h index 545ba42..8c8e311 100644 --- a/examples/quota_watermark/qw/main.h +++ b/examples/quota_watermark/qw/main.h @@ -43,6 +43,7 @@ enum ring_state { extern int *quota; extern unsigned int *low_watermark; +extern unsigned int *high_watermark; extern uint8_t port_pairs[RTE_MAX_ETHPORTS]; diff --git a/examples/quota_watermark/qwctl/commands.c b/examples/quota_watermark/qwctl/commands.c index 036bf80..5cac0e1 100644 --- a/examples/quota_watermark/qwctl/commands.c +++ b/examples/quota_watermark/qwctl/commands.c @@ -140,8 +140,8 @@ cmd_set_handler(__attribute__((unused)) void *parsed_result, else if (tokens->value >= *low_watermark * 100 / RING_SIZE && tokens->value <= 100) - rte_ring_set_water_mark(ring, - tokens->value * RING_SIZE / 100); + *high_watermark = tokens->value * + RING_SIZE / 100; else cmdline_printf(cl, "ring high watermark must be between %u%% and 100%%\n", diff --git a/examples/quota_watermark/qwctl/qwctl.c b/examples/quota_watermark/qwctl/qwctl.c index 3a85cc3..7e7a396 100644 --- a/examples/quota_watermark/qwctl/qwctl.c +++ b/examples/quota_watermark/qwctl/qwctl.c @@ -55,6 +55,7 @@ int *quota; unsigned int *low_watermark; +unsigned int *high_watermark; static void @@ -68,6 +69,7 @@ setup_shared_variables(void) quota = qw_memzone->addr; low_watermark = (unsigned int *) qw_memzone->addr + 1; + high_watermark = (unsigned int *) qw_memzone->addr + 2; } int main(int argc, char **argv) diff --git a/examples/quota_watermark/qwctl/qwctl.h b/examples/quota_watermark/qwctl/qwctl.h index 8d146e5..545914b 100644 --- a/examples/quota_watermark/qwctl/qwctl.h +++ b/examples/quota_watermark/qwctl/qwctl.h @@ -36,5 +36,6 @@ extern int *quota; extern unsigned int *low_watermark; +extern unsigned int *high_watermark; #endif /* _MAIN_H_ */ -- 2.9.3