From: Simon Horman <horms@kernel.org>
To: parvathi@couthit.com
Cc: Simon Horman <horms@kernel.org>,
andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com,
kuba@kernel.org, pabeni@redhat.com, danishanwar@ti.com,
rogerq@kernel.org, pmohan@couthit.com, afd@ti.com,
vadim.fedorenko@linux.dev, haokexin@gmail.com,
basharath@couthit.com, arnd@arndb.de,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, pratheesh@ti.com,
j-rameshbabu@ti.com, vigneshr@ti.com, praneeth@ti.com,
srk@ti.com, rogerq@ti.com, m-malladi@ti.com, krishna@couthit.com,
mohan@couthit.com
Subject: Re: [PATCH net-next v4 3/3] net: ti: icssm-prueth: Support duplicate HW offload feature for HSR and PRP
Date: Fri, 25 Sep 2026 17:39:44 +0100 [thread overview]
Message-ID: <20260925163944.721179-1-horms@kernel.org> (raw)
In-Reply-To: <20260921134343.200426-4-parvathi@couthit.com>
This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
Full review at: https://sashiko.dev/#/patchset/20260921134343.200426-4-parvathi@couthit.com?part=3
---
net: ti: icssm-prueth: Support duplicate HW offload feature for HSR and PRP
This commit introduces hardware duplication offloading for HSR and PRP in
the PRU Ethernet driver. It uses a shared queue to write frames into OCMC
RAM once, replicating transmission in firmware, and adds receive-side
handling for duplicate frames.
> diff --git a/drivers/net/ethernet/ti/icssm/icssm_prueth.c b/drivers/net/ethernet/ti/icssm/icssm_prueth.c
> --- a/drivers/net/ethernet/ti/icssm/icssm_prueth.c
> +++ b/drivers/net/ethernet/ti/icssm/icssm_prueth.c
[ ... ]
> @@ -656,6 +725,57 @@ static int icssm_prueth_tx_enqueue(struct prueth_emac *emac,
> if (PRUETH_IS_HSR(prueth))
> wr_buf_desc |= BIT(PRUETH_BD_HSR_FRAME_SHIFT);
>
> + if (prueth_is_lre(prueth)) {
> + ethhdr = (struct ethhdr *)skb_mac_header(skb);
> + proto = ethhdr->h_proto;
> +
> + if (proto == htons(ETH_P_8021Q)) {
> + vlan_hdr = (struct vlan_ethhdr *)ethhdr;
> + proto = vlan_hdr->h_vlan_encapsulated_proto;
> + is_vlan = true;
> + }
> +
> + /* Check if the SKB has HSR tag */
> + if (PRUETH_IS_HSR(prueth) && proto == htons(ETH_P_HSR)) {
> + hdr = skb_mac_header(skb);
> +
> + if (is_vlan) {
> + hsr_ethhdr =
> + (struct hsr_txopt_ethhdr *)(hdr +
> + VLAN_HLEN);
> + } else {
> + hsr_ethhdr = (struct hsr_txopt_ethhdr *)hdr;
> + }
> +
> + /* PTP frames (ETH_P_1588) carry no LAN ID
> + * in the HSR tag
> + */
> + if (hsr_ethhdr->hsr_tag.encap_proto !=
> + htons(ETH_P_1588)) {
> + wr_buf_desc |= PRUETH_BD_LAN_INFO_MASK;
[Severity: Medium]
Is it expected to unconditionally duplicate the frame here?
The driver exposes NETIF_F_HW_HSR_DUP as a toggleable ethtool feature, but
this data path checks PRUETH_IS_HSR() and always performs duplication. If a
user disables hw-hsr-dup, the software HSR core will duplicate packets and
send two copies. The hardware will then duplicate them again, causing a
broadcast storm.
Should this check the active ndev features instead?
> + } else {
> + wr_buf_desc |= (txport <<
> + PRUETH_BD_LAN_A_SHIFT);
> + }
> + wr_buf_desc |= PRUETH_BD_RED_PKT_MASK;
> + } else if (PRUETH_IS_PRP(prueth)) {
> + /* Check if the SKB has PRP tag */
> + struct prp_txopt_rct *rct =
> + (struct prp_txopt_rct *)(skb_tail_pointer(skb) -
> + ICSSM_LRE_TAG_SIZE);
> +
> + if (rct->prp_suffix == htons(ETH_P_PRP)) {
[Severity: Medium]
Could this lead to unaligned memory accesses?
Since skb->len can be odd for arbitrary payloads like ICMP packets, the
tail pointer may be unaligned. The struct prp_txopt_rct contains __be16
fields and is not marked as __packed. Dereferencing rct->prp_suffix
directly from an unaligned address can cause unaligned access exceptions on
some ARM architectures.
> + wr_buf_desc |= PRUETH_BD_LAN_INFO_MASK;
> + wr_buf_desc |= PRUETH_BD_RED_PKT_MASK;
> + } else {
> + wr_buf_desc |= (txport <<
> + PRUETH_BD_LAN_A_SHIFT);
> + }
> + } else {
> + wr_buf_desc |= (txport << PRUETH_BD_LAN_A_SHIFT);
> + }
> + }
[ ... ]
> @@ -741,11 +871,36 @@ int icssm_emac_rx_packet(struct prueth_emac *emac, u16 *bd_rd_ptr,
[ ... ]
> + actual_pkt_len = pkt_info->length;
> +
> + if (has_hsr_tag)
> + actual_pkt_len -= ICSSM_LRE_TAG_SIZE;
[Severity: Medium]
Does this unconditionally strip the HSR tag regardless of the netdev feature
configuration?
Similar to the duplication offload, NETIF_F_HW_HSR_TAG_RM is exposed via
ethtool but not checked in this data path. If a user disables tag removal in
hardware, the host stack might fail to parse the packet since the driver
still forcibly strips the tag.
>
> /* Allocate a socket buffer for this packet */
> skb = netdev_alloc_skb_ip_align(ndev, actual_pkt_len);
[ ... ]
> @@ -1309,17 +1473,31 @@ static enum netdev_tx icssm_emac_ndo_start_xmit(struct sk_buff *skb,
> struct net_device *ndev)
> {
> struct prueth_emac *emac = netdev_priv(ndev);
> + /* Spinlock for Tx Queues */
> + spinlock_t *lock_queue;
> + unsigned long flags;
> int ret;
> u16 qid;
>
> qid = icssm_prueth_get_tx_queue_id(emac->prueth, skb);
> + /* Select the TX queue spin lock for this queue ID */
> + if (prueth_is_lre(emac->prueth))
> + lock_queue = &emac->prueth->lre_host_queue_lock[qid - 2];
> + else
> + lock_queue = &emac->host_queue_lock[qid - 2];
> +
[Severity: High]
Could a race condition occur here when the interface mode changes?
Because icssm_prueth_change_mode can modify the eth_type (which changes the
result of prueth_is_lre) and calls ndo_stop directly without waiting for
in-flight ndo_start_xmit calls to complete, there is a time-of-check to
time-of-use vulnerability.
If eth_type changes between this lock selection and the lock acquisition
below, one thread could acquire host_queue_lock while another acquires
lre_host_queue_lock. Both might then evaluate prueth_is_lre() as true inside
icssm_prueth_tx_enqueue, concurrently modifying the exact same shared LRE
queue descriptors and causing queue corruption.
> + if (eth_skb_pad(skb)) {
> + if (netif_msg_tx_err(emac) && net_ratelimit())
> + netdev_err(ndev, "packet pad failed\n");
> + atomic64_inc(&emac->stats.tx_dropped);
> + return NETDEV_TX_OK;
> + }
> +
> + spin_lock_irqsave(lock_queue, flags);
> ret = icssm_prueth_tx_enqueue(emac, skb, qid);
> - if (ret) {
> - if (ret != -ENOBUFS && netif_msg_tx_err(emac) &&
> - net_ratelimit())
> - netdev_err(ndev, "packet queue failed: %d\n", ret);
> + spin_unlock_irqrestore(lock_queue, flags);
next prev parent reply other threads:[~2026-09-25 16:40 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-21 13:41 [PATCH net-next v4 0/3] Introduce HSR/PRP HW offload support for PRU-ICSSM Ethernet driver Parvathi Pudi
2026-09-21 13:41 ` [PATCH net-next v4 1/3] net: ti: icssm-prueth: Add HSR and PRP HW offload mode support for AM57xx, AM437x and AM335x Parvathi Pudi
2026-09-25 16:39 ` Simon Horman
2026-10-01 13:04 ` Parvathi Pudi
2026-09-21 13:41 ` [PATCH net-next v4 2/3] net: ti: icssm-prueth: Add priority based RX IRQ handlers Parvathi Pudi
2026-09-25 16:39 ` Simon Horman
2026-10-01 13:08 ` Parvathi Pudi
2026-09-21 13:41 ` [PATCH net-next v4 3/3] net: ti: icssm-prueth: Support duplicate HW offload feature for HSR and PRP Parvathi Pudi
2026-09-25 16:39 ` Simon Horman [this message]
2026-10-01 13:10 ` Parvathi Pudi
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=20260925163944.721179-1-horms@kernel.org \
--to=horms@kernel.org \
--cc=afd@ti.com \
--cc=andrew+netdev@lunn.ch \
--cc=arnd@arndb.de \
--cc=basharath@couthit.com \
--cc=danishanwar@ti.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=haokexin@gmail.com \
--cc=j-rameshbabu@ti.com \
--cc=krishna@couthit.com \
--cc=kuba@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=m-malladi@ti.com \
--cc=mohan@couthit.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=parvathi@couthit.com \
--cc=pmohan@couthit.com \
--cc=praneeth@ti.com \
--cc=pratheesh@ti.com \
--cc=rogerq@kernel.org \
--cc=rogerq@ti.com \
--cc=srk@ti.com \
--cc=vadim.fedorenko@linux.dev \
--cc=vigneshr@ti.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.