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.
NOTE: RFC, THIS IS NOT YET TESTED
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
examples/Makefile | 2 +-
examples/quota_watermark/qw/init.c | 5 +++--
examples/quota_watermark/qw/main.c | 10 ++++++----
examples/quota_watermark/qw/main.h | 1 +
examples/quota_watermark/qwctl/commands.c | 2 +-
examples/quota_watermark/qwctl/qwctl.c | 2 ++
examples/quota_watermark/qwctl/qwctl.h | 1 +
7 files changed, 15 insertions(+), 8 deletions(-)
@@ -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)
@@ -137,7 +137,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;
}
@@ -164,11 +164,12 @@ setup_shared_variables(void)
{
const struct rte_memzone *qw_memzone;
- qw_memzone = rte_memzone_reserve(QUOTA_WATERMARK_MEMZONE_NAME, 2 * sizeof(int),
+ qw_memzone = rte_memzone_reserve(QUOTA_WATERMARK_MEMZONE_NAME, 3 * sizeof(int),
rte_socket_id(), RTE_MEMZONE_2MB);
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;
}
@@ -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];
@@ -157,6 +158,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;
@@ -186,13 +188,13 @@ receive_stage(__attribute__((unused)) void *args)
/* Enqueue received packets on the RX ring */
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) {
+ ret = rte_ring_enqueue_bulk(ring, (void *) pkts, 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) {
+ else if (ret == 0) {
/* Return mbufs to the pool, effectively dropping packets */
for (i = 0; i < nb_rx_pkts; i++)
@@ -246,7 +248,7 @@ pipeline_stage(__attribute__((unused)) void *args)
continue;
/* Enqueue them on tx */
- ret = rte_ring_enqueue_bulk(tx, pkts, nb_dq_pkts);
+ ret = rte_ring_enqueue_bulk(tx, pkts, nb_dq_pkts, NULL);
if (ret == -EDQUOT)
ring_state[port_id] = RING_OVERLOADED;
@@ -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];
@@ -137,7 +137,7 @@ 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", *low_watermark * 100 / RING_SIZE);
@@ -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)
@@ -36,5 +36,6 @@
extern int *quota;
extern unsigned int *low_watermark;
+extern unsigned int *high_watermark;
#endif /* _MAIN_H_ */