From: Cristian Dumitrescu <cristian.dumitre...@intel.com>

This patch set adds api for meter configuration profiles. For a given
meter object, the parameters such as the rates and sizes for
the token buckets are defined as configuration profile parameters.
This helps in reducing the memory footprint of a meter object which
results in better cache utilization for the typical case when large
arrays of meter objects are used.

Signed-off-by: Cristian Dumitrescu <cristian.dumitre...@intel.com>
---
v2:
- increment LIBABIVAR
- update release note and deprecation notice
- fix checkpatch errors

 doc/guides/rel_notes/deprecation.rst   |   3 -
 doc/guides/rel_notes/release_18_02.rst |   2 +-
 lib/librte_meter/Makefile              |   2 +-
 lib/librte_meter/rte_meter.c           |  95 +++++++++-------
 lib/librte_meter/rte_meter.h           | 197 +++++++++++++++++++++++----------
 lib/librte_meter/rte_meter_version.map |   8 ++
 6 files changed, 205 insertions(+), 102 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst 
b/doc/guides/rel_notes/deprecation.rst
index 13e8543..6ba5ffd 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -50,6 +50,3 @@ Deprecation Notices
   required the previous behavior can be configured using existing flow
   director APIs. There is no ABI/API break. This change will just remove a
   global configuration setting and require explicit configuration.
-
-* librte_meter: The API will change to accommodate configuration profiles.
-  Most of the API functions will have an additional opaque parameter.
diff --git a/doc/guides/rel_notes/release_18_02.rst 
b/doc/guides/rel_notes/release_18_02.rst
index 24b67bb..7343b74 100644
--- a/doc/guides/rel_notes/release_18_02.rst
+++ b/doc/guides/rel_notes/release_18_02.rst
@@ -141,7 +141,7 @@ The libraries prepended with a plus sign were incremented 
in this version.
      librte_lpm.so.2
      librte_mbuf.so.3
      librte_mempool.so.3
-     librte_meter.so.1
+   + librte_meter.so.2
      librte_metrics.so.1
      librte_net.so.1
      librte_pci.so.1
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index bfeb5d6..d05fe39 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -44,7 +44,7 @@ LDLIBS += -lrte_eal
 
 EXPORT_MAP := rte_meter_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # all source are stored in SRCS-y
diff --git a/lib/librte_meter/rte_meter.c b/lib/librte_meter/rte_meter.c
index 5e2dadb..9db7a4a 100644
--- a/lib/librte_meter/rte_meter.c
+++ b/lib/librte_meter/rte_meter.c
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -60,61 +60,82 @@ rte_meter_get_tb_params(uint64_t hz, uint64_t rate, 
uint64_t *tb_period, uint64_
 }
 
 int
-rte_meter_srtcm_config(struct rte_meter_srtcm *m, struct 
rte_meter_srtcm_params *params)
+rte_meter_srtcm_profile_config(struct rte_meter_srtcm_profile *p,
+       struct rte_meter_srtcm_params *params)
 {
-       uint64_t hz;
+       uint64_t hz = rte_get_tsc_hz();
 
        /* Check input parameters */
-       if ((m == NULL) || (params == NULL)) {
-               return -1;
-       }
+       if ((p == NULL) ||
+               (params == NULL) ||
+               (params->cir == 0) ||
+               ((params->cbs == 0) && (params->ebs == 0)))
+               return -EINVAL;
 
-       if ((params->cir == 0) || ((params->cbs == 0) && (params->ebs == 0))) {
-               return -2;
-       }
+       /* Initialize srTCM run-time structure */
+       p->cbs = params->cbs;
+       p->ebs = params->ebs;
+       rte_meter_get_tb_params(hz, params->cir, &p->cir_period,
+               &p->cir_bytes_per_period);
+
+       return 0;
+}
+
+int
+rte_meter_srtcm_config(struct rte_meter_srtcm *m,
+       struct rte_meter_srtcm_profile *p)
+{
+       /* Check input parameters */
+       if ((m == NULL) || (p == NULL))
+               return -EINVAL;
 
        /* Initialize srTCM run-time structure */
-       hz = rte_get_tsc_hz();
        m->time = rte_get_tsc_cycles();
-       m->tc = m->cbs = params->cbs;
-       m->te = m->ebs = params->ebs;
-       rte_meter_get_tb_params(hz, params->cir, &m->cir_period, 
&m->cir_bytes_per_period);
-
-       RTE_LOG(INFO, METER, "Low level srTCM config: \n"
-               "\tCIR period = %" PRIu64 ", CIR bytes per period = %" PRIu64 
"\n",
-               m->cir_period, m->cir_bytes_per_period);
+       m->tc = p->cbs;
+       m->te = p->ebs;
 
        return 0;
 }
 
 int
