mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jens Emil Schulz Ostergaard <jensemil.schulzostergaard@microchip.com>
To: <netdev-bot+sashiko@kernel.org>
Cc: <UNGLinuxDriver@microchip.com>, <andrew@lunn.ch>,
	<olteanv@gmail.com>, <davem@davemloft.net>, <edumazet@google.com>,
	<kuba@kernel.org>, <pabeni@redhat.com>, <horms@kernel.org>,
	<robh@kernel.org>, <krzk+dt@kernel.org>, <conor+dt@kernel.org>,
	<woojung.huh@microchip.com>, <linux@armlinux.org.uk>,
	<Steen.Hegelund@microchip.com>, <daniel.machon@microchip.com>,
	<geert+renesas@glider.be>, <magnus.damm@gmail.com>,
	<linux-kernel@vger.kernel.org>, <netdev@vger.kernel.org>,
	<devicetree@vger.kernel.org>, <linux-renesas-soc@vger.kernel.org>
Subject: Re: [PATCH net-next v13 7/9] net: dsa: lan9645x: add mdb management
Date: Tue, 6 Oct 2026 14:51:54 +0200	[thread overview]
Message-ID: <4a1fe0e98d7d593900d8d4b68afaf569fa8160fd.camel@microchip.com> (raw)
In-Reply-To: <179097566330.434549.248865005553005719@kernel.org>

