> On Mon, 14 Oct 2019 12:49:52 +0200, Lorenzo Bianconi wrote:
> > @@ -3983,6 +4071,46 @@ static int mvneta_ioctl(struct net_device *dev,
> > struct ifreq *ifr, int cmd)
> > return phylink_mii_ioctl(pp->phylink, ifr, cmd);
> > }
> >
> > +static int mvneta_xdp_setup(struct net_device *dev, struct bpf_prog *prog,
> > + struct netlink_ext_ack *extack)
> > +{
> > + struct mvneta_port *pp = netdev_priv(dev);
> > + struct bpf_prog *old_prog;
> > +
> > + if (prog && dev->mtu > MVNETA_MAX_RX_BUF_SIZE) {
> > + NL_SET_ERR_MSG_MOD(extack, "Jumbo frames not supported on XDP");
> > + return -EOPNOTSUPP;
> > + }
> > +
> > + if (netif_running(dev))
> > + mvneta_stop(dev);
> > +
> > + old_prog = xchg(&pp->xdp_prog, prog);
> > + if (old_prog)
> > + bpf_prog_put(old_prog);
> > +
> > + if (netif_running(dev))
> > + mvneta_open(dev);
>
> Ah, the stopping and starting of the interface is sad. If start fails
> the interface is left in a funky state until someone does a stop/start
> cycle. Not that you introduced that.
I will add a return check from mvneta_open here. Thx.
Regards,
Lorenzo
>
> > + return 0;
> > +}
> > +
> > +static int mvneta_xdp(struct net_device *dev, struct netdev_bpf *xdp)
> > +{
> > + struct mvneta_port *pp = netdev_priv(dev);
> > +
> > + switch (xdp->command) {
> > + case XDP_SETUP_PROG:
> > + return mvneta_xdp_setup(dev, xdp->prog, xdp->extack);
> > + case XDP_QUERY_PROG:
> > + xdp->prog_id = pp->xdp_prog ? pp->xdp_prog->aux->id : 0;
> > + return 0;
> > + default:
> > + NL_SET_ERR_MSG_MOD(xdp->extack, "unknown XDP command");
>
> Please drop this message here, there are commands you legitimately
> don't care about, just return -EINVAL, no need to risk leaking a
> meaningless warning to the user space.
>
> > + return -EINVAL;
> > + }
> > +}
signature.asc
Description: PGP signature