-rte_meter_trtcm_config(struct rte_meter_trtcm *m, struct 
rte_meter_trtcm_params *params)
+rte_meter_trtcm_profile_config(struct rte_meter_trtcm_profile *p,
+       struct rte_meter_trtcm_params *params)
 {
-       uint64_t hz;
+       uint64_t hz = rte_get_tsc_hz();
 
        /* Check input parameters */
-       if ((m == NULL) || (params == NULL)) {
-               return -1;
-       }
+       if ((p == NULL) ||
+               (params == NULL) ||
+               (params->cir == 0) ||
+               (params->pir == 0) ||
+               (params->pir < params->cir) ||
+               (params->cbs == 0) ||
+               (params->pbs == 0))
+               return -EINVAL;
 
-       if ((params->cir == 0) || (params->pir == 0) || (params->pir < 
params->cir) ||
-               (params->cbs == 0) || (params->pbs == 0)) {
-               return -2;
-       }
+       /* Initialize trTCM run-time structure */
+       p->cbs = params->cbs;
+       p->pbs = params->pbs;
+       rte_meter_get_tb_params(hz, params->cir, &p->cir_period,
+               &p->cir_bytes_per_period);
+       rte_meter_get_tb_params(hz, params->pir, &p->pir_period,
+               &p->pir_bytes_per_period);
+
+       return 0;
+}
+
+int
+rte_meter_trtcm_config(struct rte_meter_trtcm *m,
+       struct rte_meter_trtcm_profile *p)
+{
+       /* Check input parameters */
+       if ((m == NULL) || (p == NULL))
+               return -EINVAL;
 
        /* Initialize trTCM run-time structure */
-       hz = rte_get_tsc_hz();
        m->time_tc = m->time_tp = rte_get_tsc_cycles();
-       m->tc = m->cbs = params->cbs;
-       m->tp = m->pbs = params->pbs;
-       rte_meter_get_tb_params(hz, params->cir, &m->cir_period, 
&m->cir_bytes_per_period);
-       rte_meter_get_tb_params(hz, params->pir, &m->pir_period, 
&m->pir_bytes_per_period);
-
-       RTE_LOG(INFO, METER, "Low level trTCM config: \n"
-               "\tCIR period = %" PRIu64 ", CIR bytes per period = %" PRIu64 
"\n"
-               "\tPIR period = %" PRIu64 ", PIR bytes per period = %" PRIu64 
"\n",
-               m->cir_period, m->cir_bytes_per_period,
-               m->pir_period, m->pir_bytes_per_period);
+       m->tc = p->cbs;
+       m->tp = p->pbs;
 
        return 0;
 }
diff --git a/lib/librte_meter/rte_meter.h b/lib/librte_meter/rte_meter.h
index 2ab7184..38994c3 100644
--- a/lib/librte_meter/rte_meter.h
+++ b/lib/librte_meter/rte_meter.h
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -82,6 +82,18 @@ struct rte_meter_trtcm_params {
        uint64_t pbs; /**< Peak Burst Size (PBS). Measured in bytes. */
 };
 
+/**
+ * Internal data structure storing the srTCM configuration profile. Typically
+ * shared by multiple srTCM objects.
+ */
+struct rte_meter_srtcm_profile;
+
+/**
+ * Internal data structure storing the trTCM configuration profile. Typically
+ * shared by multiple trTCM objects.
+ */
+struct rte_meter_trtcm_profile;
+
 /** Internal data structure storing the srTCM run-time context per metered 
traffic flow. */
 struct rte_meter_srtcm;
 
