diff mbox series

[net-next,v2,2/4] devlink: add .trap_group_action_set() callback

Message ID 20200930191645.9520-3-ioana.ciornei@nxp.com
State Changes Requested
Delegated to: David Miller
Headers show
Series dpaa2-eth: add devlink parser error drop trap support | expand

Commit Message

Ioana Ciornei Sept. 30, 2020, 7:16 p.m. UTC
Add a new devlink callback, .trap_group_action_set(), which can be used
by device drivers which do not support controlling the action (drop,
trap) on each trap but rather on the entire group trap.
If this new callback is populated, it will take precedence over the
.trap_action_set() callback when the user requests a change of all the
traps in a group.

Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
---
Changes in v2:
 - none

 include/net/devlink.h | 10 ++++++++++
 net/core/devlink.c    | 18 ++++++++++++++++++
 2 files changed, 28 insertions(+)

Comments

Ido Schimmel Sept. 30, 2020, 7:53 p.m. UTC | #1
On Wed, Sep 30, 2020 at 10:16:43PM +0300, Ioana Ciornei wrote:
> Add a new devlink callback, .trap_group_action_set(), which can be used
> by device drivers which do not support controlling the action (drop,
> trap) on each trap but rather on the entire group trap.
> If this new callback is populated, it will take precedence over the
> .trap_action_set() callback when the user requests a change of all the
> traps in a group.
> 
> Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>

Did you test this change with

tools/testing/selftests/drivers/net/netdevsim/devlink_trap.sh

?

Just to make sure you didn't add a regression

