From: Parvathi Pudi <parvathi@couthit.com>
To: Simon Horman <horms@kernel.org>
Cc: parvathi <parvathi@couthit.com>,
andrew+netdev <andrew+netdev@lunn.ch>,
davem <davem@davemloft.net>, edumazet <edumazet@google.com>,
kuba <kuba@kernel.org>, pabeni <pabeni@redhat.com>,
danishanwar <danishanwar@ti.com>, rogerq <rogerq@kernel.org>,
pmohan <pmohan@couthit.com>, afd <afd@ti.com>,
Vadim Fedorenko <vadim.fedorenko@linux.dev>,
haokexin@gmail.com, basharath <basharath@couthit.com>,
arnd <arnd@arndb.de>,
linux-kernel <linux-kernel@vger.kernel.org>,
netdev <netdev@vger.kernel.org>,
linux-arm-kernel <linux-arm-kernel@lists.infradead.org>,
pratheesh <pratheesh@ti.com>, j-rameshbabu <j-rameshbabu@ti.com>,
Vignesh Raghavendra <vigneshr@ti.com>,
praneeth <praneeth@ti.com>, srk <srk@ti.com>,
rogerq <rogerq@ti.com>, m-malladi <m-malladi@ti.com>,
krishna <krishna@couthit.com>, mohan <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: Thu, 1 Oct 2026 18:40:55 +0530 (IST) [thread overview]
Message-ID: <61177290.492777.1790860255343.JavaMail.zimbra@couthit.local> (raw)
In-Reply-To: <20260925163944.721179-1-horms@kernel.org>
Hi,
> 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?
>
No. The HSR offload features can only be turned on or off together, and they cannot
be changed while the port is an HSR slave or running. The firmware enters HSR mode
only if these features are enabled when both ports join the HSR device. Otherwise the
device stays in EMAC mode and this path is never taken. So PRUETH_IS_HSR() here always
means hw-hsr-dup is enabled, and frames are never duplicated twice.
>> + } 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.
>
We will address this in the next version.
>> + 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.
>
No. The tag is stripped only when the device is in HSR mode, and HSR mode is entered
only when both ports join the HSR device with the HSR offload features enabled. These
features can only be turned on or off together, and cannot be changed while the port
is an HSR slave or running. If they are disabled, the device stays in EMAC mode, this
path is not taken, and the HSR core removes the tag in software.
>>
>> /* 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.
>
We will address this in the next version.
Thanks and Regards,
Parvathi.
prev parent reply other threads:[~2026-10-01 13:11 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
2026-10-01 13:10 ` Parvathi Pudi [this message]
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=61177290.492777.1790860255343.JavaMail.zimbra@couthit.local \
--to=parvathi@couthit.com \
--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=horms@kernel.org \
--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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®