@@ -89,38 +101,66 @@ struct rte_meter_srtcm;
 struct rte_meter_trtcm;
 
 /**
+ * srTCM profile configuration
+ *
+ * @param p
+ *    Pointer to pre-allocated srTCM profile data structure
+ * @param params
+ *    srTCM profile parameters
+ * @return
+ *    0 upon success, error code otherwise
+ */
+int rte_meter_srtcm_profile_config(struct rte_meter_srtcm_profile *p,
+       struct rte_meter_srtcm_params *params);
+
+/**
+ * trTCM profile configuration
+ *
+ * @param p
+ *    Pointer to pre-allocated trTCM profile data structure
+ * @param params
+ *    trTCM profile parameters
+ * @return
+ *    0 upon success, error code otherwise
+ */
+int rte_meter_trtcm_profile_config(struct rte_meter_trtcm_profile *p,
+       struct rte_meter_trtcm_params *params);
+
+/**
  * srTCM configuration per metered traffic flow
  *
  * @param m
  *    Pointer to pre-allocated srTCM data structure
- * @param params
- *    User parameters per srTCM metered traffic flow
+ * @param p
+ *    srTCM profile. Needs to be valid.
  * @return
  *    0 upon success, error code otherwise
  */
 int
 rte_meter_srtcm_config(struct rte_meter_srtcm *m,
-       struct rte_meter_srtcm_params *params);
+       struct rte_meter_srtcm_profile *p);
 
 /**
  * trTCM configuration per metered traffic flow
  *
  * @param m
  *    Pointer to pre-allocated trTCM data structure
- * @param params
- *    User parameters per trTCM metered traffic flow
+ * @param p
+ *    trTCM profile. Needs to be valid.
  * @return
  *    0 upon success, error code otherwise
  */
 int
 rte_meter_trtcm_config(struct rte_meter_trtcm *m,
-       struct rte_meter_trtcm_params *params);
+       struct rte_meter_trtcm_profile *p);
 
 /**
  * srTCM color blind traffic metering
  *
  * @param m
  *    Handle to srTCM instance
+ * @param p
+ *    srTCM profile specified at srTCM object creation time
  * @param time
  *    Current CPU time stamp (measured in CPU cycles)
  * @param pkt_len
@@ -130,6 +170,7 @@ rte_meter_trtcm_config(struct rte_meter_trtcm *m,
  */
 static inline enum rte_meter_color
 rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,
+       struct rte_meter_srtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len);
 
@@ -138,6 +179,8 @@ rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,
  *
  * @param m
  *    Handle to srTCM instance
+ * @param p
+ *    srTCM profile specified at srTCM object creation time
  * @param time
  *    Current CPU time stamp (measured in CPU cycles)
  * @param pkt_len
@@ -149,6 +192,7 @@ rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,
  */
 static inline enum rte_meter_color
 rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m,
+       struct rte_meter_srtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len,
        enum rte_meter_color pkt_color);
@@ -158,6 +202,8 @@ rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m,
  *
  * @param m
  *    Handle to trTCM instance
+ * @param p
+ *    trTCM profile specified at trTCM object creation time
  * @param time
  *    Current CPU time stamp (measured in CPU cycles)
  * @param pkt_len
@@ -167,6 +213,7 @@ rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m,
  */
 static inline enum rte_meter_color
 rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m,
+       struct rte_meter_trtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len);
 
@@ -175,6 +222,8 @@ rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m,
  *
  * @param m
  *    Handle to trTCM instance
+ * @param p
+ *    trTCM profile specified at trTCM object creation time
  * @param time
  *    Current CPU time stamp (measured in CPU cycles)
  * @param pkt_len
@@ -186,6 +235,7 @@ rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m,
  */
 static inline enum rte_meter_color
 rte_meter_trtcm_color_aware_check(struct rte_meter_trtcm *m,
+       struct rte_meter_trtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len,
        enum rte_meter_color pkt_color);
