linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Po Liu <Po.Liu@nxp.com>
To: davem@davemloft.net, linux-kernel@vger.kernel.org,
	netdev@vger.kernel.org
Cc: vinicius.gomes@intel.com, po.liu@nxp.com, claudiu.manoil@nxp.com,
	vladimir.oltean@nxp.com, alexandru.marginean@nxp.com,
	michael.chan@broadcom.com, vishal@chelsio.com,
	saeedm@mellanox.com, leon@kernel.org, jiri@mellanox.com,
	idosch@mellanox.com, alexandre.belloni@bootlin.com,
	UNGLinuxDriver@microchip.com, kuba@kernel.org, jhs@mojatatu.com,
	xiyou.wangcong@gmail.com, simon.horman@netronome.com,
	pablo@netfilter.org, moshe@mellanox.com, m-karicheri2@ti.com,
	andre.guedes@linux.intel.com, stephen@networkplumber.org,
	Po Liu <Po.Liu@nxp.com>
Subject: [v3,net-next  2/4] net: schedule: add action gate offloading
Date: Wed, 22 Apr 2020 10:48:50 +0800	[thread overview]
Message-ID: <20200422024852.23224-3-Po.Liu@nxp.com> (raw)
In-Reply-To: <20200422024852.23224-1-Po.Liu@nxp.com>

Add the gate action to the flow action entry. Add the gate parameters to
the tc_setup_flow_action() queueing to the entries of flow_action_entry
array provide to the driver.

Signed-off-by: Po Liu <Po.Liu@nxp.com>
---
 include/net/flow_offload.h   |  10 +++
 include/net/tc_act/tc_gate.h | 115 +++++++++++++++++++++++++++++++++++
 net/sched/cls_api.c          |  33 ++++++++++
 3 files changed, 158 insertions(+)

diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h
index 3619c6acf60f..94a30fe02e6d 100644
--- a/include/net/flow_offload.h
+++ b/include/net/flow_offload.h
@@ -147,6 +147,7 @@ enum flow_action_id {
 	FLOW_ACTION_MPLS_PUSH,
 	FLOW_ACTION_MPLS_POP,
 	FLOW_ACTION_MPLS_MANGLE,
+	FLOW_ACTION_GATE,
 	NUM_FLOW_ACTIONS,
 };
 
@@ -255,6 +256,15 @@ struct flow_action_entry {
 			u8		bos;
 			u8		ttl;
 		} mpls_mangle;
+		struct {
+			u32		index;
+			s32		prio;
+			u64		basetime;
+			u64		cycletime;
+			u64		cycletimeext;
+			u32		num_entries;
+			struct action_gate_entry *entries;
+		} gate;
 	};
 	struct flow_action_cookie *cookie; /* user defined action cookie */
 };
diff --git a/include/net/tc_act/tc_gate.h b/include/net/tc_act/tc_gate.h
index b0ace55b2aaa..62633cb02c7a 100644
--- a/include/net/tc_act/tc_gate.h
+++ b/include/net/tc_act/tc_gate.h
@@ -7,6 +7,13 @@
 #include <net/act_api.h>
 #include <linux/tc_act/tc_gate.h>
 
