All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Ratheesh Kannoth" <rkannoth@marvell.com>
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH v18 net-next 1/2] octeontx2: use atomic bitops for PF/VF and rep flags
Date: Wed, 30 Sep 2026 02:30:15 +0000	[thread overview]
Message-ID: <20260930023016.21A551F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260929022915.2704627-2-rkannoth@marvell.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] net: octeontx2: non-atomic flags sync clobbers concurrent atomic bitops
--

commit 7297391279ac6b1794cb03ec3bcedc49fd752258
Author: Ratheesh Kannoth <rkannoth@marvell.com>

octeontx2: use atomic bitops for PF/VF and rep flags

This commit switches PF/VF and representor flags from non-atomic masks to
unsigned long bitmaps using atomic bit operations. It also relocates
representor VF initialization bits and introduces a helper to locklessly
sync representor flags onto the PF mailbox context.

> diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
> --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
> +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h

[ ... ]

> @@ -593,6 +607,32 @@ struct otx2_nic {
>  	unsigned long		*af_xdp_zc_qidx;
>  };
>  
> +static inline void otx2_set_flag(struct otx2_nic *nic, unsigned int flag)
> +{
> +	set_bit(flag, &nic->flags);
> +}
> +

[ ... ]

> +static inline void otx2_sync_flags_from_rep(struct otx2_nic *dst,
> +					    unsigned long *src_flags)
> +{
> +	unsigned long src = READ_ONCE(*src_flags);
> +	unsigned long new_flags;
> +
> +	new_flags = (READ_ONCE(dst->flags) & ~OTX2_REP_SYNC_FLAGS_MASK) |
> +		    (src & OTX2_REP_SYNC_FLAGS_MASK);
> +	WRITE_ONCE(dst->flags, new_flags);
> +}

[Severity: High]
Can this cause lost atomic updates? The patch converts flags to be modified
by atomic bitops like set_bit() and clear_bit(). However, this helper
performs a non-atomic read-modify-write (READ_ONCE followed by WRITE_ONCE)
over the entire dst->flags word.

If a concurrent path atomically sets a flag (such as OTX2_FLAG_INTF_DOWN or
OTX2_FLAG_PORT_UP) right between the READ_ONCE and WRITE_ONCE, the
WRITE_ONCE will overwrite the memory with the stale value, silently erasing
the concurrent atomic bit operation. This is reachable from the TC flower
offload setup path which calls rvu_rep_setup_tc_cb().

> diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c
> --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c
> +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c

[ ... ]

> @@ -599,11 +599,11 @@ int otx2_napi_handler(struct napi_struct *napi, int budget)
>  
>  	if (workdone < budget && napi_complete_done(napi, workdone)) {
>  		/* If interface is going down, don't re-enable IRQ */
> -		if (pfvf->flags & OTX2_FLAG_INTF_DOWN)
> +		if (otx2_test_flag(pfvf, OTX2_FLAG_INTF_DOWN))
>  			return workdone;

[Severity: High]
Because the NAPI handler heavily relies on OTX2_FLAG_INTF_DOWN to halt
processing and prevent use-after-free scenarios during teardown, erasing
this flag via the race condition in otx2_sync_flags_from_rep() could result
in otx2_napi_handler() continuously polling freed resources.

> diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/rep.c b/drivers/net/ethernet/marvell/octeontx2/nic/rep.c
> --- a/drivers/net/ethernet/marvell/octeontx2/nic/rep.c
> +++ b/drivers/net/ethernet/marvell/octeontx2/nic/rep.c

[ ... ]

> @@ -632,7 +632,7 @@ void rvu_rep_destroy(struct otx2_nic *priv)
>  	int rep_id;
>  
>  	rvu_eswitch_config(priv, false);
> -	priv->flags |= OTX2_FLAG_INTF_DOWN;
> +	otx2_set_flag(priv, OTX2_FLAG_INTF_DOWN);
>  	rvu_rep_free_cq_rsrc(priv);

[Severity: High]
If the OTX2_FLAG_INTF_DOWN flag set here is immediately overwritten by the
non-atomic flag sync mentioned above, NAPI polling can continue executing
concurrently while rvu_rep_free_cq_rsrc() tears down the queues, leading to
a use-after-free crash on teardown.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260929022915.2704627-1-rkannoth@marvell.com?part=1

  reply	other threads:[~2026-09-30  2:30 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-29  2:29 [PATCH v18 net-next 0/2] octeontx2: mqprio bandwidth offload for NIX TX schedulers Ratheesh Kannoth
2026-09-29  2:29 ` [PATCH v18 net-next 1/2] octeontx2: use atomic bitops for PF/VF and rep flags Ratheesh Kannoth
2026-09-30  2:30   ` sashiko-bot [this message]
2026-10-02  8:31   ` netdev-bot+sashiko
2026-10-05  4:16     ` Ratheesh Kannoth
2026-09-29  2:29 ` [PATCH v18 net-next 2/2] octeontx2: add mqprio bandwidth offload for NIX TX schedulers Ratheesh Kannoth
2026-09-30  2:30   ` sashiko-bot
2026-10-02  8:31   ` netdev-bot+sashiko
2026-10-02  1:22 ` [PATCH v18 net-next 0/2] octeontx2: " Jakub Kicinski
2026-10-02  9:37 ` David Laight
2026-10-05  2:58   ` Ratheesh Kannoth
2026-10-05  8:14     ` David Laight
2026-10-05  9:49       ` Ratheesh Kannoth

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=20260930023016.21A551F000FF@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=rkannoth@marvell.com \
    --cc=sashiko-reviews@lists.linux.dev \
    /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.