@@ -195,33 +245,57 @@ rte_meter_trtcm_color_aware_check(struct rte_meter_trtcm 
*m,
  *
  ***/
 
+struct rte_meter_srtcm_profile {
+       uint64_t cbs;
+       /**< Upper limit for C token bucket */
+       uint64_t ebs;
+       /**< Upper limit for E token bucket */
+       uint64_t cir_period;
+       /**< Number of CPU cycles for each update of C and E token buckets */
+       uint64_t cir_bytes_per_period;
+       /**< Number of bytes to add to C and E token buckets on each update */
+};
+
 /* Internal data structure storing the srTCM run-time context per metered 
traffic flow. */
 struct rte_meter_srtcm {
        uint64_t time; /* Time of latest update of C and E token buckets */
        uint64_t tc;   /* Number of bytes currently available in the committed 
(C) token bucket */
        uint64_t te;   /* Number of bytes currently available in the excess (E) 
token bucket */
-       uint64_t cbs;  /* Upper limit for C token bucket */
-       uint64_t ebs;  /* Upper limit for E token bucket */
-       uint64_t cir_period; /* Number of CPU cycles for one update of C and E 
token buckets */
-       uint64_t cir_bytes_per_period; /* Number of bytes to add to C and E 
token buckets on each update */
 };
 
-/* Internal data structure storing the trTCM run-time context per metered 
traffic flow. */
+struct rte_meter_trtcm_profile {
+       uint64_t cbs;
+       /**< Upper limit for C token bucket */
+       uint64_t pbs;
+       /** Upper limit for P token bucket */
+       uint64_t cir_period;
+       /** Number of CPU cycles for one update of C token bucket */
+       uint64_t cir_bytes_per_period;
+       /** Number of bytes to add to C token bucket on each update */
+       uint64_t pir_period;
+       /** Number of CPU cycles for one update of P token bucket */
+       uint64_t pir_bytes_per_period;
+       /** Number of bytes to add to P token bucket on each update */
+};
+
+/**
+ * Internal data structure storing the trTCM run-time context per metered
+ * traffic flow.
+ */
 struct rte_meter_trtcm {
-       uint64_t time_tc; /* Time of latest update of C token bucket */
-       uint64_t time_tp; /* Time of latest update of E token bucket */
-       uint64_t tc;      /* Number of bytes currently available in the 
committed (C) token bucket */
-       uint64_t tp;      /* Number of bytes currently available in the peak 
(P) token bucket */
-       uint64_t cbs;     /* Upper limit for C token bucket */
-       uint64_t pbs;     /* Upper limit for P token bucket */
-       uint64_t cir_period; /* Number of CPU cycles for one update of C token 
bucket */
-       uint64_t cir_bytes_per_period; /* Number of bytes to add to C token 
bucket on each update */
-       uint64_t pir_period; /* Number of CPU cycles for one update of P token 
bucket */
-       uint64_t pir_bytes_per_period; /* Number of bytes to add to P token 
bucket on each update */
+       uint64_t time_tc;
+       /**< Time of latest update of C token bucket */
+       uint64_t time_tp;
+       /**< Time of latest update of E token bucket */
+       uint64_t tc;
+       /**< Number of bytes currently available in committed(C) token bucket */
+       uint64_t tp;
+       /**< Number of bytes currently available in the peak(P) token bucket */
 };
 
 static inline enum rte_meter_color
 rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,
+       struct rte_meter_srtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len)
 {
@@ -229,17 +303,17 @@ rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm 
*m,
 
        /* Bucket update */
        time_diff = time - m->time;
-       n_periods = time_diff / m->cir_period;
-       m->time += n_periods * m->cir_period;
+       n_periods = time_diff / p->cir_period;
+       m->time += n_periods * p->cir_period;
 
        /* Put the tokens overflowing from tc into te bucket */
-       tc = m->tc + n_periods * m->cir_bytes_per_period;
+       tc = m->tc + n_periods * p->cir_bytes_per_period;
        te = m->te;
-       if (tc > m->cbs) {
-               te += (tc - m->cbs);
-               if (te > m->ebs)
-                       te = m->ebs;
-               tc = m->cbs;
+       if (tc > p->cbs) {
+               te += (tc - p->cbs);
+               if (te > p->ebs)
+                       te = p->ebs;
+               tc = p->cbs;
        }
 
        /* Color logic */
@@ -262,6 +336,7 @@ rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,
 
 static inline enum rte_meter_color
 rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m,
+       struct rte_meter_srtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len,
        enum rte_meter_color pkt_color)
@@ -270,17 +345,17 @@ rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm 
*m,
 
        /* Bucket update */
        time_diff = time - m->time;
-       n_periods = time_diff / m->cir_period;
-       m->time += n_periods * m->cir_period;
+       n_periods = time_diff / p->cir_period;
+       m->time += n_periods * p->cir_period;
 
        /* Put the tokens overflowing from tc into te bucket */
-       tc = m->tc + n_periods * m->cir_bytes_per_period;
+       tc = m->tc + n_periods * p->cir_bytes_per_period;
        te = m->te;
-       if (tc > m->cbs) {
-               te += (tc - m->cbs);
-               if (te > m->ebs)
-                       te = m->ebs;
-               tc = m->cbs;
+       if (tc > p->cbs) {
+               te += (tc - p->cbs);
+               if (te > p->ebs)
+                       te = p->ebs;
+               tc = p->cbs;
        }
 
        /* Color logic */
@@ -303,6 +378,7 @@ rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m,
 
 static inline enum rte_meter_color
 rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m,
+       struct rte_meter_trtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len)
 {
@@ -311,18 +387,18 @@ rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm 
*m,
        /* Bucket update */
        time_diff_tc = time - m->time_tc;
        time_diff_tp = time - m->time_tp;
-       n_periods_tc = time_diff_tc / m->cir_period;
-       n_periods_tp = time_diff_tp / m->pir_period;
-       m->time_tc += n_periods_tc * m->cir_period;
-       m->time_tp += n_periods_tp * m->pir_period;
+       n_periods_tc = time_diff_tc / p->cir_period;
+       n_periods_tp = time_diff_tp / p->pir_period;
+       m->time_tc += n_periods_tc * p->cir_period;
+       m->time_tp += n_periods_tp * p->pir_period;
 
-       tc = m->tc + n_periods_tc * m->cir_bytes_per_period;
-       if (tc > m->cbs)
-               tc = m->cbs;
+       tc = m->tc + n_periods_tc * p->cir_bytes_per_period;
+       if (tc > p->cbs)
+               tc = p->cbs;
 
-       tp = m->tp + n_periods_tp * m->pir_bytes_per_period;
-       if (tp > m->pbs)
-               tp = m->pbs;
+       tp = m->tp + n_periods_tp * p->pir_bytes_per_period;
+       if (tp > p->pbs)
+               tp = p->pbs;
 
        /* Color logic */
        if (tp < pkt_len) {
@@ -344,6 +420,7 @@ rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m,
 
 static inline enum rte_meter_color
 rte_meter_trtcm_color_aware_check(struct rte_meter_trtcm *m,
+       struct rte_meter_trtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len,
        enum rte_meter_color pkt_color)
@@ -353,18 +430,18 @@ rte_meter_trtcm_color_aware_check(struct rte_meter_trtcm 
*m,
        /* Bucket update */
        time_diff_tc = time - m->time_tc;
        time_diff_tp = time - m->time_tp;
-       n_periods_tc = time_diff_tc / m->cir_period;
-       n_periods_tp = time_diff_tp / m->pir_period;
-       m->time_tc += n_periods_tc * m->cir_period;
-       m->time_tp += n_periods_tp * m->pir_period;
-
-       tc = m->tc + n_periods_tc * m->cir_bytes_per_period;
-       if (tc > m->cbs)
-               tc = m->cbs;
-
-       tp = m->tp + n_periods_tp * m->pir_bytes_per_period;
-       if (tp > m->pbs)
-               tp = m->pbs;
+       n_periods_tc = time_diff_tc / p->cir_period;
+       n_periods_tp = time_diff_tp / p->pir_period;
+       m->time_tc += n_periods_tc * p->cir_period;
+       m->time_tp += n_periods_tp * p->pir_period;
+
+       tc = m->tc + n_periods_tc * p->cir_bytes_per_period;
+       if (tc > p->cbs)
+               tc = p->cbs;
+
+       tp = m->tp + n_periods_tp * p->pir_bytes_per_period;
+       if (tp > p->pbs)
+               tp = p->pbs;
 
        /* Color logic */
        if ((pkt_color == e_RTE_METER_RED) || (tp < pkt_len)) {
diff --git a/lib/librte_meter/rte_meter_version.map 
b/lib/librte_meter/rte_meter_version.map
index 2fd647c..c4422ef 100644
--- a/lib/librte_meter/rte_meter_version.map
+++ b/lib/librte_meter/rte_meter_version.map
@@ -10,3 +10,11 @@ DPDK_2.0 {
 
        local: *;
 };
+
+DPDK_18.02 {
+       global:
+
+       rte_meter_srtcm_profile_config;
+       rte_meter_trtcm_profile_config;
+
+} DPDK_2.0;
-- 
2.9.3

Reply via email to