Re: [bug report] net: ocelot: Extend MRP

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The 03/18/2021 15:11, Dan Carpenter wrote:

Hi Dan,

> 
> See also:
> 
> drivers/net/ethernet/mscc/ocelot_mrp.c:254 ocelot_mrp_del_ring_role() error: we previously assumed 'ocelot_port' could be null (see line 247)
> 
> regards,
> dan carpenter
> 
> On Thu, Mar 18, 2021 at 03:07:32PM +0300, Dan Carpenter wrote:
> > Hello Horatiu Vultur,
> >
> > This is a semi-automatic email about new static checker warnings.
> >
> > The patch 7c588c3e96e9: "net: ocelot: Extend MRP" from Mar 16, 2021,
> > leads to the following Smatch complaint:
> >
> >     drivers/net/ethernet/mscc/ocelot_mrp.c:180 ocelot_mrp_del()
> >     error: we previously assumed 'ocelot_port' could be null (see line 173)
> >
> > drivers/net/ethernet/mscc/ocelot_mrp.c
> >    153  int ocelot_mrp_del(struct ocelot *ocelot, int port,
> >    154                     const struct switchdev_obj_mrp *mrp)
> >    155  {
> >    156          struct ocelot_port *ocelot_port = ocelot->ports[port];
> >    157          int i;
> >    158
> >    159          if (!ocelot_port)
> >    160                  return -EOPNOTSUPP;
> >    161
> >    162          if (ocelot_port->mrp_ring_id != mrp->ring_id)
> >    163                  return 0;
> >    164
> >    165          ocelot_mrp_del_vcap(ocelot, port);
> >    166          ocelot_mrp_del_vcap(ocelot, port + ocelot->num_phys_ports);
> >    167
> >    168          ocelot_port->mrp_ring_id = 0;
> >    169
> >    170          for (i = 0; i < ocelot->num_phys_ports; ++i) {
> >
> > This loop tries to verify that all the ports have ring_id == 0 otherwise
> > we return.  It's slightly confusing why this matters.

It is trying to detect if there is any existing MRP ring active on the
node. A port is part of a MRP ring if mrp_ring_id != 0. If there is no
MRP ring then we need to remove the entry in the MAC table otherwise
keep it there.

> >
> >    171                  ocelot_port = ocelot->ports[i];
> >    172
> >    173                        if (!ocelot_port)
> >                              ^^^^^^^^^^^
> > Assume the last element of the array is NULL
> >
> >    174                                continue;
> >    175
> >    176                        if (ocelot_port->mrp_ring_id != 0)
> >    177                                goto out;
> >
> > This would be more clear if instead of a "goto out;" it just did a
> > direct "return 0;"

I can change this.

> >
> >    178                }
> >    179
> >    180                ocelot_mrp_del_mac(ocelot, ocelot_port);
> >
> > We delete the last mac address of all the ring_ids are zero but if the
> > last port is zero it will crash.

Yep, it should be ocelot->ports[port] as I have done it in the first
version.

I will send a patch for this.

> >
> >    181        out:
> >    182                return 0;
> >
> > regards,
> > dan carpenter

-- 
/Horatiu



[Index of Archives]     [Kernel Development]     [Kernel Announce]     [Kernel Newbies]     [Linux Networking Development]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Device Mapper]

  Powered by Linux