From patchwork Wed Aug 23 11:36:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cristian Dumitrescu X-Patchwork-Id: 27756 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 22A9B7D62; Wed, 23 Aug 2017 13:36:35 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 88D5C7D3A for ; Wed, 23 Aug 2017 13:36:30 +0200 (CEST) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Aug 2017 04:36:28 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.41,416,1498546800"; d="scan'208";a="893316385" Received: from silpixa00382658.ir.intel.com ([10.237.223.29]) by FMSMGA003.fm.intel.com with ESMTP; 23 Aug 2017 04:36:26 -0700 From: Cristian Dumitrescu To: dev@dpdk.org Cc: thomas@monjalon.net Date: Wed, 23 Aug 2017 12:36:23 +0100 Message-Id: <1503488186-90047-2-git-send-email-cristian.dumitrescu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1503488186-90047-1-git-send-email-cristian.dumitrescu@intel.com> References: <1503488186-90047-1-git-send-email-cristian.dumitrescu@intel.com> Subject: [dpdk-dev] [PATCH 1/4] meter: add meter configuration profile 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Signed-off-by: Cristian Dumitrescu --- lib/librte_meter/rte_meter.c | 88 ++++++++++------- lib/librte_meter/rte_meter.h | 170 ++++++++++++++++++++++----------- lib/librte_meter/rte_meter_version.map | 8 ++ 3 files changed, 174 insertions(+), 92 deletions(-) diff --git a/lib/librte_meter/rte_meter.c b/lib/librte_meter/rte_meter.c index 5e2dadb..6f3fa59 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,75 @@ 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..c4bf9fd 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,23 +245,21 @@ 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 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 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 { - 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 */ +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 */ @@ -220,8 +268,17 @@ struct rte_meter_trtcm { 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 */ +}; + 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 +286,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 +319,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 +328,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 +361,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 +370,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 +403,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 +413,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..8bc8190 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_17.11 { + global: + + rte_meter_srtcm_profile_config; + rte_meter_trtcm_profile_config; + +} DPDK_2.0;