On Mon, 2022-05-23 at 11:59 +0200, Eelco Chaudron wrote: > > > On 16 May 2022, at 12:31, Jianbo Liu wrote: > > > 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 <jian...@nvidia.com> > > > > --- > > > > 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? > > If this is the design, maybe we should at least add a log message so > we know the initialization has failed, so we know why any flow > inserts would fail with ENOSUPP?
Did you mean adding logging when return !ENOSUPP? Another issue is that, do you want to log every time user fails to add or modify a meter parameters? > > > > > +} > > > > + > > > > +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? > > Because the API help not cleanly states that meters should add the > value rather than replace, it could be wrongly interpreted. But I > guess you are fixing this. > > > > 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. > > ACK, ignore this part. > > > > > > > > > + } > > > > + } > > > > + > > > > + 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 > > > > d...@openvswitch.org > > > > https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev