On Thu, 20 Apr 2017 18:50:21 -0700, Jeff Kirsher wrote:
> +static int ixgbe_xdp_queues(struct ixgbe_adapter *adapter)
> +{
> +     if (nr_cpu_ids > MAX_XDP_QUEUES)
> +             return 0;
> +
> +     return adapter->xdp_prog ? nr_cpu_ids : 0;
> +}

Nit: AFAICT ixgbe_xdp_setup() will guarantee xdp_prog is not set if
there are too many CPU ids.

> @@ -6120,10 +6193,21 @@ static int ixgbe_setup_all_tx_resources(struct 
> ixgbe_adapter *adapter)
>               e_err(probe, "Allocation for Tx Queue %u failed\n", i);
>               goto err_setup_tx;
>       }
> +     for (j = 0; j < adapter->num_xdp_queues; j++) {
> +             err = ixgbe_setup_tx_resources(adapter->xdp_ring[j]);
> +             if (!err)
> +                     continue;
> +
> +             e_err(probe, "Allocation for Tx Queue %u failed\n", j);
> +             goto err_setup_tx;
> +     }
> +
>  

Nit: extra line here

> @@ -9557,7 +9739,21 @@ static int ixgbe_xdp_setup(struct net_device *dev, 
> struct bpf_prog *prog)
>                       return -EINVAL;
>       }
>  
> +     if (nr_cpu_ids > MAX_XDP_QUEUES)
> +             return -ENOMEM;
> +
>       old_prog = xchg(&adapter->xdp_prog, prog);
> +
> +     /* If transitioning XDP modes reconfigure rings */
> +     if (!!prog != !!old_prog) {
> +             int err = ixgbe_setup_tc(dev, netdev_get_num_tc(dev));
> +
> +             if (err) {
> +                     rcu_assign_pointer(adapter->xdp_prog, old_prog);
> +                     return -EINVAL;
> +             }
> +     }
> +
>       for (i = 0; i < adapter->num_rx_queues; i++)
>               xchg(&adapter->rx_ring[i]->xdp_prog, adapter->xdp_prog);
>  

In case of disabling XDP I assume ixgbe_setup_tc() will free the rings
before the xdp_prog on the rings is swapped to NULL.  Is there anything
preventing TX in that time window?  I think usual ordering would be to
install the prog after reconfig but uninstall before.

Reply via email to