Message ID | 20240424195337.3596657-10-amorenoz@redhat.com |
---|---|
State | RFC |
Delegated to: | Simon Horman |
Headers | show |
Series | Add psample support to NXAST_SAMPLE action. | expand |
Context | Check | Description |
---|---|---|
ovsrobot/intel-ovs-compilation | success | test: success |
ovsrobot/apply-robot | success | apply and check: success |
On 24 Apr 2024, at 21:53, Adrian Moreno wrote: > Add a cache entry type for psample objects. > Store both the dpif_psample reference and the collector_set_id so we can > quickly find the particular exporter. > > Using that mechanism, account for packet and byte statistics. See comments inline. //Eelco > Signed-off-by: Adrian Moreno <amorenoz@redhat.com> > --- > ofproto/ofproto-dpif-psample.c | 20 ++++++++++++++++++++ > ofproto/ofproto-dpif-psample.h | 4 ++++ > ofproto/ofproto-dpif-xlate-cache.c | 11 ++++++++++- > ofproto/ofproto-dpif-xlate-cache.h | 6 ++++++ > ofproto/ofproto-dpif-xlate.c | 9 +++++++++ > ofproto/ofproto-dpif.c | 1 + > 6 files changed, 50 insertions(+), 1 deletion(-) > > diff --git a/ofproto/ofproto-dpif-psample.c b/ofproto/ofproto-dpif-psample.c > index 1e4f4bf48..ea4926eb2 100644 > --- a/ofproto/ofproto-dpif-psample.c > +++ b/ofproto/ofproto-dpif-psample.c > @@ -17,6 +17,7 @@ > #include <config.h> > #include "ofproto-dpif-psample.h" > > +#include "dpif.h" > #include "hash.h" > #include "ofproto.h" > #include "openvswitch/hmap.h" > @@ -30,6 +31,8 @@ static struct ovs_mutex mutex = OVS_MUTEX_INITIALIZER; > struct psample_exporter { > uint32_t group_id; > uint32_t collector_set_id; > + uint64_t n_packets; > + uint64_t n_bytes; > }; > > struct psample_exporter_map_node { > @@ -145,6 +148,23 @@ dpif_psample_get_group_id(struct dpif_psample *ps, uint32_t collector_set_id, > return found; > } > > +void > +dpif_psample_credit_stats(struct dpif_psample *ps, uint32_t collector_set_id, > + const struct dpif_flow_stats *stats) > +OVS_EXCLUDED(mutex) > +{ > + struct psample_exporter_map_node *node; > + > + ovs_mutex_lock(&mutex); > + node = dpif_psample_find_exporter_node(ps, collector_set_id); > + if (node) { > + node->exporter.n_packets += stats->n_packets; > + node->exporter.n_bytes += stats->n_bytes; A global mutex seems far from optimal for increasing stats. > + } > + ovs_mutex_unlock(&mutex); > +} > + > + > /* Creation and destruction. */ > struct dpif_psample * > dpif_psample_create(void) > diff --git a/ofproto/ofproto-dpif-psample.h b/ofproto/ofproto-dpif-psample.h > index b9f2584af..763fbd30b 100644 > --- a/ofproto/ofproto-dpif-psample.h > +++ b/ofproto/ofproto-dpif-psample.h > @@ -20,6 +20,7 @@ > #include <stdbool.h> > #include <stdint.h> > > +struct dpif_flow_stats; > struct dpif_psample; > struct ovs_list; > > @@ -31,4 +32,7 @@ bool dpif_psample_set_options(struct dpif_psample *, const struct ovs_list *); > > bool dpif_psample_get_group_id(struct dpif_psample *, uint32_t, uint32_t *); > > +void dpif_psample_credit_stats(struct dpif_psample *, uint32_t, Please add a name for this uint32_t parameter. > + const struct dpif_flow_stats *); > + > #endif // OFPROTO_DPIF_PSAMPLE_H > diff --git a/ofproto/ofproto-dpif-xlate-cache.c b/ofproto/ofproto-dpif-xlate-cache.c > index 2e1fcb3a6..0fe76e5fa 100644 > --- a/ofproto/ofproto-dpif-xlate-cache.c > +++ b/ofproto/ofproto-dpif-xlate-cache.c > @@ -35,9 +35,10 @@ > #include "learn.h" > #include "mac-learning.h" > #include "netdev-vport.h" > +#include "ofproto/ofproto-dpif.h" > #include "ofproto/ofproto-dpif-mirror.h" > +#include "ofproto/ofproto-dpif-psample.h" > #include "ofproto/ofproto-dpif-xlate.h" > -#include "ofproto/ofproto-dpif.h" > #include "ofproto/ofproto-provider.h" > #include "openvswitch/dynamic-string.h" > #include "openvswitch/vlog.h" > @@ -162,6 +163,11 @@ xlate_push_stats_entry(struct xc_entry *entry, > } > > break; > + case XC_PSAMPLE: > + dpif_psample_credit_stats(entry->psample.psample, > + entry->psample.collector_set_id, > + stats); > + break; > default: > OVS_NOT_REACHED(); > } > @@ -245,6 +251,9 @@ xlate_cache_clear_entry(struct xc_entry *entry) > break; > case XC_TUNNEL_HEADER: > break; > + case XC_PSAMPLE: > + dpif_psample_unref(entry->psample.psample); > + break; > default: > OVS_NOT_REACHED(); > } > diff --git a/ofproto/ofproto-dpif-xlate-cache.h b/ofproto/ofproto-dpif-xlate-cache.h > index 0fc6d2ea6..fa707889d 100644 > --- a/ofproto/ofproto-dpif-xlate-cache.h > +++ b/ofproto/ofproto-dpif-xlate-cache.h > @@ -29,6 +29,7 @@ > struct bfd; > struct bond; > struct dpif_flow_stats; > +struct dpif_psample; > struct flow; > struct group_dpif; > struct mbridge; > @@ -53,6 +54,7 @@ enum xc_type { > XC_GROUP, > XC_TNL_NEIGH, > XC_TUNNEL_HEADER, > + XC_PSAMPLE, > }; > > /* xlate_cache entries hold enough information to perform the side effects of > @@ -126,6 +128,10 @@ struct xc_entry { > } operation; > uint16_t hdr_size; > } tunnel_hdr; > + struct { > + struct dpif_psample *psample; > + uint32_t collector_set_id; > + } psample; > }; > }; > > diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c > index 1dcf86856..a9856e358 100644 > --- a/ofproto/ofproto-dpif-xlate.c > +++ b/ofproto/ofproto-dpif-xlate.c > @@ -5989,6 +5989,15 @@ xlate_sample_action(struct xlate_ctx *ctx, > sizeof(os->obs_domain_id)); > ofpbuf_put(&psample_args->cookie, &os->obs_point_id, > sizeof(os->obs_point_id)); > + > + if (ctx->xin->xcache) { > + struct xc_entry *entry; > + > + entry = xlate_cache_add_entry(ctx->xin->xcache, XC_PSAMPLE); > + entry->psample.psample = dpif_psample_ref(psample); > + entry->psample.collector_set_id = os->collector_set_id; > + } > + > } > } > > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c > index 64c06322e..f1efdd482 100644 > --- a/ofproto/ofproto-dpif.c > +++ b/ofproto/ofproto-dpif.c > @@ -5167,6 +5167,7 @@ ofproto_dpif_xcache_execute(struct ofproto_dpif *ofproto, > case XC_GROUP: > case XC_TNL_NEIGH: > case XC_TUNNEL_HEADER: > + case XC_PSAMPLE: > xlate_push_stats_entry(entry, stats, false); > break; > default: > -- > 2.44.0
diff --git a/ofproto/ofproto-dpif-psample.c b/ofproto/ofproto-dpif-psample.c index 1e4f4bf48..ea4926eb2 100644 --- a/ofproto/ofproto-dpif-psample.c +++ b/ofproto/ofproto-dpif-psample.c @@ -17,6 +17,7 @@ #include <config.h> #include "ofproto-dpif-psample.h" +#include "dpif.h" #include "hash.h" #include "ofproto.h" #include "openvswitch/hmap.h" @@ -30,6 +31,8 @@ static struct ovs_mutex mutex = OVS_MUTEX_INITIALIZER; struct psample_exporter { uint32_t group_id; uint32_t collector_set_id; + uint64_t n_packets; + uint64_t n_bytes; }; struct psample_exporter_map_node { @@ -145,6 +148,23 @@ dpif_psample_get_group_id(struct dpif_psample *ps, uint32_t collector_set_id, return found; } +void +dpif_psample_credit_stats(struct dpif_psample *ps, uint32_t collector_set_id, + const struct dpif_flow_stats *stats) +OVS_EXCLUDED(mutex) +{ + struct psample_exporter_map_node *node; + + ovs_mutex_lock(&mutex); + node = dpif_psample_find_exporter_node(ps, collector_set_id); + if (node) { + node->exporter.n_packets += stats->n_packets; + node->exporter.n_bytes += stats->n_bytes; + } + ovs_mutex_unlock(&mutex); +} + + /* Creation and destruction. */ struct dpif_psample * dpif_psample_create(void) diff --git a/ofproto/ofproto-dpif-psample.h b/ofproto/ofproto-dpif-psample.h index b9f2584af..763fbd30b 100644 --- a/ofproto/ofproto-dpif-psample.h +++ b/ofproto/ofproto-dpif-psample.h @@ -20,6 +20,7 @@ #include <stdbool.h> #include <stdint.h> +struct dpif_flow_stats; struct dpif_psample; struct ovs_list; @@ -31,4 +32,7 @@ bool dpif_psample_set_options(struct dpif_psample *, const struct ovs_list *); bool dpif_psample_get_group_id(struct dpif_psample *, uint32_t, uint32_t *); +void dpif_psample_credit_stats(struct dpif_psample *, uint32_t, + const struct dpif_flow_stats *); + #endif // OFPROTO_DPIF_PSAMPLE_H diff --git a/ofproto/ofproto-dpif-xlate-cache.c b/ofproto/ofproto-dpif-xlate-cache.c index 2e1fcb3a6..0fe76e5fa 100644 --- a/ofproto/ofproto-dpif-xlate-cache.c +++ b/ofproto/ofproto-dpif-xlate-cache.c @@ -35,9 +35,10 @@ #include "learn.h" #include "mac-learning.h" #include "netdev-vport.h" +#include "ofproto/ofproto-dpif.h" #include "ofproto/ofproto-dpif-mirror.h" +#include "ofproto/ofproto-dpif-psample.h" #include "ofproto/ofproto-dpif-xlate.h" -#include "ofproto/ofproto-dpif.h" #include "ofproto/ofproto-provider.h" #include "openvswitch/dynamic-string.h" #include "openvswitch/vlog.h" @@ -162,6 +163,11 @@ xlate_push_stats_entry(struct xc_entry *entry, } break; + case XC_PSAMPLE: + dpif_psample_credit_stats(entry->psample.psample, + entry->psample.collector_set_id, + stats); + break; default: OVS_NOT_REACHED(); } @@ -245,6 +251,9 @@ xlate_cache_clear_entry(struct xc_entry *entry) break; case XC_TUNNEL_HEADER: break; + case XC_PSAMPLE: + dpif_psample_unref(entry->psample.psample); + break; default: OVS_NOT_REACHED(); } diff --git a/ofproto/ofproto-dpif-xlate-cache.h b/ofproto/ofproto-dpif-xlate-cache.h index 0fc6d2ea6..fa707889d 100644 --- a/ofproto/ofproto-dpif-xlate-cache.h +++ b/ofproto/ofproto-dpif-xlate-cache.h @@ -29,6 +29,7 @@ struct bfd; struct bond; struct dpif_flow_stats; +struct dpif_psample; struct flow; struct group_dpif; struct mbridge; @@ -53,6 +54,7 @@ enum xc_type { XC_GROUP, XC_TNL_NEIGH, XC_TUNNEL_HEADER, + XC_PSAMPLE, }; /* xlate_cache entries hold enough information to perform the side effects of @@ -126,6 +128,10 @@ struct xc_entry { } operation; uint16_t hdr_size; } tunnel_hdr; + struct { + struct dpif_psample *psample; + uint32_t collector_set_id; + } psample; }; }; diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index 1dcf86856..a9856e358 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -5989,6 +5989,15 @@ xlate_sample_action(struct xlate_ctx *ctx, sizeof(os->obs_domain_id)); ofpbuf_put(&psample_args->cookie, &os->obs_point_id, sizeof(os->obs_point_id)); + + if (ctx->xin->xcache) { + struct xc_entry *entry; + + entry = xlate_cache_add_entry(ctx->xin->xcache, XC_PSAMPLE); + entry->psample.psample = dpif_psample_ref(psample); + entry->psample.collector_set_id = os->collector_set_id; + } + } } diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 64c06322e..f1efdd482 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -5167,6 +5167,7 @@ ofproto_dpif_xcache_execute(struct ofproto_dpif *ofproto, case XC_GROUP: case XC_TNL_NEIGH: case XC_TUNNEL_HEADER: + case XC_PSAMPLE: xlate_push_stats_entry(entry, stats, false); break; default:
Add a cache entry type for psample objects. Store both the dpif_psample reference and the collector_set_id so we can quickly find the particular exporter. Using that mechanism, account for packet and byte statistics. Signed-off-by: Adrian Moreno <amorenoz@redhat.com> --- ofproto/ofproto-dpif-psample.c | 20 ++++++++++++++++++++ ofproto/ofproto-dpif-psample.h | 4 ++++ ofproto/ofproto-dpif-xlate-cache.c | 11 ++++++++++- ofproto/ofproto-dpif-xlate-cache.h | 6 ++++++ ofproto/ofproto-dpif-xlate.c | 9 +++++++++ ofproto/ofproto-dpif.c | 1 + 6 files changed, 50 insertions(+), 1 deletion(-)