Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
authorDavid S. Miller <davem@davemloft.net>
Thu, 4 Jul 2019 19:48:21 +0000 (12:48 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 4 Jul 2019 19:48:21 +0000 (12:48 -0700)
Daniel Borkmann says:

====================
pull-request: bpf-next 2019-07-03

The following pull-request contains BPF updates for your *net-next* tree.

There is a minor merge conflict in mlx5 due to 8960b38932be ("linux/dim:
Rename externally used net_dim members") which has been pulled into your
tree in the meantime, but resolution seems not that bad ... getting current
bpf-next out now before there's coming more on mlx5. ;) I'm Cc'ing Saeed
just so he's aware of the resolution below:

** First conflict in drivers/net/ethernet/mellanox/mlx5/core/en_main.c:

  <<<<<<< HEAD
  static int mlx5e_open_cq(struct mlx5e_channel *c,
                           struct dim_cq_moder moder,
                           struct mlx5e_cq_param *param,
                           struct mlx5e_cq *cq)
  =======
  int mlx5e_open_cq(struct mlx5e_channel *c, struct net_dim_cq_moder moder,
                    struct mlx5e_cq_param *param, struct mlx5e_cq *cq)
  >>>>>>> e5a3e259ef239f443951d401db10db7d426c9497

Resolution is to take the second chunk and rename net_dim_cq_moder into
dim_cq_moder. Also the signature for mlx5e_open_cq() in ...

  drivers/net/ethernet/mellanox/mlx5/core/en.h +977

... and in mlx5e_open_xsk() ...

  drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c +64

... needs the same rename from net_dim_cq_moder into dim_cq_moder.

** Second conflict in drivers/net/ethernet/mellanox/mlx5/core/en_main.c:

  <<<<<<< HEAD
          int cpu = cpumask_first(mlx5_comp_irq_get_affinity_mask(priv->mdev, ix));
          struct dim_cq_moder icocq_moder = {0, 0};
          struct net_device *netdev = priv->netdev;
          struct mlx5e_channel *c;
          unsigned int irq;
  =======
          struct net_dim_cq_moder icocq_moder = {0, 0};
  >>>>>>> e5a3e259ef239f443951d401db10db7d426c9497

Take the second chunk and rename net_dim_cq_moder into dim_cq_moder
as well.

Let me know if you run into any issues. Anyway, the main changes are:

1) Long-awaited AF_XDP support for mlx5e driver, from Maxim.

2) Addition of two new per-cgroup BPF hooks for getsockopt and
   setsockopt along with a new sockopt program type which allows more
   fine-grained pass/reject settings for containers. Also add a sock_ops
   callback that can be selectively enabled on a per-socket basis and is
   executed for every RTT to help tracking TCP statistics, both features
   from Stanislav.

3) Follow-up fix from loops in precision tracking which was not propagating
   precision marks and as a result verifier assumed that some branches were
   not taken and therefore wrongly removed as dead code, from Alexei.

4) Fix BPF cgroup release synchronization race which could lead to a
   double-free if a leaf's cgroup_bpf object is released and a new BPF
   program is attached to the one of ancestor cgroups in parallel, from Roman.

5) Support for bulking XDP_TX on veth devices which improves performance
   in some cases by around 9%, from Toshiaki.

6) Allow for lookups into BPF devmap and improve feedback when calling into
   bpf_redirect_map() as lookup is now performed right away in the helper
   itself, from Toke.

7) Add support for fq's Earliest Departure Time to the Host Bandwidth
   Manager (HBM) sample BPF program, from Lawrence.

8) Various cleanups and minor fixes all over the place from many others.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
1  2 
drivers/net/ethernet/mellanox/mlx5/core/Makefile
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
net/socket.c