> ---
> Changes in v2:
>  - none
> 
>  include/net/devlink.h | 10 ++++++++++
>  net/core/devlink.c    | 18 ++++++++++++++++++
>  2 files changed, 28 insertions(+)
> 
> diff --git a/include/net/devlink.h b/include/net/devlink.h
> index 20db4a070fc8..307937efa83a 100644
> --- a/include/net/devlink.h
> +++ b/include/net/devlink.h
> @@ -1226,6 +1226,16 @@ struct devlink_ops {
>  			      const struct devlink_trap_group *group,
>  			      const struct devlink_trap_policer *policer,
>  			      struct netlink_ext_ack *extack);
> +	/**
> +	 * @trap_group_action_set: Group action set function.

To be consistent with other operations:

Trap group action set function.

> +	 *
> +	 * If this callback is populated, it will take precedence over looping
> +	 * over all traps in a group and calling .trap_action_set().
> +	 */
> +	int (*trap_group_action_set)(struct devlink *devlink,
> +				     const struct devlink_trap_group *group,
> +				     enum devlink_trap_action action,
> +				     struct netlink_ext_ack *extack);
>  	/**
>  	 * @trap_policer_init: Trap policer initialization function.
>  	 *
> diff --git a/net/core/devlink.c b/net/core/devlink.c
> index 10fea5854bc2..18136ad413e6 100644
> --- a/net/core/devlink.c
> +++ b/net/core/devlink.c
> @@ -6720,6 +6720,24 @@ __devlink_trap_group_action_set(struct devlink *devlink,
>  	struct devlink_trap_item *trap_item;
>  	int err;
>  
> +	if (devlink->ops->trap_group_action_set) {
> +		err = devlink->ops->trap_group_action_set(devlink, group_item->group,
> +							  trap_action, extack);
> +		if (err)
> +			return err;
> +
> +		list_for_each_entry(trap_item, &devlink->trap_list, list) {
> +			if (strcmp(trap_item->group_item->group->name, group_name))
> +				continue;
> +			if (trap_item->action != trap_action &&
> +			    trap_item->trap->type != DEVLINK_TRAP_TYPE_DROP)
> +				continue;
> +			trap_item->action = trap_action;
> +		}
> +
> +		return 0;
> +	}
> +
>  	list_for_each_entry(trap_item, &devlink->trap_list, list) {
>  		if (strcmp(trap_item->group_item->group->name, group_name))
>  			continue;
> -- 
> 2.28.0
>
Ioana Ciornei Oct. 1, 2020, 1:21 p.m. UTC | #2
On Wed, Sep 30, 2020 at 10:53:31PM +0300, Ido Schimmel wrote:
> On Wed, Sep 30, 2020 at 10:16:43PM +0300, Ioana Ciornei wrote:
> > Add a new devlink callback, .trap_group_action_set(), which can be used
> > by device drivers which do not support controlling the action (drop,
> > trap) on each trap but rather on the entire group trap.
> > If this new callback is populated, it will take precedence over the
> > .trap_action_set() callback when the user requests a change of all the
> > traps in a group.
> > 
> > Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
> 
> Did you test this change with
> 
> tools/testing/selftests/drivers/net/netdevsim/devlink_trap.sh
> 
> ?
> 
> Just to make sure you didn't add a regression

Yes, everything seems alright.

[root@bionic ~/.../drivers/net/netdevsim] # ./devlink_trap.sh 
TEST: Initialization                                                [ OK ]
TEST: Trap action                                                   [ OK ]
TEST: Trap metadata                                                 [ OK ]
TEST: Non-existing trap                                             [ OK ]
TEST: Non-existing trap action                                      [ OK ]
TEST: Trap statistics                                               [ OK ]
TEST: Trap group action                                             [ OK ]
TEST: Non-existing trap group                                       [ OK ]
TEST: Trap group statistics                                         [ OK ]
TEST: Trap policer                                                  [ OK ]
TEST: Trap policer binding                                          [ OK ]
TEST: Port delete                                                   [ OK ]
TEST: Device delete                                                 [ OK ]

> 
> > ---
> > Changes in v2:
> >  - none
> > 
> >  include/net/devlink.h | 10 ++++++++++
> >  net/core/devlink.c    | 18 ++++++++++++++++++
> >  2 files changed, 28 insertions(+)
> > 
> > diff --git a/include/net/devlink.h b/include/net/devlink.h
> > index 20db4a070fc8..307937efa83a 100644
> > --- a/include/net/devlink.h
> > +++ b/include/net/devlink.h
> > @@ -1226,6 +1226,16 @@ struct devlink_ops {
> >  			      const struct devlink_trap_group *group,
> >  			      const struct devlink_trap_policer *policer,
> >  			      struct netlink_ext_ack *extack);
> > +	/**
> > +	 * @trap_group_action_set: Group action set function.
> 
> To be consistent with other operations:
> 
> Trap group action set function.

You mean the comment, right? Sure, will change.
> 
> > +	 *
> > +	 * If this callback is populated, it will take precedence over looping
> > +	 * over all traps in a group and calling .trap_action_set().
> > +	 */
> > +	int (*trap_group_action_set)(struct devlink *devlink,
> > +				     const struct devlink_trap_group *group,
> > +				     enum devlink_trap_action action,
> > +				     struct netlink_ext_ack *extack);
> >  	/**
> >  	 * @trap_policer_init: Trap policer initialization function.
> >  	 *
> > diff --git a/net/core/devlink.c b/net/core/devlink.c
> > index 10fea5854bc2..18136ad413e6 100644
> > --- a/net/core/devlink.c
> > +++ b/net/core/devlink.c
> > @@ -6720,6 +6720,24 @@ __devlink_trap_group_action_set(struct devlink *devlink,
> >  	struct devlink_trap_item *trap_item;
> >  	int err;
> >  
> > +	if (devlink->ops->trap_group_action_set) {
> > +		err = devlink->ops->trap_group_action_set(devlink, group_item->group,
> > +							  trap_action, extack);
> > +		if (err)
> > +			return err;
> > +
> > +		list_for_each_entry(trap_item, &devlink->trap_list, list) {
> > +			if (strcmp(trap_item->group_item->group->name, group_name))
> > +				continue;
> > +			if (trap_item->action != trap_action &&
> > +			    trap_item->trap->type != DEVLINK_TRAP_TYPE_DROP)
> > +				continue;
> > +			trap_item->action = trap_action;
> > +		}
> > +
> > +		return 0;
> > +	}
> > +
> >  	list_for_each_entry(trap_item, &devlink->trap_list, list) {
> >  		if (strcmp(trap_item->group_item->group->name, group_name))
> >  			continue;
> > -- 
> > 2.28.0
> >
diff mbox series

Patch

diff --git a/include/net/devlink.h b/include/net/devlink.h
index 20db4a070fc8..307937efa83a 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -1226,6 +1226,16 @@  struct devlink_ops {
 			      const struct devlink_trap_group *group,
 			      const struct devlink_trap_policer *policer,
 			      struct netlink_ext_ack *extack);
+	/**
+	 * @trap_group_action_set: Group action set function.
+	 *
+	 * If this callback is populated, it will take precedence over looping
+	 * over all traps in a group and calling .trap_action_set().
+	 */
+	int (*trap_group_action_set)(struct devlink *devlink,
+				     const struct devlink_trap_group *group,
+				     enum devlink_trap_action action,
+				     struct netlink_ext_ack *extack);
 	/**
 	 * @trap_policer_init: Trap policer initialization function.
 	 *
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 10fea5854bc2..18136ad413e6 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -6720,6 +6720,24 @@  __devlink_trap_group_action_set(struct devlink *devlink,
 	struct devlink_trap_item *trap_item;
 	int err;
 
+	if (devlink->ops->trap_group_action_set) {
+		err = devlink->ops->trap_group_action_set(devlink, group_item->group,
+							  trap_action, extack);
+		if (err)
+			return err;
+
+		list_for_each_entry(trap_item, &devlink->trap_list, list) {
+			if (strcmp(trap_item->group_item->group->name, group_name))
+				continue;
+			if (trap_item->action != trap_action &&
+			    trap_item->trap->type != DEVLINK_TRAP_TYPE_DROP)
+				continue;
+			trap_item->action = trap_action;
+		}
+
+		return 0;
+	}
+
 	list_for_each_entry(trap_item, &devlink->trap_list, list) {
 		if (strcmp(trap_item->group_item->group->name, group_name))
 			continue;