+struct action_gate_entry {
+	u8			gate_state;
+	u32			interval;
+	s32			ipv;
+	s32			maxoctets;
+};
+
 struct tcfg_gate_entry {
 	int			index;
 	u8			gate_state;
@@ -51,4 +58,112 @@ struct tcf_gate {
 #define get_gate_param(act) ((struct tcf_gate_params *)act)
 #define get_gate_action(p) ((struct gate_action *)p)
 
+static inline bool is_tcf_gate(const struct tc_action *a)
+{
+#ifdef CONFIG_NET_CLS_ACT
+	if (a->ops && a->ops->id == TCA_ID_GATE)
+		return true;
+#endif
+	return false;
+}
+
+static inline u32 tcf_gate_index(const struct tc_action *a)
+{
+	return a->tcfa_index;
+}
+
+static inline s32 tcf_gate_prio(const struct tc_action *a)
+{
+	s32 tcfg_prio;
+
+	rcu_read_lock();
+	tcfg_prio = rcu_dereference(to_gate(a)->actg)->param.tcfg_priority;
+	rcu_read_unlock();
+
+	return tcfg_prio;
+}
+
+static inline u64 tcf_gate_basetime(const struct tc_action *a)
+{
+	u64 tcfg_basetime;
+
+	rcu_read_lock();
+	tcfg_basetime =
+		rcu_dereference(to_gate(a)->actg)->param.tcfg_basetime;
+	rcu_read_unlock();
+
+	return tcfg_basetime;
+}
+
+static inline u64 tcf_gate_cycletime(const struct tc_action *a)
+{
+	u64 tcfg_cycletime;
+
+	rcu_read_lock();
+	tcfg_cycletime =
+		rcu_dereference(to_gate(a)->actg)->param.tcfg_cycletime;
+	rcu_read_unlock();
+
+	return tcfg_cycletime;
+}
+
+static inline u64 tcf_gate_cycletimeext(const struct tc_action *a)
+{
+	u64 tcfg_cycletimeext;
+
+	rcu_read_lock();
+	tcfg_cycletimeext =
+		rcu_dereference(to_gate(a)->actg)->param.tcfg_cycletime_ext;
+	rcu_read_unlock();
+
+	return tcfg_cycletimeext;
+}
+
+static inline u32 tcf_gate_num_entries(const struct tc_action *a)
+{
+	u32 num_entries;
+
+	rcu_read_lock();
+	num_entries =
+		rcu_dereference(to_gate(a)->actg)->param.num_entries;
+	rcu_read_unlock();
+
+	return num_entries;
+}
+
+static inline struct action_gate_entry
+			*tcf_gate_get_list(const struct tc_action *a)
+{
+	struct action_gate_entry *oe;
+	struct tcf_gate_params *p;
+	struct tcfg_gate_entry *entry;
+	u32 num_entries;
+	int i = 0;
+
+	rcu_read_lock();
+	p = &(rcu_dereference(to_gate(a)->actg)->param);
+	num_entries = p->num_entries;
+	rcu_read_unlock();
+
+	list_for_each_entry(entry, &p->entries, list)
+		i++;
+
+	if (i != num_entries)
+		return NULL;
+
+	oe = kzalloc(sizeof(*oe) * num_entries, GFP_KERNEL);
+	if (!oe)
+		return NULL;
+
+	i = 0;
+	list_for_each_entry(entry, &p->entries, list) {
+		oe[i].gate_state = entry->gate_state;
+		oe[i].interval = entry->interval;
+		oe[i].ipv = entry->ipv;
+		oe[i].maxoctets = entry->maxoctets;
+		i++;
+	}
+
+	return oe;
+}
 #endif
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index 55bd1429678f..ca8bf74be4ba 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -39,6 +39,7 @@
 #include <net/tc_act/tc_skbedit.h>
 #include <net/tc_act/tc_ct.h>
 #include <net/tc_act/tc_mpls.h>
+#include <net/tc_act/tc_gate.h>
 #include <net/flow_offload.h>
 
 extern const struct nla_policy rtm_tca_policy[TCA_MAX + 1];
@@ -3523,6 +3524,27 @@ static void tcf_sample_get_group(struct flow_action_entry *entry,
 #endif
 }
 
+static void tcf_gate_entry_destructor(void *priv)
+{
+	struct action_gate_entry *oe = priv;
+
+	kfree(oe);
+}
+
+static int tcf_gate_get_entries(struct flow_action_entry *entry,
+				const struct tc_action *act)
+{
+	entry->gate.entries = tcf_gate_get_list(act);
+
+	if (!entry->gate.entries)
+		return -EINVAL;
+
+	entry->destructor = tcf_gate_entry_destructor;
+	entry->destructor_priv = entry->gate.entries;
+
+	return 0;
+}
+
 int tc_setup_flow_action(struct flow_action *flow_action,
 			 const struct tcf_exts *exts)
 {
@@ -3669,6 +3691,17 @@ int tc_setup_flow_action(struct flow_action *flow_action,
 		} else if (is_tcf_skbedit_priority(act)) {
 			entry->id = FLOW_ACTION_PRIORITY;
 			entry->priority = tcf_skbedit_priority(act);
+		} else if (is_tcf_gate(act)) {
+			entry->id = FLOW_ACTION_GATE;
+			entry->gate.index = tcf_gate_index(act);
+			entry->gate.prio = tcf_gate_prio(act);
+			entry->gate.basetime = tcf_gate_basetime(act);
+			entry->gate.cycletime = tcf_gate_cycletime(act);
+			entry->gate.cycletimeext = tcf_gate_cycletimeext(act);
+			entry->gate.num_entries = tcf_gate_num_entries(act);
+			err = tcf_gate_get_entries(entry, act);
+			if (err)
+				goto err_out;
 		} else {
 			err = -EOPNOTSUPP;
 			goto err_out_locked;
-- 
2.17.1


  parent reply	other threads:[~2020-04-22  3:09 UTC|newest]

Thread overview: 125+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-06 12:55 [RFC,net-next 0/9] Introduce a flow gate control action and apply IEEE Po Liu
2020-03-06 12:55 ` [RFC,net-next 1/9] net: qos offload add flow status with dropped count Po Liu
2020-03-06 12:56 ` [RFC,net-next 2/9] net: qos: introduce a gate control flow action Po Liu
2020-03-06 19:11   ` Jakub Kicinski
2020-03-07  6:05     ` [EXT] " Po Liu
2020-03-12 22:14   ` Vinicius Costa Gomes
2020-03-13  3:47     ` [EXT] " Po Liu
2020-03-13 18:36   ` Cong Wang
2020-03-14  4:09     ` [EXT] " Po Liu
2020-03-06 12:56 ` [RFC,net-next 3/9] net: schedule: add action gate offloading Po Liu
2020-03-06 19:02   ` Jakub Kicinski
2020-03-06 19:19     ` Jakub Kicinski
2020-03-07  4:38       ` [EXT] " Po Liu
2020-03-06 12:56 ` [RFC,net-next 4/9] net: enetc: add hw tc hw offload features for PSPF capability Po Liu
2020-03-06 12:56 ` [RFC,net-next 5/9] net: enetc: add tc flower psfp offload driver Po Liu
2020-03-12 22:14   ` Vinicius Costa Gomes
2020-03-13  5:59     ` [EXT] " Po Liu
2020-03-06 12:56 ` [RFC,net-next 6/9] net: qos: add tc police offloading action with max frame size limit Po Liu
2020-06-23  6:34   ` [v1,net-next 1/4] " Po Liu
2020-06-23  6:34     ` [v1,net-next 2/4] net: enetc: add support max frame size for tc flower offload Po Liu
2020-06-23  6:34     ` [v1,net-next 3/4] net: qos: police action add index for tc flower offloading Po Liu
2020-06-23  7:09       ` Ido Schimmel
2020-06-23  7:39         ` [EXT] " Po Liu
2020-06-23 10:08       ` Jamal Hadi Salim
2020-06-23  6:34     ` [v1,net-next 4/4] net: enetc add tc flower offload flow metering policing action Po Liu
2020-06-23 14:54       ` kernel test robot
2020-06-23 15:08       ` kernel test robot
2020-06-24  9:36       ` [v2,net-next 1/4] net: qos: add tc police offloading action with max frame size limit Po Liu
2020-06-24  9:36         ` [v2,net-next 2/4] net: enetc: add support max frame size for tc flower offload Po Liu
2020-06-25  5:04           ` David Miller
2020-06-24  9:36         ` [v2,net-next 3/4] net: qos: police action add index for tc flower offloading Po Liu
2020-06-25  5:04           ` David Miller
2020-06-24  9:36         ` [v2,net-next 4/4] net: enetc add tc flower offload flow metering policing action Po Liu
2020-06-25  5:04           ` David Miller
2020-06-25  5:04         ` [v2,net-next 1/4] net: qos: add tc police offloading action with max frame size limit David Miller
2020-06-23  7:01     ` [v1,net-next " Ido Schimmel
2020-03-06 12:56 ` [RFC,net-next 7/9] net: enetc: add support max frame size for tc flower offload Po Liu
2020-03-06 12:56 ` [RFC,net-next 8/9] net: qos: police action add index for tc flower offloading Po Liu
2020-06-21 10:04   ` Ido Schimmel
2020-03-06 12:56 ` [RFC,net-next 9/9] net: enetc add tc flower offload flow metering policing action Po Liu
2020-03-06 12:56 ` [RFC, iproute2-next] iproute2:tc:action: add a gate control action Po Liu
2020-03-24  3:47   ` [v1,net-next 0/5] Introduce a flow gate control action and apply IEEE Po Liu
2020-03-24  3:47     ` [v1,net-next 1/5] net: qos offload add flow status with dropped count Po Liu
2020-03-24 10:01       ` Jiri Pirko
2020-03-24 13:04         ` [EXT] " Po Liu
2020-03-24  3:47     ` [v1,net-next 2/5] net: qos: introduce a gate control flow action Po Liu
2020-03-24 10:19       ` Jiri Pirko
2020-03-24 10:28         ` [EXT] " Po Liu
2020-03-24  3:47     ` [v1,net-next 3/5] net: schedule: add action gate offloading Po Liu
2020-03-24  3:47     ` [v1,net-next 4/5] net: enetc: add hw tc hw offload features for PSPF capability Po Liu
2020-03-24 11:18       ` kbuild test robot
2020-03-24 12:14       ` Jiri Pirko
2020-03-24  3:47     ` [v1,net-next 5/5] net: enetc: add tc flower psfp offload driver Po Liu
2020-03-24 12:53       ` kbuild test robot
2020-03-24  3:47     ` [v1,iproute2 1/2] iproute2:tc:action: add a gate control action Po Liu
2020-03-24 21:59       ` Stephen Hemminger
2020-03-25  2:40         ` [EXT] " Po Liu
2020-03-24  3:47     ` [v1,iproute2 2/2] iproute2: add gate action man page Po Liu
2020-04-14  5:40       ` [v2,net-next 0/4] Introduce a flow gate control action and apply IEEE Po Liu
2020-04-14  5:40         ` [ v2,net-next 1/4] net: qos: introduce a gate control flow action Po Liu
2020-04-14  5:40         ` [ v2,net-next 2/4] net: schedule: add action gate offloading Po Liu
2020-04-14  5:40         ` [ v2,net-next 3/4] net: enetc: add hw tc hw offload features for PSPF capability Po Liu
2020-04-14  5:40         ` [ v2,net-next 4/4] net: enetc: add tc flower psfp offload driver Po Liu
2020-04-14 23:41         ` [v2,net-next 0/4] Introduce a flow gate control action and apply IEEE David Miller
2020-04-18  1:12       ` Po Liu
2020-04-18  1:12         ` [ v2,net-next 1/4] net: qos: introduce a gate control flow action Po Liu
2020-04-18  1:12         ` [ v2,net-next 2/4] net: schedule: add action gate offloading Po Liu
2020-04-18  1:12         ` [ v2,net-next 3/4] net: enetc: add hw tc hw offload features for PSPF capability Po Liu
2020-04-18  1:12         ` [ v2,net-next 4/4] net: enetc: add tc flower psfp offload driver Po Liu
2020-04-18 22:52           ` Vladimir Oltean
2020-04-19  1:44             ` [EXT] " Po Liu
2020-04-22  2:48           ` [v3,net-next 0/4] Introduce a flow gate control action and apply IEEE Po Liu
2020-04-22  2:48             ` [v3,net-next 1/4] net: qos: introduce a gate control flow action Po Liu
2020-04-22 13:23               ` Vlad Buslov
2020-04-23  3:14                 ` [EXT] " Po Liu
2020-04-23  7:43                   ` Vlad Buslov
2020-04-23  8:32                     ` Po Liu
2020-04-23  9:15                       ` Po Liu
2020-04-23 11:14                         ` Vlad Buslov
2020-04-23 11:03                       ` Vlad Buslov
2020-04-22 19:19               ` Allan W. Nielsen
2020-04-22 19:28                 ` Vladimir Oltean
2020-04-22 20:05                   ` Dave Taht
2020-04-23  3:29                     ` [EXT] " Po Liu
2020-04-23 19:11                   ` Allan W. Nielsen
2020-04-23  3:27                 ` [EXT] " Po Liu
2020-04-23 17:38               ` Vinicius Costa Gomes
2020-04-23 19:17                 ` Allan W. Nielsen
2020-04-24  3:23                 ` [EXT] " Po Liu
2020-04-24 17:41                   ` Vinicius Costa Gomes
2020-04-25  1:49                     ` Po Liu
2020-04-22  2:48             ` Po Liu [this message]
2020-04-22 14:14               ` [v3,net-next 2/4] net: schedule: add action gate offloading Vlad Buslov
2020-04-22  2:48             ` [v3,net-next 3/4] net: enetc: add hw tc hw offload features for PSPF capability Po Liu
2020-04-22  2:48             ` [v3,net-next 4/4] net: enetc: add tc flower psfp offload driver Po Liu
2020-04-28  3:34               ` [v4,net-next 0/4] Introduce a flow gate control action and apply IEEE Po Liu
2020-04-28  3:34                 ` [v4,net-next 1/4] net: qos: introduce a gate control flow action Po Liu
2020-04-29 17:04                   ` Vlad Buslov
2020-04-30  0:52                     ` [EXT] " Po Liu
2020-04-28  3:34                 ` [v4,net-next 2/4] net: schedule: add action gate offloading Po Liu
2020-04-29 17:40                   ` Vlad Buslov
2020-04-28  3:34                 ` [v4,net-next 3/4] net: enetc: add hw tc hw offload features for PSPF capability Po Liu
2020-04-28  3:34                 ` [v4,net-next 4/4] net: enetc: add tc flower psfp offload driver Po Liu
2020-05-01  0:53                   ` [v5,net-next 0/4] Introduce a flow gate control action and apply IEEE Po Liu
2020-05-01  0:53                     ` [v5,net-next 1/4] net: qos: introduce a gate control flow action Po Liu
2020-05-01  0:53                     ` [v5,net-next 2/4] net: schedule: add action gate offloading Po Liu
2020-05-01  0:53                     ` [v5,net-next 3/4] net: enetc: add hw tc hw offload features for PSPF capability Po Liu
2020-05-01  0:53                     ` [v5,net-next 4/4] net: enetc: add tc flower psfp offload driver Po Liu
2020-05-03  6:32                       ` [v3,iproute2 1/2] iproute2:tc:action: add a gate control action Po Liu
2020-05-03  6:32                         ` [v3,iproute2 2/2] iproute2: add gate action man page Po Liu
2020-05-06  8:40                           ` [v4,iproute2-next 1/2] iproute2-next:tc:action: add a gate control action Po Liu
2020-05-06  8:40                             ` [v4,iproute2-next 2/2] iproute2-next: add gate action man page Po Liu
2020-05-08  7:02                               ` [v5,iproute2-next 1/2] iproute2-next:tc:action: add a gate control action Po Liu
2020-05-08  7:02                                 ` [v5,iproute2-next 2/2] iproute2-next: add gate action man page Po Liu
2020-05-13  2:21                                 ` [v5,iproute2-next 1/2] iproute2-next:tc:action: add a gate control action David Ahern
2020-05-06 12:54                             ` [v4,iproute2-next " Davide Caratti
2020-05-07  2:28                               ` [EXT] " Po Liu
2020-05-06 15:21                             ` Stephen Hemminger
2020-05-05  0:05                         ` [v3,iproute2 1/2] iproute2:tc:action: " Stephen Hemminger
2020-05-05  0:06                         ` Stephen Hemminger
2020-05-01 23:08                     ` [v5,net-next 0/4] Introduce a flow gate control action and apply IEEE David Miller
2020-06-19  6:01     ` [v2,net-next] net: qos offload add flow status with dropped count Po Liu
2020-06-19  7:03       ` Simon Horman
2020-06-19 18:00       ` Vlad Buslov
2020-06-19 19:54       ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200422024852.23224-3-Po.Liu@nxp.com \
    --to=po.liu@nxp.com \
    --cc=UNGLinuxDriver@microchip.com \
    --cc=alexandre.belloni@bootlin.com \
    --cc=alexandru.marginean@nxp.com \
    --cc=andre.guedes@linux.intel.com \
    --cc=claudiu.manoil@nxp.com \
    --cc=davem@davemloft.net \
    --cc=idosch@mellanox.com \
    --cc=jhs@mojatatu.com \
    --cc=jiri@mellanox.com \
    --cc=kuba@kernel.org \
    --cc=leon@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=m-karicheri2@ti.com \
    --cc=michael.chan@broadcom.com \
    --cc=moshe@mellanox.com \
    --cc=netdev@vger.kernel.org \
    --cc=pablo@netfilter.org \
    --cc=saeedm@mellanox.com \
    --cc=simon.horman@netronome.com \
    --cc=stephen@networkplumber.org \
    --cc=vinicius.gomes@intel.com \
    --cc=vishal@chelsio.com \
    --cc=vladimir.oltean@nxp.com \
    --cc=xiyou.wangcong@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).