index 3281ace5e126033936e38be93a68b21eb620e9da,cb00e622c006e5e0d2aa4841f3d141f71b9739a0..f0d77eb66acfe0c14b07449de4cb849f1a822c22
@@@ -854,6 -953,30 +954,30 @@@ void mlx5e_build_indir_tir_ctx_hash(str
  void mlx5e_modify_tirs_hash(struct mlx5e_priv *priv, void *in, int inlen);
  struct mlx5e_tirc_config mlx5e_tirc_get_default_config(enum mlx5e_traffic_types tt);
  
 -int mlx5e_open_cq(struct mlx5e_channel *c, struct net_dim_cq_moder moder,
+ struct mlx5e_xsk_param;
+ struct mlx5e_rq_param;
+ int mlx5e_open_rq(struct mlx5e_channel *c, struct mlx5e_params *params,
+                 struct mlx5e_rq_param *param, struct mlx5e_xsk_param *xsk,
+                 struct xdp_umem *umem, struct mlx5e_rq *rq);
+ int mlx5e_wait_for_min_rx_wqes(struct mlx5e_rq *rq, int wait_time);
+ void mlx5e_deactivate_rq(struct mlx5e_rq *rq);
+ void mlx5e_close_rq(struct mlx5e_rq *rq);
+ struct mlx5e_sq_param;
+ int mlx5e_open_icosq(struct mlx5e_channel *c, struct mlx5e_params *params,
+                    struct mlx5e_sq_param *param, struct mlx5e_icosq *sq);
+ void mlx5e_close_icosq(struct mlx5e_icosq *sq);
+ int mlx5e_open_xdpsq(struct mlx5e_channel *c, struct mlx5e_params *params,
+                    struct mlx5e_sq_param *param, struct xdp_umem *umem,
+                    struct mlx5e_xdpsq *sq, bool is_redirect);
+ void mlx5e_close_xdpsq(struct mlx5e_xdpsq *sq);
+ struct mlx5e_cq_param;
++int mlx5e_open_cq(struct mlx5e_channel *c, struct dim_cq_moder moder,
+                 struct mlx5e_cq_param *param, struct mlx5e_cq *cq);
+ void mlx5e_close_cq(struct mlx5e_cq *cq);
  int mlx5e_open_locked(struct net_device *netdev);
  int mlx5e_close_locked(struct net_device *netdev);
  
index 0000000000000000000000000000000000000000,9b4d47c47c923360c9eb6ebfaa821650d9fe1154..aaffa6f68dc01c161999896175ea21661be33d81
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,223 +1,223 @@@
 -      struct net_dim_cq_moder icocq_moder = {};
+ // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+ /* Copyright (c) 2019 Mellanox Technologies. */
+ #include "setup.h"
+ #include "en/params.h"
+ bool mlx5e_validate_xsk_param(struct mlx5e_params *params,
+                             struct mlx5e_xsk_param *xsk,
+                             struct mlx5_core_dev *mdev)
+ {
+       /* AF_XDP doesn't support frames larger than PAGE_SIZE, and the current
+        * mlx5e XDP implementation doesn't support multiple packets per page.
+        */
+       if (xsk->chunk_size != PAGE_SIZE)
+               return false;
+       /* Current MTU and XSK headroom don't allow packets to fit the frames. */
+       if (mlx5e_rx_get_linear_frag_sz(params, xsk) > xsk->chunk_size)
+               return false;
+       /* frag_sz is different for regular and XSK RQs, so ensure that linear
+        * SKB mode is possible.
+        */
+       switch (params->rq_wq_type) {
+       case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ:
+               return mlx5e_rx_mpwqe_is_linear_skb(mdev, params, xsk);
+       default: /* MLX5_WQ_TYPE_CYCLIC */
+               return mlx5e_rx_is_linear_skb(params, xsk);
+       }
+ }
+ static void mlx5e_build_xskicosq_param(struct mlx5e_priv *priv,
+                                      u8 log_wq_size,
+                                      struct mlx5e_sq_param *param)
+ {
+       void *sqc = param->sqc;
+       void *wq = MLX5_ADDR_OF(sqc, sqc, wq);
+       mlx5e_build_sq_param_common(priv, param);
+       MLX5_SET(wq, wq, log_wq_sz, log_wq_size);
+ }
+ static void mlx5e_build_xsk_cparam(struct mlx5e_priv *priv,
+                                  struct mlx5e_params *params,
+                                  struct mlx5e_xsk_param *xsk,
+                                  struct mlx5e_channel_param *cparam)
+ {
+       const u8 xskicosq_size = MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE;
+       mlx5e_build_rq_param(priv, params, xsk, &cparam->rq);
+       mlx5e_build_xdpsq_param(priv, params, &cparam->xdp_sq);
+       mlx5e_build_xskicosq_param(priv, xskicosq_size, &cparam->icosq);
+       mlx5e_build_rx_cq_param(priv, params, xsk, &cparam->rx_cq);
+       mlx5e_build_tx_cq_param(priv, params, &cparam->tx_cq);
+       mlx5e_build_ico_cq_param(priv, xskicosq_size, &cparam->icosq_cq);
+ }
+ int mlx5e_open_xsk(struct mlx5e_priv *priv, struct mlx5e_params *params,
+                  struct mlx5e_xsk_param *xsk, struct xdp_umem *umem,
+                  struct mlx5e_channel *c)
+ {
+       struct mlx5e_channel_param cparam = {};
++      struct dim_cq_moder icocq_moder = {};
+       int err;
+       if (!mlx5e_validate_xsk_param(params, xsk, priv->mdev))
+               return -EINVAL;
+       mlx5e_build_xsk_cparam(priv, params, xsk, &cparam);
+       err = mlx5e_open_cq(c, params->rx_cq_moderation, &cparam.rx_cq, &c->xskrq.cq);
+       if (unlikely(err))
+               return err;
+       err = mlx5e_open_rq(c, params, &cparam.rq, xsk, umem, &c->xskrq);
+       if (unlikely(err))
+               goto err_close_rx_cq;
+       err = mlx5e_open_cq(c, params->tx_cq_moderation, &cparam.tx_cq, &c->xsksq.cq);
+       if (unlikely(err))
+               goto err_close_rq;
+       /* Create a separate SQ, so that when the UMEM is disabled, we could
+        * close this SQ safely and stop receiving CQEs. In other case, e.g., if
+        * the XDPSQ was used instead, we might run into trouble when the UMEM
+        * is disabled and then reenabled, but the SQ continues receiving CQEs
+        * from the old UMEM.
+        */
+       err = mlx5e_open_xdpsq(c, params, &cparam.xdp_sq, umem, &c->xsksq, true);
+       if (unlikely(err))
+               goto err_close_tx_cq;
+       err = mlx5e_open_cq(c, icocq_moder, &cparam.icosq_cq, &c->xskicosq.cq);
+       if (unlikely(err))
+               goto err_close_sq;
+       /* Create a dedicated SQ for posting NOPs whenever we need an IRQ to be
+        * triggered and NAPI to be called on the correct CPU.
+        */
+       err = mlx5e_open_icosq(c, params, &cparam.icosq, &c->xskicosq);
+       if (unlikely(err))
+               goto err_close_icocq;
+       spin_lock_init(&c->xskicosq_lock);
+       set_bit(MLX5E_CHANNEL_STATE_XSK, c->state);
+       return 0;
+ err_close_icocq:
+       mlx5e_close_cq(&c->xskicosq.cq);
+ err_close_sq:
+       mlx5e_close_xdpsq(&c->xsksq);
+ err_close_tx_cq:
+       mlx5e_close_cq(&c->xsksq.cq);
+ err_close_rq:
+       mlx5e_close_rq(&c->xskrq);
+ err_close_rx_cq:
+       mlx5e_close_cq(&c->xskrq.cq);
+       return err;
+ }
+ void mlx5e_close_xsk(struct mlx5e_channel *c)
+ {
+       clear_bit(MLX5E_CHANNEL_STATE_XSK, c->state);
+       napi_synchronize(&c->napi);
+       mlx5e_close_rq(&c->xskrq);
+       mlx5e_close_cq(&c->xskrq.cq);
+       mlx5e_close_icosq(&c->xskicosq);
+       mlx5e_close_cq(&c->xskicosq.cq);
+       mlx5e_close_xdpsq(&c->xsksq);
+       mlx5e_close_cq(&c->xsksq.cq);
+ }
+ void mlx5e_activate_xsk(struct mlx5e_channel *c)
+ {
+       set_bit(MLX5E_RQ_STATE_ENABLED, &c->xskrq.state);
+       /* TX queue is created active. */
+       mlx5e_trigger_irq(&c->xskicosq);
+ }
+ void mlx5e_deactivate_xsk(struct mlx5e_channel *c)
+ {
+       mlx5e_deactivate_rq(&c->xskrq);
+       /* TX queue is disabled on close. */
+ }
+ static int mlx5e_redirect_xsk_rqt(struct mlx5e_priv *priv, u16 ix, u32 rqn)
+ {
+       struct mlx5e_redirect_rqt_param direct_rrp = {
+               .is_rss = false,
+               {
+                       .rqn = rqn,
+               },
+       };
+       u32 rqtn = priv->xsk_tir[ix].rqt.rqtn;
+       return mlx5e_redirect_rqt(priv, rqtn, 1, direct_rrp);
+ }
+ int mlx5e_xsk_redirect_rqt_to_channel(struct mlx5e_priv *priv, struct mlx5e_channel *c)
+ {
+       return mlx5e_redirect_xsk_rqt(priv, c->ix, c->xskrq.rqn);
+ }
+ int mlx5e_xsk_redirect_rqt_to_drop(struct mlx5e_priv *priv, u16 ix)
+ {
+       return mlx5e_redirect_xsk_rqt(priv, ix, priv->drop_rq.rqn);
+ }
+ int mlx5e_xsk_redirect_rqts_to_channels(struct mlx5e_priv *priv, struct mlx5e_channels *chs)
+ {
+       int err, i;
+       if (!priv->xsk.refcnt)
+               return 0;
+       for (i = 0; i < chs->num; i++) {
+               struct mlx5e_channel *c = chs->c[i];
+               if (!test_bit(MLX5E_CHANNEL_STATE_XSK, c->state))
+                       continue;
+               err = mlx5e_xsk_redirect_rqt_to_channel(priv, c);
+               if (unlikely(err))
+                       goto err_stop;
+       }
+       return 0;
+ err_stop:
+       for (i--; i >= 0; i--) {
+               if (!test_bit(MLX5E_CHANNEL_STATE_XSK, chs->c[i]->state))
+                       continue;
+               mlx5e_xsk_redirect_rqt_to_drop(priv, i);
+       }
+       return err;
+ }
+ void mlx5e_xsk_redirect_rqts_to_drop(struct mlx5e_priv *priv, struct mlx5e_channels *chs)
+ {
+       int i;
+       if (!priv->xsk.refcnt)
+               return;
+       for (i = 0; i < chs->num; i++) {
+               if (!test_bit(MLX5E_CHANNEL_STATE_XSK, chs->c[i]->state))
+                       continue;
+               mlx5e_xsk_redirect_rqt_to_drop(priv, i);
+       }
+ }
index 1085040675ae4e5133a8add2d65035e0764e2631,67b562c7f8a1256ca947d04397befc4cd9e880e4..2f9093ba82aa0b14d2bb007365a6b896068b4765
@@@ -1567,10 -1602,8 +1602,8 @@@ static void mlx5e_destroy_cq(struct mlx
        mlx5_core_destroy_cq(cq->mdev, &cq->mcq);
  }
  
- static int mlx5e_open_cq(struct mlx5e_channel *c,
-                        struct dim_cq_moder moder,
-                        struct mlx5e_cq_param *param,
-                        struct mlx5e_cq *cq)
 -int mlx5e_open_cq(struct mlx5e_channel *c, struct net_dim_cq_moder moder,
++int mlx5e_open_cq(struct mlx5e_channel *c, struct dim_cq_moder moder,
+                 struct mlx5e_cq_param *param, struct mlx5e_cq *cq)
  {
        struct mlx5_core_dev *mdev = c->mdev;
        int err;
@@@ -1767,45 -1800,12 +1800,12 @@@ static void mlx5e_free_xps_cpumask(stru
        free_cpumask_var(c->xps_cpumask);
  }
  
- static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
-                             struct mlx5e_params *params,
-                             struct mlx5e_channel_param *cparam,
-                             struct mlx5e_channel **cp)
+ static int mlx5e_open_queues(struct mlx5e_channel *c,
+                            struct mlx5e_params *params,
+                            struct mlx5e_channel_param *cparam)
  {
-       int cpu = cpumask_first(mlx5_comp_irq_get_affinity_mask(priv->mdev, ix));
 -      struct net_dim_cq_moder icocq_moder = {0, 0};
 +      struct dim_cq_moder icocq_moder = {0, 0};
-       struct net_device *netdev = priv->netdev;
-       struct mlx5e_channel *c;
-       unsigned int irq;
        int err;
-       int eqn;
-       err = mlx5_vector2eqn(priv->mdev, ix, &eqn, &irq);
-       if (err)
-               return err;
-       c = kvzalloc_node(sizeof(*c), GFP_KERNEL, cpu_to_node(cpu));
-       if (!c)
-               return -ENOMEM;
-       c->priv     = priv;
-       c->mdev     = priv->mdev;
-       c->tstamp   = &priv->tstamp;
-       c->ix       = ix;
-       c->cpu      = cpu;
-       c->pdev     = priv->mdev->device;
-       c->netdev   = priv->netdev;
-       c->mkey_be  = cpu_to_be32(priv->mdev->mlx5e_res.mkey.key);
-       c->num_tc   = params->num_tc;
-       c->xdp      = !!params->xdp_prog;
-       c->stats    = &priv->channel_stats[ix].ch;
-       c->irq_desc = irq_to_desc(irq);
-       err = mlx5e_alloc_xps_cpumask(c, params);
-       if (err)
-               goto err_free_channel;
-       netif_napi_add(netdev, &c->napi, mlx5e_napi_poll, 64);
  
        err = mlx5e_open_cq(c, icocq_moder, &cparam->icosq_cq, &c->icosq.cq);
        if (err)
@@@ -2150,12 -2230,12 +2230,12 @@@ void mlx5e_build_ico_cq_param(struct ml
  
        mlx5e_build_common_cq_param(priv, param);
  
 -      param->cq_period_mode = NET_DIM_CQ_PERIOD_MODE_START_FROM_EQE;
 +      param->cq_period_mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;
  }
  
static void mlx5e_build_icosq_param(struct mlx5e_priv *priv,
-                                   u8 log_wq_size,
-                                   struct mlx5e_sq_param *param)
+ void mlx5e_build_icosq_param(struct mlx5e_priv *priv,
+                            u8 log_wq_size,
+                            struct mlx5e_sq_param *param)
  {
        void *sqc = param->sqc;
        void *wq = MLX5_ADDR_OF(sqc, sqc, wq);
diff --cc net/socket.c
Simple merge