On Thu, 2022-04-28 at 14:00 +0200, Ilya Maximets wrote:
> On 4/28/22 13:49, Ilya Maximets wrote:
> > On 4/28/22 11:06, Jianbo Liu wrote:
> > > On Wed, 2022-04-27 at 13:37 +0200, Ilya Maximets wrote:
> > > > On 4/27/22 04:41, Jianbo Liu wrote:
> > > > > On Wed, 2022-04-27 at 01:58 +0200, Ilya Maximets wrote:
> > > > > > On 4/26/22 09:14, Simon Horman wrote:
> > > > > > > On Tue, Apr 19, 2022 at 01:38:33AM +0000, Jianbo Liu via
> > > > > > > dev
> > > > > > > wrote:
> > > > > > > > On Thu, 2022-04-07 at 09:15 +0000, Jianbo Liu wrote:
> > > > > > > > > This series is to add support for tc offloading of
> > > > > > > > > ovs
> > > > > > > > > metering, and
> > > > > > > > > enhance OVS to use new kernel feature which offload
> > > > > > > > > tc
> > > > > > > > > police
> > > > > > > > > action to
> > > > > > > > > hardware.
> > > > > > > > > To do the offloading, new APIs for meter are added in
> > > > > > > > > netdev-
> > > > > > > > > offload,
> > > > > > > > > and OVS meters are mapped to tc police actions with
> > > > > > > > > one-to-
> > > > > > > > > one
> > > > > > > > > relationship for dpif-netlink.
> > > > > > > > > 
> > > > > > > > > Notes:
> > > > > > > > >     v3
> > > > > > > > >     - Add netdev-offload APIs for meter.
> > > > > > > > >     - Move the implementation to lower netdev-
> > > > > > > > > offload-tc
> > > > > > > > > layer.
> > > > > > > > > 
> > > > > > > > >     v2
> > > > > > > > >     - Move tc police parse call from last patch to
> > > > > > > > > 2nd
> > > > > > > > > patch.
> > > > > > > > >       2nd patch is adding the parse lib func and add
> > > > > > > > > the
> > > > > > > > > call
> > > > > > > > > to it in
> > > > > > > > > that patch.
> > > > > > > > >       Last patch is the put of tc police act.
> > > > > > > > >       In 2nd patch also add empty switch case for tc
> > > > > > > > > police
> > > > > > > > > act
> > > > > > > > > put as
> > > > > > > > > the impl.
> > > > > > > > >       is done in the last patch when support for put
> > > > > > > > > is
> > > > > > > > > being
> > > > > > > > > added.
> > > > > > > 
> > > > > > > ...
> > > > > > > 
> > > > > > > > Friendly ping for review.
> > > > > > > 
> > > > > > > Hi Jianbo,
> > > > > > > 
> > > > > > > sorry for the delayed response.
> > > > > > > 
> > > > > > > My colleagues at Corigine have exercised this patchset
> > > > > > > and have
> > > > > > > verified
> > > > > > > it for our test-cases.
> > > > > > > 
> > > > > > > Also, I have run the upstream test workflows over them,
> > > > > > > and
> > > > > > > they
> > > > > > > look good.
> > > > > > > 
> > > > > > > 1. netdev-offload: Add meter offload provider
> > > > > > >     
> > > > > > > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fhorms2%2Fovs%2Factions%2Fruns%2F2220399423&data=05%7C01%7Cjianbol%40nvidia.com%7Cd62f3e1865b2471053e608da290eb982%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637867440481236224%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=UmOUgdVlvQuuCPEqlfgRlei5tZtmAv7liSbfVVaWXgE%3D&reserved=0
> > > > > > > 2. tc: Add support parsing tc police action
> > > > > > >     
> > > > > > > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fhorms2%2Fovs%2Factions%2Fruns%2F2220409233&data=05%7C01%7Cjianbol%40nvidia.com%7Cd62f3e1865b2471053e608da290eb982%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637867440481236224%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=3CA7zQl8evhu9RIF6BC5pwiLpASiSLN3jJ7%2B4lANKCo%3D&reserved=0
> > > > > > > 3. netdev-linux: Refactor put police action netlink
> > > > > > > message
> > > > > > >     
> > > > > > > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fhorms2%2Fovs%2Factions%2Fruns%2F2220516986&data=05%7C01%7Cjianbol%40nvidia.com%7Cd62f3e1865b2471053e608da290eb982%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637867440481236224%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=Fv0GEkVRMvT5TQo2wxwB%2FB4FMmUu3d2F5mBRONhen1U%3D&reserved=0
> > > > > > > 4. netdev-linux: Add functions to manipulate tc police
> > > > > > > action
> > > > > > >     
> > > > > > > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fhorms2%2Fovs%2Factions%2Fruns%2F2220566774&data=05%7C01%7Cjianbol%40nvidia.com%7Cd62f3e1865b2471053e608da290eb982%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637867440481236224%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=Nm0T35Z4q5RlkAAAXsiwOqbVo7Utm4nVZYfEtYul4gk%3D&reserved=0
> > > > > > > 5. netdev-offload-tc: Implement and register meter
> > > > > > > offload API
> > > > > > > for
> > > > > > > tc
> > > > > > >     
> > > > > > > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fhorms2%2Fovs%2Factions%2Fruns%2F2220568491&data=05%7C01%7Cjianbol%40nvidia.com%7Cd62f3e1865b2471053e608da290eb982%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637867440481236224%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=f67ByBBmS7sJC8D4kOcgSOTQSAl5NueDo4NhJL2aozU%3D&reserved=0
> > > > > > > 6. netdev-offload-tc: Cleanup police actions with
> > > > > > > reserved
> > > > > > > indexes
> > > > > > > on startup
> > > > > > >     
> > > > > > > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fhorms2%2Fovs%2Factions%2Fruns%2F2220569761&data=05%7C01%7Cjianbol%40nvidia.com%7Cd62f3e1865b2471053e608da290eb982%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637867440481236224%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=1iLtBH6tsyoOSH8HoPzg3o1zcqEkBQUVNjcs%2BHg3%2Fvc%3D&reserved=0
> > > > > > > 7. netdev-offload-tc: Offloading rules with police
> > > > > > > actions
> > > > > > >     
> > > > > > > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fhorms2%2Fovs%2Factions%2Fruns%2F2220571039&data=05%7C01%7Cjianbol%40nvidia.com%7Cd62f3e1865b2471053e608da290eb982%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637867440481236224%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=i1%2FUfISCkzpZJmSygf1eT2T%2FlMiDFosrcBrIinYJ5x8%3D&reserved=0
> > > > > > > 8. dpif-netlink: Offloading meter to tc police action
> > > > > > >     
> > > > > > > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fhorms2%2Fovs%2Factions%2Fruns%2F2220572904&data=05%7C01%7Cjianbol%40nvidia.com%7Cd62f3e1865b2471053e608da290eb982%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637867440481236224%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=vGH1Em4ddDfnHiayWJXabdyqT7TXNua8awyJoPTD4Fk%3D&reserved=0
> > > > > > > 
> > > > > > > I have also reviewed the patches, and with my OVS
> > > > > > > maintainer
> > > > > > > hat
> > > > > > > on, I'm
> > > > > > > happy to apply them, and plan to do so in the coming days
> > > > > > > unless
> > > > > > > there are
> > > > > > > objections.
> > > > > > 
> > > > > > Thanks, Simon, for taking care of this patch set!  And
> > > > > > sorry for
> > > > > > me
> > > > > > not being
> > > > > > very responsive.
> > > > > > 
> > > > > > I had a quick look over the patch set just now and I think
> > > > > > that
> > > > > > in
> > > > > > this
> > > > > > version most of my main concerns were addressed and it
> > > > > > looks good
> > > > > > in
> > > > > > general.
> > > > > > 
> > > > > > One thing I didn't understand is why we need to have
> > > > > > 'struct
> > > > > > meter_offload_api'
> > > > > > as a separate entity?  I mean, it never used if a normal
> > > > > > offload
> > > > > > API
> > > > > > is
> > > > > > not initialized and it's tied with the particular offload
> > > > > > API. 
> > > > > > Can
> > > > > > these
> > > > > > callbacks be just part of the normal 'struct
> > > > > > netdev_flow_api' ?
> > > > > > Should not be hard to merge meter_offload_api and
> > > > > > netdev_flow_api
> > > > > > into one.
> > > > > > That should also reduce the amount of code.  Or am I
> > > > > > missing
> > > > > > something?
> > > > > 
> > > > > Conceptually, meter is used globally, and it does not belong
> > > > > to any
> > > > > perticular netdev/flow. All the callbacks in 'struct
> > > > > netdev_flow_api'
> > > > > have a parameter related to netdev, but meter callbacks don't
> > > > > need.
> > > > > The meter_offload_set/get/del can be part of 'struct
> > > > > netdev_flow_api',
> > > > > but meter_offload_init/destory must be placed to elsewhere,
> > > > > to
> > > > > avoid
> > > > > being called more than once.
> > > > > So, why not add new API for meter? But I'd like to change if
> > > > > you
> > > > > insist. What's your decision?
> > > > 
> > > > I agree that meters do not belong to any particular netdev,
> > > > that's
> > > > true.  However, netdev_flow_api is also a global entity.  All
> > > > netdevs
> > > > are using the same instance of the netdev_fow_api.  And most of
> > > > the
> > > > structures in netdev-offload-tc are global (hash maps,
> > > > configurations).
> > > > 'netdev' argument can just be viewed as a guide for these
> > > > callbacks,
> > > > like meter_id for the meter offload API, not something
> > > > necessary.
> > > 
> > > Usually, we get netdev_flow_api from netdev->flow_api, but
> > > dpif_class-
> > > > meter_get/set/del don't have the param of netdev, we must add a
> > > > helper
> > > to get any netdev from dpif. The helper is more like:
> > >  
> > > struct netdev *
> > > netdev_get_any(const char *dpif_type)
> > > {
> > >     struct port_to_netdev_data *data;
> > >     struct netdev *dev = NULL;
> > > 
> > >     ovs_rwlock_rdlock(&netdev_hmap_rwlock);
> > >     HMAP_FOR_EACH (data, portno_node, &port_to_netdev) {
> > >         if (netdev_get_dpif_type(data->netdev) == dpif_type) {
> > >             dev = netdev_ref(data->netdev);
> > >             break;
> > >         }
> > >     }
> > >     ovs_rwlock_unlock(&netdev_hmap_rwlock);
> > > 
> > >     return dev;
> > > }
> > > 
> > > Do you accept it, or have better solution?
> > 
> > Hmm.  Good point, I missed that.
> > In fact, a single dpif can have ports with different offload API
> > initialized.  For example, linux ports may use TC, while DPDK ports
> > can use DPDK's rte_flow while being in the same dpif-netdev
> > instance.
> > 
> > So, I think, the correct solution is to add a meter to all flow
> > APIs
> > that are initialized for ports within that datapath.  Maybe
> > something
> > like this (not tested, pseudo-code):
> > 
> > diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c
> > index fb108c0d5..91504ee15 100644
> > --- a/lib/netdev-offload.c
> > +++ b/lib/netdev-offload.c
> > @@ -79,6 +79,9 @@ struct netdev_registered_flow_api {
> >      /* Number of references: one for the flow_api itself and one
> > for every
> >       * instance of the netdev that uses it. */
> >      struct ovs_refcount refcnt;
> > +
> > +    /* Reference counter for dpif types which has a port with this
> > flow API. */
> > +    struct simap used_by_dpif_types;
> >  };
> >  
> >  static struct netdev_registered_flow_api *
> > @@ -120,6 +123,7 @@ netdev_register_flow_api_provider(const struct
> > netdev_flow_api *new_flow_api)
> >                      hash_string(new_flow_api->type, 0));
> >          rfa->flow_api = new_flow_api;
> >          ovs_refcount_init(&rfa->refcnt);
> > +        simap_init(&rfa->used_by_dpif_types);
> >          VLOG_DBG("netdev: flow API '%s' registered.",
> > new_flow_api->type);
> >      }
> >      ovs_mutex_unlock(&netdev_flow_api_provider_mutex);
> > @@ -154,6 +158,7 @@ netdev_unregister_flow_api_provider(const char
> > *type)
> >      } else  {
> >          cmap_remove(&netdev_flow_apis, &rfa->cmap_node,
> >                      hash_string(rfa->flow_api->type, 0));
> > +        ovsrcu_postpone(simap_destroy, &rfa->used_by_dpif_types);
> >          ovsrcu_postpone(free, rfa);
> >          error = 0;
> >      }
> > @@ -182,6 +187,8 @@ netdev_assign_flow_api(struct netdev *netdev)
> >      CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) {
> >          if (!rfa->flow_api->init_flow_api(netdev)) {
> >              ovs_refcount_ref(&rfa->refcnt);
> > +            simap_increase(&rfa->used_by_dpif_types,
> > +                           netdev_get_dpif_type(netdev), 1);
> >              ovsrcu_set(&netdev->flow_api, rfa->flow_api);
> >              VLOG_INFO("%s: Assigned flow API '%s'.",
> >                        netdev_get_name(netdev), rfa->flow_api-
> > >type);
> > @@ -344,6 +351,8 @@ netdev_uninit_flow_api(struct netdev *netdev)
> >  
> >      ovsrcu_set(&netdev->flow_api, NULL);
> >      rfa = netdev_lookup_flow_api(flow_api->type);
> > +    ovs_assert(simap_increase(&rfa->used_by_dpif_types,
> > +                              netdev_get_dpif_type(netdev), -1) >=
> > 0);
> >      ovs_refcount_unref(&rfa->refcnt);
> >  }
> >  
> > @@ -739,6 +748,20 @@ netdev_ports_get_n_flows(const char
> > *dpif_type, odp_port_t port_no,
> >      return ret;
> >  }
> >  
> > +
> > +void
> > +netdev_offload_meter_set(const char *dpif_type, ...)
> > +{
> > +    struct netdev_registered_flow_api *rfa;
> > +
> > +    CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) {
> > +        if (simap_get(&rfa->used_by_dpif_types, dpif_type) > 0) {
> > +            rfa->flow_api->meter_set(...);
> > +        }
> > +    }
> > +}
> > +
> > +
> >  odp_port_t
> >  netdev_ifindex_to_odp_port(int ifindex)
> >  {
> > ---
> > 
> > ?
> 
> Thinking more, there is no point in counting netdevs, since they
> can be added after meters already created.  So, I guess, we just
> have to always add meters to all registered flow API providers,
> i.e. just:
> 
> void
> netdev_offload_meter_set(...)
> {
>     struct netdev_registered_flow_api *rfa;
> 
>     CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) {
>         rfa->flow_api->meter_set(...);
>     }
> }

You know I will put this netdev_offload_meter_set in
dpif_netlink_meter_set. But, in the future, someone may implement
meter_set for netdev_offload_dpdk, so it will be called as well. It
looks unreasonable as we want to call linux_tc's meter_set only,
dpdk_flow_api's meter_set should be called in dpif_netdev. 

> > 
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to