eal: add --in-memory option
[dpdk.git] / examples / quota_watermark / qw / main.c
index 2dcddea..c55d387 100644 (file)
@@ -1,34 +1,5 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2014 Intel Corporation
  */
 
 #include <rte_eal.h>
@@ -67,14 +38,15 @@ struct ether_fc_frame {
 
 int *quota;
 unsigned int *low_watermark;
+unsigned int *high_watermark;
 
-uint8_t port_pairs[RTE_MAX_ETHPORTS];
+uint16_t port_pairs[RTE_MAX_ETHPORTS];
 
 struct rte_ring *rings[RTE_MAX_LCORE][RTE_MAX_ETHPORTS];
 struct rte_mempool *mbuf_pool;
 
 
-static void send_pause_frame(uint8_t port_id, uint16_t duration)
+static void send_pause_frame(uint16_t port_id, uint16_t duration)
 {
        struct rte_mbuf *mbuf;
        struct ether_fc_frame *pause_frame;
@@ -154,10 +126,11 @@ receive_stage(__attribute__((unused)) void *args)
 {
        int i, ret;
 
-       uint8_t port_id;
+       uint16_t port_id;
        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 +162,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,
@@ -208,15 +181,16 @@ receive_stage(__attribute__((unused)) void *args)
        }
 }
 
-static void
+static int
 pipeline_stage(__attribute__((unused)) void *args)
 {
        int i, ret;
        int nb_dq_pkts;
 
-       uint8_t port_id;
+       uint16_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 +227,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,
@@ -268,15 +243,17 @@ pipeline_stage(__attribute__((unused)) void *args)
                        }
                }
        }
+
+       return 0;
 }
 
-static void
+static int
 send_stage(__attribute__((unused)) void *args)
 {
        uint16_t nb_dq_pkts;
 
-       uint8_t port_id;
-       uint8_t dest_port_id;
+       uint16_t port_id;
+       uint16_t dest_port_id;
 
        unsigned int lcore_id, previous_lcore_id;
 
@@ -312,6 +289,8 @@ send_stage(__attribute__((unused)) void *args)
                        /* TODO: Check if nb_dq_pkts == nb_tx_pkts? */
                }
        }
+
+       return 0;
 }
 
 int
@@ -320,9 +299,9 @@ main(int argc, char **argv)
        int ret;
        unsigned int lcore_id, master_lcore_id, last_lcore_id;
 
-       uint8_t port_id;
+       uint16_t port_id;
 
-       rte_set_log_level(RTE_LOG_INFO);
+       rte_log_set_global_level(RTE_LOG_INFO);
 
        ret = rte_eal_init(argc, argv);
        if (ret < 0)
@@ -371,15 +350,13 @@ main(int argc, char **argv)
                                if (is_bit_set(port_id, portmask))
                                        init_ring(lcore_id, port_id);
 
-                       /* typecast is a workaround for GCC 4.3 bug */
-                       rte_eal_remote_launch((int (*)(void *))pipeline_stage,
+                       rte_eal_remote_launch(pipeline_stage,
                                        NULL, lcore_id);
                }
        }
 
        /* Start send_stage() on the last slave core */
-       /* typecast is a workaround for GCC 4.3 bug */
-       rte_eal_remote_launch((int (*)(void *))send_stage, NULL, last_lcore_id);
+       rte_eal_remote_launch(send_stage, NULL, last_lcore_id);
 
        /* Start receive_stage() on the master core */
        receive_stage(NULL);