On Fri, 2026-10-02 at 21:14 +0000, netdev-bot+sashiko@kernel.org wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
> 
> Thank you for your contribution! Sashiko AI review found 3 potential
> issue(s) to consider.
> 
> Critical: 0 · High: 0 · Medium: 1 · Low: 2
> 
> If you believe none of the issues are legitimate, please reply to each
> issue of Medium severity or higher and explain why the AI is wrong.
> If any of them are legitimate and you plan to respin, please let patchwork
> know by including "pw-bot: cr" as a separate line at the end of your reply
> (one such reply per series is enough).
> 
> - [Medium] On a failed MAC table write, lan9645x_mdb_widen_dest() drops
>   the reference on new_pgid right away…
> - [Low] lan9645x_mdb_narrow_dest() commits mdb_entry->pgid = new_pgid and
>   mdb_entry->ports = new_ports before calling lan9645x_mdb_write_dest().
> - [Low] A failed CPU-only membership delete leaks a PGID reference
>   because old_pgid and new_pgid are the same object.
> 
> --
> 
> net: dsa: lan9645x: add mdb management
> 
> This adds the DSA mdb callbacks to the lan9645x driver. IP multicast
> stores the port group mask inline in the mac table entry. L2 multicast
> points at a refcounted PGID whose destination mask is the port group.
> CPU membership is carried by the MAC_CPU_COPY bit, and when the PGIDs
> run out, add and delete handle it differently.
> 
> > diff --git a/drivers/net/dsa/microchip/lan9645x/lan9645x_mdb.c b/drivers/net/dsa/microchip/lan9645x/lan9645x_mdb.c
> > new file mode 100644
> > index 0000000000000..92ab5f55f7913
> > --- /dev/null
> > +++ b/drivers/net/dsa/microchip/lan9645x/lan9645x_mdb.c
> > @@ -0,0 +1,569 @@
> 
> [ ... ]
> 
> > +static int lan9645x_mdb_widen_dest(struct lan9645x *lan9645x,
> > +                                struct lan9645x_mdb_entry *mdb_entry,
> > +                                enum macaccess_entry_type type,
> > +                                struct lan9645x_pgid_entry *new_pgid,
> > +                                int pgid_index, u16 new_ports)
> > +{
> > +     struct lan9645x_pgid_entry *old_pgid = mdb_entry->pgid;
> > +     int err;
> > +
> > +     lockdep_assert_held(&lan9645x->mdb_lock);
> > +
> > +     err = lan9645x_mdb_write_dest(lan9645x, mdb_entry, type, pgid_index,
> > +                                   new_ports);
> > +     if (err) {
> > +             lan9645x_pgid_entry_put(lan9645x, new_pgid);
> > +             return err;
> > +     }
> 
> [Severity: Medium]
> Can this hand a PGID index to an unrelated group while hardware still
> points at it?
> 
> __lan9645x_mact_learn() issues the command before it polls for
> completion:
> 
>     lan_wr(ANA_MACACCESS_VALID_SET(1) |
>            ANA_MACACCESS_DEST_IDX_SET(port) |
>            ...
>            ANA_MACACCESS_MAC_TABLE_CMD_SET(CMD_LEARN),
>            lan9645x, ANA_MACACCESS);
> 
>     return lan9645x_mac_wait_for_completion(lan9645x, NULL);
> 
> That means an error from lan9645x_mdb_write_dest() only tells us the
> outcome is unknown, for example after a failed poll read or a timeout.
> The entry may already point at pgid_index.
> 
> If new_pgid was just created, this put frees its index. A later add
> with a different port mask can get the same index back from
> lan9645x_mdb_pgid_entry_create(). lan9645x_pgid_entry_alloc() then
> rewrites ANA_PGID for that group, so an entry that may have been
> written would forward this group to the other group's ports.
> 
> When the entry already existed (ports != 0), __lan9645x_mdb_add() does
> no further cleanup. For a fresh entry it issues the forget only after
> the PGID has been released, and it ignores the result:
> 
>     lan9645x_mact_forget(lan9645x, mdb_entry->mac,
>                          mdb_entry->vid, type);
>     lan9645x_mdb_entry_dealloc(lan9645x, mdb_entry);
> 
> The comment there says the forget "fails harmlessly if the bus is still
> down". Isn't that the case where an entry pointing at a freed PGID is
> left in hardware?
> 
> The delete side handles the same uncertainty by keeping the reference.
> lan9645x_mdb_narrow_dest() keeps old_pgid on failure, and
> __lan9645x_mdb_del() sets mdb_entry->pgid = NULL when CMD_FORGET fails.
> The v12 changelog gives the reason: "so the index cannot be handed to an
> unrelated group while hardware may still point at it".
> 
> Should the add path also keep the new_pgid reference when the write
> fails?
> 

Correct, an error from the learn command leaves the hardware state
unknown, and the add path dropped the PGID reference anyway. v14 keeps
the reference on a failed write, as the delete path does, so the index
cannot be reused while hardware may point at it.


> > +     mdb_entry->pgid = new_pgid;
> > +     mdb_entry->ports = new_ports;
> > +     lan9645x_pgid_entry_put(lan9645x, old_pgid);
> > +     return 0;
> > +}
> 
> [ ... ]
> 
> > +static void lan9645x_mdb_narrow_dest(struct lan9645x *lan9645x,
> > +                                  struct lan9645x_mdb_entry *mdb_entry,
> > +                                  enum macaccess_entry_type type,
> > +                                  struct lan9645x_pgid_entry *new_pgid,
> > +                                  int pgid_index, u16 new_ports)
> > +{
> > +     struct lan9645x_pgid_entry *old_pgid = mdb_entry->pgid;
> > +     int err;
> > +
> > +     lockdep_assert_held(&lan9645x->mdb_lock);
> > +
> > +     mdb_entry->pgid = new_pgid;
> > +     mdb_entry->ports = new_ports;
> 
> [Severity: Low]
> mdb_entry->pgid is switched to new_pgid before the hardware write. If
> that write fails, which PGID does the entry use afterwards? Hardware
> would still use old_pgid, while software records new_pgid.
> 
> The in-place branch in __lan9645x_mdb_del() assumes hardware points at
> mdb_entry->pgid, so it only rewrites ANA_PGID:
> 
>     if (mdb_entry->pgid && refcount_read(&mdb_entry->pgid->refcount) == 1) {
>         mdb_entry->pgid->ports = new_ports &
>                                  ~BIT(lan9645x->num_phys_ports);
>         ...
>         lan_rmw(ANA_PGID_PGID_SET(mdb_entry->pgid->ports), ...);
>         return 0;
>     }
> 
> For example, take a group {A,B,C} on PGID P:
> 
> 1. Deleting C creates Q={A,B} with the last free index, and the MAC
>    write fails.
> 
> 2. Deleting B finds no PGID for {A}, so creation returns -ENOSPC.
> 
> 3. Q has refcount 1, so it is narrowed in place.
> 
> Hardware still forwards through P, so B and C keep receiving the group,
> and nothing further is logged.
> 
> Should the in-place branch, or a later narrowing, rewrite the MAC entry
> after an earlier failed write?
> 
> > +
> > +     err = lan9645x_mdb_write_dest(lan9645x, mdb_entry, type, pgid_index,
> > +                                   new_ports);
> > +     if (err) {
> > +             dev_err(lan9645x->dev,
> > +                     "Narrowing %pM vid %u to mask 0x%x returned %pe\n",
> > +                     mdb_entry->mac, mdb_entry->vid, new_ports,
> > +                     ERR_PTR(err));
> > +             return;
> > +     }
> 
> [Severity: Low]
> Does this early return leak a PGID reference when old_pgid and new_pgid
> are the same object?
> 
> Take a group {A, CPU} on PGID P, whose ports are {A}. When only the CPU
> port module leaves, lan9645x_mdb_pgid_entry_get() strips the CPU bit.
> lan9645x_mdb_pgid_entry_lookup() then returns P after refcount_inc().
> Now new_pgid == old_pgid == P, and P holds two references for a single
> mdb entry.
> 
> If lan9645x_mdb_write_dest() fails here, the put below is skipped. When
> the group is removed later, lan9645x_mdb_entry_dealloc() drops only one
> reference. P and its index then stay reserved until
> lan9645x_mdb_deinit().
> 
> Keeping old_pgid makes sense when it differs from new_pgid. Here,
> though, mdb_entry->pgid already holds P. Should the put still run when
> old_pgid == new_pgid?
> 
> > +
> > +     lan9645x_pgid_entry_put(lan9645x, old_pgid);
> > +}
> 
> [ ... ]
> 
> --
> Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260929-dsa_lan9645x_switch_driver_base-v13-0-827c2d3617f2%40microchip.com


  reply	other threads:[~2026-10-06 12:52 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-29  7:48 [PATCH net-next v13 0/9] net: dsa: add DSA support for the LAN9645x switch chip family Jens Emil Schulz Østergaard
2026-09-29  7:48 ` [PATCH net-next v13 1/9] net: dsa: add tag driver for LAN9645X Jens Emil Schulz Østergaard
2026-10-02 21:14   ` netdev-bot+sashiko
2026-10-06  7:19     ` Jens Emil Schulz Ostergaard
2026-09-29  7:48 ` [PATCH net-next v13 2/9] dt-bindings: net: lan9645x: add LAN9645X switch bindings Jens Emil Schulz Østergaard
2026-10-02 21:14   ` netdev-bot+sashiko
2026-10-06  3:19   ` Rob Herring (Arm)
2026-09-29  7:48 ` [PATCH net-next v13 3/9] net: dsa: lan9645x: add autogenerated register macros Jens Emil Schulz Østergaard
2026-09-29  7:48 ` [PATCH net-next v13 4/9] net: dsa: lan9645x: add basic dsa driver for LAN9645X Jens Emil Schulz Østergaard
2026-10-02 21:14   ` netdev-bot+sashiko
2026-09-29  7:48 ` [PATCH net-next v13 5/9] net: dsa: lan9645x: add vlan support Jens Emil Schulz Østergaard
2026-10-02 21:14   ` netdev-bot+sashiko
2026-10-06 12:31     ` Jens Emil Schulz Ostergaard
2026-09-29  7:48 ` [PATCH net-next v13 6/9] net: dsa: lan9645x: add mac table integration Jens Emil Schulz Østergaard
2026-10-02 21:14   ` netdev-bot+sashiko
2026-10-06 12:34     ` Jens Emil Schulz Ostergaard
2026-09-29  7:48 ` [PATCH net-next v13 7/9] net: dsa: lan9645x: add mdb management Jens Emil Schulz Østergaard
2026-10-02 21:14   ` netdev-bot+sashiko
2026-10-06 12:51     ` Jens Emil Schulz Ostergaard [this message]
2026-09-29  7:48 ` [PATCH net-next v13 8/9] net: dsa: lan9645x: add bridge support Jens Emil Schulz Østergaard
2026-10-02 21:14   ` netdev-bot+sashiko
2026-09-29  7:48 ` [PATCH net-next v13 9/9] net: dsa: lan9645x: add port statistics Jens Emil Schulz Østergaard
2026-10-02 21:14   ` netdev-bot+sashiko

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=4a1fe0e98d7d593900d8d4b68afaf569fa8160fd.camel@microchip.com \
    --to=jensemil.schulzostergaard@microchip.com \
    --cc=Steen.Hegelund@microchip.com \
    --cc=UNGLinuxDriver@microchip.com \
    --cc=andrew@lunn.ch \
    --cc=conor+dt@kernel.org \
    --cc=daniel.machon@microchip.com \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=edumazet@google.com \
    --cc=geert+renesas@glider.be \
    --cc=horms@kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=magnus.damm@gmail.com \
    --cc=netdev-bot+sashiko@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=olteanv@gmail.com \
    --cc=pabeni@redhat.com \
    --cc=robh@kernel.org \
    --cc=woojung.huh@microchip.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®