From: Felix Fietkau <nbd@nbd.name>
To: Maxime Chevallier <maxime.chevallier@bootlin.com>,
Jakub Kicinski <kuba@kernel.org>
Cc: davem@davemloft.net, Rob Herring <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Eric Dumazet <edumazet@google.com>,
Paolo Abeni <pabeni@redhat.com>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
devicetree@vger.kernel.org, thomas.petazzoni@bootlin.com,
Andrew Lunn <andrew@lunn.ch>,
Florian Fainelli <f.fainelli@gmail.com>,
Heiner Kallweit <hkallweit1@gmail.com>,
Russell King <linux@armlinux.org.uk>,
linux-arm-kernel@lists.infradead.org,
Vladimir Oltean <vladimir.oltean@nxp.com>,
Luka Perkov <luka.perkov@sartura.hr>,
Robert Marko <robert.marko@sartura.hr>,
Andy Gross <agross@kernel.org>,
Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konrad.dybcio@somainline.org>
Subject: Re: [PATCH net-next v8 3/5] net: dsa: add out-of-band tagging protocol
Date: Tue, 8 Nov 2022 13:22:17 +0100 [thread overview]
Message-ID: <6b38ec27-65a3-c973-c5e1-a25bbe4f6104@nbd.name> (raw)
In-Reply-To: <20221107093950.74de3fa1@pc-8.home>
On 07.11.22 09:39, Maxime Chevallier wrote:
>> On Fri, 4 Nov 2022 18:41:49 +0100 Maxime Chevallier wrote:
>> > This tagging protocol is designed for the situation where the link
>> > between the MAC and the Switch is designed such that the Destination
>> > Port, which is usually embedded in some part of the Ethernet
>> > Header, is sent out-of-band, and isn't present at all in the
>> > Ethernet frame.
>> >
>> > This can happen when the MAC and Switch are tightly integrated on an
>> > SoC, as is the case with the Qualcomm IPQ4019 for example, where
>> > the DSA tag is inserted directly into the DMA descriptors. In that
>> > case, the MAC driver is responsible for sending the tag to the
>> > switch using the out-of-band medium. To do so, the MAC driver needs
>> > to have the information of the destination port for that skb.
>> >
>> > Add a new tagging protocol based on SKB extensions to convey the
>> > information about the destination port to the MAC driver
>>
>> This is what METADATA_HW_PORT_MUX is for, you shouldn't have
>> to allocate a piece of memory for every single packet.
>
> Does this work with DSA ? The information conveyed in the extension is
> the DSA port identifier. I'm not familiar at all with
> METADATA_HW_PORT_MUX, should we extend that mechanism to convey the
> DSA port id ?
>
> I also agree that allocating data isn't the best way to go, but from
> the history of this series, we've tried 3 approaches so far :
>
> - Adding a new field to struct sk_buff, which isn't a good idea
> - Using the skb headroom, but then we can't know for sure is the skb
> contains a DSA tag or not
> - Using skb extensions, that comes with the cost of this memory
> allocation. Is this approach also incorrect then ?
FYI, I'm currently working on hardware DSA untagging on the mediatek
mtk_eth_soc driver. On this hardware, I definitely need to keep the
custom DSA tag driver, as hardware untagging is not always available.
For the receive side, I came up with this patch (still untested) for
using METADATA_HW_PORT_MUX.
It has the advantage of being able to skip the tag protocol rcv ops
call for offload-enabled packets.
Maybe for the transmit side we could have some kind of netdev feature
or capability that indicates offload support and allows skipping the
tag xmit function as well.
In that case, ipqess could simply use a no-op tag driver.
What do you think?
---
--- a/net/core/flow_dissector.c
+++ b/net/core/flow_dissector.c
@@ -972,11 +972,13 @@ bool __skb_flow_dissect(const struct net *net,
if (unlikely(skb->dev && netdev_uses_dsa(skb->dev) &&
skb->protocol == htons(ETH_P_XDSA))) {
const struct dsa_device_ops *ops;
+ struct metadata_dst *md_dst = skb_metadata_dst(skb);
int offset = 0;
ops = skb->dev->dsa_ptr->tag_ops;
/* Only DSA header taggers break flow dissection */
- if (ops->needed_headroom) {
+ if (ops->needed_headroom &&
+ (!md_dst || md_dst->type != METADATA_HW_PORT_MUX)) {
if (ops->flow_dissect)
ops->flow_dissect(skb, &proto, &offset);
else
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -11,6 +11,7 @@
#include <linux/netdevice.h>
#include <linux/sysfs.h>
#include <linux/ptp_classify.h>
+#include <net/dst_metadata.h>
#include "dsa_priv.h"
@@ -216,6 +217,7 @@ static bool dsa_skb_defer_rx_timestamp(struct dsa_slave_priv *p,
static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
struct packet_type *pt, struct net_device *unused)
{
+ struct metadata_dst *md_dst = skb_metadata_dst(skb);
struct dsa_port *cpu_dp = dev->dsa_ptr;
struct sk_buff *nskb = NULL;
struct dsa_slave_priv *p;
@@ -229,7 +231,21 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
if (!skb)
return 0;
- nskb = cpu_dp->rcv(skb, dev);
+ if (md_dst && md_dst->type == METADATA_HW_PORT_MUX) {
+ unsigned int port = md_dst->u.port_info.port_id;
+
+ dsa_default_offload_fwd_mark(skb);
+ skb_dst_set(skb, NULL);
+ if (!skb_has_extensions(skb))
+ skb->slow_gro = 0;
+
+ skb->dev = dsa_master_find_slave(dev, 0, port);
+ if (skb->dev)
+ nskb = skb;
+ } else {
+ nskb = cpu_dp->rcv(skb, dev);
+ }
+
if (!nskb) {
kfree_skb(skb);
return 0;
next prev parent reply other threads:[~2022-11-08 12:39 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-04 17:41 [PATCH net-next v8 0/5] net: ipqess: introduce Qualcomm IPQESS driver Maxime Chevallier
2022-11-04 17:41 ` [PATCH net-next v8 1/5] net: dt-bindings: Introduce the Qualcomm IPQESS Ethernet controller Maxime Chevallier
2022-11-04 17:41 ` [PATCH net-next v8 2/5] net: ipqess: introduce the Qualcomm IPQESS driver Maxime Chevallier
2022-11-04 17:41 ` [PATCH net-next v8 3/5] net: dsa: add out-of-band tagging protocol Maxime Chevallier
2022-11-05 3:05 ` Jakub Kicinski
2022-11-07 8:39 ` Maxime Chevallier
2022-11-07 16:25 ` Jakub Kicinski
2022-11-08 12:22 ` Felix Fietkau [this message]
2022-11-15 9:29 ` Maxime Chevallier
2022-11-15 11:50 ` Vladimir Oltean
2023-05-23 12:34 ` Maxime Chevallier
2022-11-07 11:27 ` Vladimir Oltean
2022-11-07 12:51 ` Vladimir Oltean
[not found] ` <20221107084934.157becba@kernel.org>
2022-11-07 17:04 ` Vladimir Oltean
[not found] ` <20221107084535.61317862@kernel.org>
2022-11-07 17:28 ` Vladimir Oltean
[not found] ` <20221107102440.1aecdbdb@kernel.org>
2022-11-07 18:40 ` Florian Fainelli
2022-11-07 20:07 ` Vladimir Oltean
2022-11-11 23:17 ` kernel test robot
2022-11-04 17:41 ` [PATCH net-next v8 4/5] net: ipqess: Add out-of-band DSA tagging support Maxime Chevallier
2022-11-04 17:41 ` [PATCH net-next v8 5/5] ARM: dts: qcom: ipq4019: Add description for the IPQESS Ethernet controller Maxime Chevallier
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=6b38ec27-65a3-c973-c5e1-a25bbe4f6104@nbd.name \
--to=nbd@nbd.name \
--cc=agross@kernel.org \
--cc=andersson@kernel.org \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=hkallweit1@gmail.com \
--cc=konrad.dybcio@somainline.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=kuba@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=luka.perkov@sartura.hr \
--cc=maxime.chevallier@bootlin.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=robert.marko@sartura.hr \
--cc=robh+dt@kernel.org \
--cc=thomas.petazzoni@bootlin.com \
--cc=vladimir.oltean@nxp.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).