On Fri, 2022-05-13 at 13:46 +0200, Eelco Chaudron wrote:
> 
> 
> On 3 May 2022, at 5:08, Jianbo Liu via dev wrote:
> 
> > Add API to offload meter to HW, and the corresponding functions to
> > call
> > the meter callbacks from all the registered flow API providers.
> > The interfaces are like those related to meter in dpif_class, in
> > order
> > to pass necessary info to HW.
> 
> See my comments inline below.
> 
> > Signed-off-by: Jianbo Liu <[email protected]>
> > ---
> >  lib/netdev-offload-provider.h | 15 ++++++++++++
> >  lib/netdev-offload.c          | 45
> > +++++++++++++++++++++++++++++++++++
> >  lib/netdev-offload.h          |  8 +++++++
> >  3 files changed, 68 insertions(+)
> > 
> > diff --git a/lib/netdev-offload-provider.h b/lib/netdev-offload-
> > provider.h
> > index 8ff2de983..2441534c3 100644
> > --- a/lib/netdev-offload-provider.h
> > +++ b/lib/netdev-offload-provider.h
> > @@ -94,6 +94,21 @@ struct netdev_flow_api {
> >       * takes ownership of a packet if errno != EOPNOTSUPP. */
> >      int (*hw_miss_packet_recover)(struct netdev *, struct
> > dp_packet *);
> > 
> > +    /* Offloads the meter or modifies it if exists in HW
> > +     * with the given 'meter_id' and the configuration in
> > 'config'. */
> > +    int (*meter_set)(ofproto_meter_id meter_id,
> > +                     struct ofputil_meter_config *config);
> > +
> > +    /* Queries HW for meter stats with the given 'meter_id'. */
> > +    int (*meter_get)(ofproto_meter_id meter_id,
> > +                     struct ofputil_meter_stats *stats,
> > +                     uint16_t max_bands);
> > +
> 
> The comments on meter_del and meter_get need more details on how
> statistics are handled. See below, and the comments in dpif-
> provider.h.
> 

OK.

> > +    /* Removes meter 'meter_id' from HW. */
> > +    int (*meter_del)(ofproto_meter_id meter_id,
> > +                     struct ofputil_meter_stats *stats,
> > +                     uint16_t max_bands);
> > +
> >      /* Initializies the netdev flow api.
> >       * Return 0 if successful, otherwise returns a positive errno
> > value. */
> >      int (*init_flow_api)(struct netdev *);
> > diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c
> > index fb108c0d5..41f6e1723 100644
> > --- a/lib/netdev-offload.c
> > +++ b/lib/netdev-offload.c
> > @@ -195,6 +195,51 @@ netdev_assign_flow_api(struct netdev *netdev)
> >      return -1;
> >  }
> > 
> > +int
> > +meter_offload_set(ofproto_meter_id meter_id,
> > +                  struct ofputil_meter_config *config)
> > +{
> > +    struct netdev_registered_flow_api *rfa;
> > +
> > +    CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) {
> > +        if (rfa->flow_api->meter_set) {
> > +            rfa->flow_api->meter_set(meter_id, config);
> > +        }
> > +    }
> > +
> > +    return 0;
> 
> We are not reporting any failures here, this does not seem right to
> me? Same for the other three functions below.
> 

If offload fails, ovs-meter should work as before. So, it's not
necessary to check the return value, right?

> > +}
> > +
> > +int
> > +meter_offload_get(ofproto_meter_id meter_id,
> > +                  struct ofputil_meter_stats *stats, uint16_t
> > max_bands)
> > +{
> > +    struct netdev_registered_flow_api *rfa;
> > +
> > +    CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) {
> > +        if (rfa->flow_api->meter_get) {
> > +            rfa->flow_api->meter_get(meter_id, stats, max_bands);
> 
> The following comments also apply to meter_offload_del() below, and
> comments on the first comment ;)
> 
> So here in theory multiple offload APIs can handle the same meter ID,
> so here we should clear all statistics in the structure and the

> individual callers should ADD their counter, not replace them.
> 

I don't know why the counters are replaced, could you please explain?

> Or we should pass in a tmp ofputil_meter_stats structure and do this.
> 
> I think this goes for the stats->packet_in_count, stats-
> >byte_in_count and band->byte_count and band->packet_count.

You can check in later patch that I added packet_in_count/byte_in_count
by "+=", so the value is not replaced, but added.

> 
> > +        }
> > +    }
> > +
> > +    return 0;
> > +}
> > +
> > +int
> > +meter_offload_del(ofproto_meter_id meter_id,
> > +                  struct ofputil_meter_stats *stats, uint16_t
> > max_bands)
> > +{
> > +    struct netdev_registered_flow_api *rfa;
> > +
> > +    CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) {
> > +        if (rfa->flow_api->meter_del) {
> > +            rfa->flow_api->meter_del(meter_id, stats, max_bands);
> > +        }
> > +    }
> > +
> > +    return 0;
> > +}
> > +
> >  int
> >  netdev_flow_flush(struct netdev *netdev)
> >  {
> > diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h
> > index 8237a85dd..a6d4ba3cb 100644
> > --- a/lib/netdev-offload.h
> > +++ b/lib/netdev-offload.h
> > @@ -22,6 +22,7 @@
> >  #include "openvswitch/types.h"
> >  #include "ovs-rcu.h"
> >  #include "ovs-thread.h"
> > +#include "openvswitch/ofp-meter.h"
> >  #include "packets.h"
> >  #include "flow.h"
> > 
> > @@ -158,6 +159,13 @@ int netdev_ports_flow_get(const char
> > *dpif_type, struct match *match,
> >  int netdev_ports_get_n_flows(const char *dpif_type,
> >                               odp_port_t port_no, uint64_t
> > *n_flows);
> > 
> > +int meter_offload_set(ofproto_meter_id,
> > +                      struct ofputil_meter_config *);
> > +int meter_offload_get(ofproto_meter_id,
> > +                      struct ofputil_meter_stats *, uint16_t);
> > +int meter_offload_del(ofproto_meter_id,
> > +                      struct ofputil_meter_stats *, uint16_t);
> > +
> >  #ifdef  __cplusplus
> >  }
> >  #endif
> > -- 
> > 2.26.2
> > 
> > _______________________________________________
> > dev mailing list
> > [email protected]
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> 

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to