[ovs-dev] [PATCH OVS 3/4] dpif-netdev: Use the u32 instead of u64 for buckets
Tonghao Zhang
xiangxia.m.yue at gmail.com
Sat May 9 00:46:56 UTC 2020
On Sat, May 9, 2020 at 7:12 AM William Tu <u9012063 at gmail.com> wrote:
>
> On Thu, Apr 30, 2020 at 07:00:38PM +0800, xiangxia.m.yue at gmail.com wrote:
> > From: Tonghao Zhang <xiangxia.m.yue at gmail.com>
> >
> > When setting the meter rate to 4+Gbps, there is an overflow, the
> > meters don't work as expected.
> >
> > Cc: Ilya Maximets <i.maximets at ovn.org>
> > Cc: William Tu <u9012063 at gmail.com>
> > Cc: Jarno Rajahalme <jarno at ovn.org>
> > Cc: Ben Pfaff <blp at ovn.org>
> > Cc: Andy Zhou <azhou at ovn.org>
> > Signed-off-by: Tonghao Zhang <xiangxia.m.yue at gmail.com>
> > ---
> > include/openvswitch/ofp-meter.h | 2 +-
> > lib/dpif-netdev.c | 4 ++--
> > lib/ofp-meter.c | 4 ++--
> > 3 files changed, 5 insertions(+), 5 deletions(-)
> >
> > diff --git a/include/openvswitch/ofp-meter.h b/include/openvswitch/ofp-meter.h
> > index 6776eae87e26..f55f89ac1a71 100644
> > --- a/include/openvswitch/ofp-meter.h
> > +++ b/include/openvswitch/ofp-meter.h
> > @@ -37,7 +37,7 @@ struct ofputil_meter_band {
> > uint16_t type;
> > uint8_t prec_level; /* Non-zero if type == OFPMBT_DSCP_REMARK. */
> > uint32_t rate;
> > - uint32_t burst_size;
> > + uint64_t burst_size;
> > };
> >
> > void ofputil_format_meter_band(struct ds *, enum ofp13_meter_flags,
> > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> > index 59546db6a2a2..104347d8b251 100644
> > --- a/lib/dpif-netdev.c
> > +++ b/lib/dpif-netdev.c
> > @@ -277,7 +277,7 @@ static bool dpcls_lookup(struct dpcls *cls,
> >
> > struct dp_meter_band {
> > struct ofputil_meter_band up; /* type, prec_level, pad, rate, burst_size */
> > - uint32_t bucket; /* In 1/1000 packets (for PKTPS), or in bits (for KBPS) */
> > + uint64_t bucket; /* In 1/1000 packets (for PKTPS), or in bits (for KBPS) */
>
> why setting to 4Gbps will overflow?
> Each unit in bucket is 1kbpf, so 4Gbps is around 4M, around 2^20.
Hi William, thanks for your review,
If we set the rate to 4300000kbps == 4.3Gbps
ovs-ofctl -O OpenFlow13 add-meter br-int "meter=104 kbps stats
bands=type=drop rate=4300000"
In the dpif_netdev_meter_set function:
meter->bands[i].up.burst_size *= 1000;
burst_size should be 4300000000 but the max u32 is 4294967296
> William
>
> > uint64_t packet_count;
> > uint64_t byte_count;
> > };
> > @@ -5970,7 +5970,7 @@ dp_netdev_run_meter(struct dp_netdev *dp, struct dp_packet_batch *packets_,
> > band = &meter->bands[m];
> >
> > /* Update band's bucket. */
> > - band->bucket += delta_t * band->up.rate;
> > + band->bucket += (uint64_t)delta_t * band->up.rate;
> > band->bucket += delta_in_us * band->up.rate / 1000;
> > if (band->bucket > band->up.burst_size) {
> > band->bucket = band->up.burst_size;
> > diff --git a/lib/ofp-meter.c b/lib/ofp-meter.c
> > index 9ea40a0bfb63..1ac993bb028b 100644
> > --- a/lib/ofp-meter.c
> > +++ b/lib/ofp-meter.c
> > @@ -72,7 +72,7 @@ ofputil_format_meter_band(struct ds *s, enum ofp13_meter_flags flags,
> > ds_put_format(s, " rate=%"PRIu32, mb->rate);
> >
> > if (flags & OFPMF13_BURST) {
> > - ds_put_format(s, " burst_size=%"PRIu32, mb->burst_size);
> > + ds_put_format(s, " burst_size=%"PRIu64, mb->burst_size);
> > }
> > if (mb->type == OFPMBT13_DSCP_REMARK) {
> > ds_put_format(s, " prec_level=%"PRIu8, mb->prec_level);
> > @@ -703,7 +703,7 @@ parse_ofp_meter_mod_str__(struct ofputil_meter_mod *mm, char *string,
> > return error;
> > }
> > } else if (!strcmp(name, "burst_size")) {
> > - char *error = str_to_u32(value, &band->burst_size);
> > + char *error = str_to_u64(value, &band->burst_size);
> > if (error) {
> > return error;
> > }
> > --
> > 1.8.3.1
> >
--
Best regards, Tonghao
More information about the dev
mailing list