From: Vladimir Oltean <vladimir.oltean@nxp.com>
To: intel-wired-lan@osuosl.org
Subject: [Intel-wired-lan] [PATCH net-next v4 02/12] taprio: Add support for frame preemption offload
Date: Sun, 27 Jun 2021 19:58:26 +0000 [thread overview]
Message-ID: <20210627195826.fax7l4hd2itze4pi@skbuf> (raw)
In-Reply-To: <20210626003314.3159402-3-vinicius.gomes@intel.com>
On Fri, Jun 25, 2021 at 05:33:04PM -0700, Vinicius Costa Gomes wrote:
> Adds a way to configure which traffic classes are marked as
> preemptible and which are marked as express.
>
> Even if frame preemption is not a "real" offload, because it can't be
> executed purely in software, having this information near where the
> mapping of traffic classes to queues is specified, makes it,
> hopefully, easier to use.
>
> taprio will receive the information of which traffic classes are
> marked as express/preemptible, and when offloading frame preemption to
> the driver will convert the information, so the driver receives which
> queues are marked as express/preemptible.
>
> Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
> ---
> include/linux/netdevice.h | 1 +
> include/net/pkt_sched.h | 4 ++++
> include/uapi/linux/pkt_sched.h | 1 +
> net/sched/sch_taprio.c | 43 ++++++++++++++++++++++++++++++----
> 4 files changed, 44 insertions(+), 5 deletions(-)
>
> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index be1dcceda5e4..af5d4c5b0ad5 100644
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -923,6 +923,7 @@ enum tc_setup_type {
> TC_SETUP_QDISC_TBF,
> TC_SETUP_QDISC_FIFO,
> TC_SETUP_QDISC_HTB,
> + TC_SETUP_PREEMPT,
> };
>
> /* These structures hold the attributes of bpf state that are being passed
> diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h
> index 6d7b12cba015..b4cb479d1cf5 100644
> --- a/include/net/pkt_sched.h
> +++ b/include/net/pkt_sched.h
> @@ -178,6 +178,10 @@ struct tc_taprio_qopt_offload {
> struct tc_taprio_sched_entry entries[];
> };
>
> +struct tc_preempt_qopt_offload {
> + u32 preemptible_queues;
> +};
> +
> /* Reference counting */
> struct tc_taprio_qopt_offload *taprio_offload_get(struct tc_taprio_qopt_offload
> *offload);
> diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h
> index 79a699f106b1..830ce9c9ec6f 100644
> --- a/include/uapi/linux/pkt_sched.h
> +++ b/include/uapi/linux/pkt_sched.h
> @@ -1241,6 +1241,7 @@ enum {
> TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION, /* s64 */
> TCA_TAPRIO_ATTR_FLAGS, /* u32 */
> TCA_TAPRIO_ATTR_TXTIME_DELAY, /* u32 */
> + TCA_TAPRIO_ATTR_PREEMPT_TCS, /* u32 */
> __TCA_TAPRIO_ATTR_MAX,
> };
>
> diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c
> index 66fe2b82af9a..58586f98c648 100644
> --- a/net/sched/sch_taprio.c
> +++ b/net/sched/sch_taprio.c
> @@ -64,6 +64,7 @@ struct taprio_sched {
> struct Qdisc **qdiscs;
> struct Qdisc *root;
> u32 flags;
> + u32 preemptible_tcs;
> enum tk_offsets tk_offset;
> int clockid;
> atomic64_t picos_per_byte; /* Using picoseconds because for 10Gbps+
> @@ -786,6 +787,7 @@ static const struct nla_policy taprio_policy[TCA_TAPRIO_ATTR_MAX + 1] = {
> [TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION] = { .type = NLA_S64 },
> [TCA_TAPRIO_ATTR_FLAGS] = { .type = NLA_U32 },
> [TCA_TAPRIO_ATTR_TXTIME_DELAY] = { .type = NLA_U32 },
> + [TCA_TAPRIO_ATTR_PREEMPT_TCS] = { .type = NLA_U32 },
> };
>
> static int fill_sched_entry(struct taprio_sched *q, struct nlattr **tb,
> @@ -1284,6 +1286,7 @@ static int taprio_disable_offload(struct net_device *dev,
> struct netlink_ext_ack *extack)
> {
> const struct net_device_ops *ops = dev->netdev_ops;
> + struct tc_preempt_qopt_offload preempt = { };
> struct tc_taprio_qopt_offload *offload;
> int err;
>
> @@ -1302,13 +1305,15 @@ static int taprio_disable_offload(struct net_device *dev,
> offload->enable = 0;
>
> err = ops->ndo_setup_tc(dev, TC_SETUP_QDISC_TAPRIO, offload);
> - if (err < 0) {
> + if (err < 0)
> NL_SET_ERR_MSG(extack,
> - "Device failed to disable offload");
> - goto out;
> - }
> + "Device failed to disable taprio offload");
> +
> + err = ops->ndo_setup_tc(dev, TC_SETUP_PREEMPT, &preempt);
> + if (err < 0)
> + NL_SET_ERR_MSG(extack,
> + "Device failed to disable frame preemption offload");
First line in taprio_disable_offload() is:
if (!FULL_OFFLOAD_IS_ENABLED(q->flags))
return 0;
but you said it yourself below that the preemptible queues thing is
independent of whether you have taprio offload or not (or taprio at
all). So the queues will never be reset back to the eMAC if you don't
use full offload (yes, this includes txtime offload too). In fact, it's
so independent, that I don't even know why we add them to taprio in the
first place :)
I think the argument had to do with the hold/advance commands (other
frame preemption stuff that's already in taprio), but those are really
special and only to be used in the Qbv+Qbu combination, but the pMAC
traffic classes? I don't know... Honestly I thought that me asking to
see preemptible queues implemented for mqprio as well was going to
discourage you, but oh well...
>
> -out:
> taprio_offload_free(offload);
>
> return err;
> @@ -1525,6 +1530,29 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
> mqprio->prio_tc_map[i]);
> }
>
> + /* It's valid to enable frame preemption without any kind of
> + * offloading being enabled, so keep it separated.
> + */
> + if (tb[TCA_TAPRIO_ATTR_PREEMPT_TCS]) {
> + u32 preempt = nla_get_u32(tb[TCA_TAPRIO_ATTR_PREEMPT_TCS]);
> + struct tc_preempt_qopt_offload qopt = { };
> +
> + if (preempt == U32_MAX) {
> + NL_SET_ERR_MSG(extack, "At least one queue must be not be preemptible");
> + err = -EINVAL;
> + goto free_sched;
> + }
Hmmm, did we somehow agree that at least one traffic class must not be
preemptible? Citation needed.
> +
> + qopt.preemptible_queues = tc_map_to_queue_mask(dev, preempt);
> +
> + err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_PREEMPT,
> + &qopt);
> + if (err)
> + goto free_sched;
> +
> + q->preemptible_tcs = preempt;
> + }
> +
> if (FULL_OFFLOAD_IS_ENABLED(q->flags))
> err = taprio_enable_offload(dev, q, new_admin, extack);
> else
> @@ -1681,6 +1709,7 @@ static int taprio_init(struct Qdisc *sch, struct nlattr *opt,
> */
> q->clockid = -1;
> q->flags = TAPRIO_FLAGS_INVALID;
> + q->preemptible_tcs = U32_MAX;
>
> spin_lock(&taprio_list_lock);
> list_add(&q->taprio_list, &taprio_list);
> @@ -1899,6 +1928,10 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
> if (q->flags && nla_put_u32(skb, TCA_TAPRIO_ATTR_FLAGS, q->flags))
> goto options_error;
>
> + if (q->preemptible_tcs != U32_MAX &&
> + nla_put_u32(skb, TCA_TAPRIO_ATTR_PREEMPT_TCS, q->preemptible_tcs))
> + goto options_error;
> +
> if (q->txtime_delay &&
> nla_put_u32(skb, TCA_TAPRIO_ATTR_TXTIME_DELAY, q->txtime_delay))
> goto options_error;
> --
> 2.32.0
>
next prev parent reply other threads:[~2021-06-27 19:58 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-26 0:33 [Intel-wired-lan] [PATCH net-next v4 00/12] ethtool: Add support for frame preemption Vinicius Costa Gomes
2021-06-26 0:33 ` [Intel-wired-lan] [PATCH net-next v4 01/12] ethtool: Add support for configuring " Vinicius Costa Gomes
2021-06-27 19:43 ` Vladimir Oltean
2022-04-11 22:39 ` Vinicius Costa Gomes
2021-06-26 0:33 ` [Intel-wired-lan] [PATCH net-next v4 02/12] taprio: Add support for frame preemption offload Vinicius Costa Gomes
2021-06-27 19:58 ` Vladimir Oltean [this message]
2022-04-11 23:31 ` Vinicius Costa Gomes
2022-04-12 0:08 ` Vladimir Oltean
2022-04-12 0:38 ` Vinicius Costa Gomes
2021-06-26 0:33 ` [Intel-wired-lan] [PATCH net-next v4 03/12] core: Introduce netdev_tc_map_to_queue_mask() Vinicius Costa Gomes
2021-06-26 0:33 ` [Intel-wired-lan] [PATCH net-next v4 04/12] taprio: Replace tc_map_to_queue_mask() Vinicius Costa Gomes
2021-06-27 20:02 ` Vladimir Oltean
2021-06-26 0:33 ` [Intel-wired-lan] [PATCH net-next v4 05/12] mqprio: Add support for frame preemption offload Vinicius Costa Gomes
2021-06-26 0:33 ` [Intel-wired-lan] [PATCH net-next v4 06/12] igc: Add support for enabling frame preemption via ethtool Vinicius Costa Gomes
2021-06-26 0:33 ` [Intel-wired-lan] [PATCH net-next v4 07/12] igc: Add support for TC_SETUP_PREEMPT Vinicius Costa Gomes
2021-06-26 0:33 ` [Intel-wired-lan] [PATCH net-next v4 08/12] igc: Simplify TSN flags handling Vinicius Costa Gomes
2021-06-26 0:33 ` [Intel-wired-lan] [PATCH net-next v4 09/12] igc: Add support for setting frame preemption configuration Vinicius Costa Gomes
2021-06-26 0:33 ` [Intel-wired-lan] [PATCH net-next v4 10/12] ethtool: Add support for Frame Preemption verification Vinicius Costa Gomes
2021-06-28 9:17 ` Vladimir Oltean
2021-06-26 0:33 ` [Intel-wired-lan] [PATCH net-next v4 11/12] igc: Check incompatible configs for Frame Preemption Vinicius Costa Gomes
2021-06-28 9:20 ` Vladimir Oltean
2022-04-11 23:36 ` Vinicius Costa Gomes
2021-06-26 0:33 ` [Intel-wired-lan] [PATCH net-next v4 12/12] igc: Add support for Frame Preemption verification Vinicius Costa Gomes
2021-06-28 9:59 ` Vladimir Oltean
2022-04-12 0:13 ` Vinicius Costa Gomes
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=20210627195826.fax7l4hd2itze4pi@skbuf \
--to=vladimir.oltean@nxp.com \
--cc=intel-wired-lan@osuosl.org \
/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