lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [day] [month] [year] [list]
Date:   Tue, 18 Dec 2018 15:52:51 +0100
From:   Björn Töpel <bjorn.topel@...il.com>
To:     Jan Sokolowski <jan.sokolowski@...el.com>
Cc:     intel-wired-lan <intel-wired-lan@...ts.osuosl.org>,
        Netdev <netdev@...r.kernel.org>, William Tu <u9012063@...il.com>
Subject: Re: [Intel-wired-lan] [PATCH 2/2] i40e: Remove umem from VSI

Den tis 18 dec. 2018 kl 14:48 skrev Jan Sokolowski <jan.sokolowski@...el.com>:
>
> As current implementation of netdev already contains and provides
> umems for us, we no longer have the need to contain these
> structures in i40e_vsi.
>
> Refactor the code to operate on netdev-provided umems.
>
> Signed-off-by: Jan Sokolowski <jan.sokolowski@...el.com>
> ---
>  drivers/net/ethernet/intel/i40e/i40e.h     |  10 +-
>  drivers/net/ethernet/intel/i40e/i40e_xsk.c | 110 ++++-----------------
>  2 files changed, 21 insertions(+), 99 deletions(-)
>

Nice cleanup! Also adding netdev and William (veth RFC) to Cc:.

Acked-by: Björn Töpel <bjorn.topel@...el.com>

> diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
> index 876cac317e79..c24163ac41da 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e.h
> @@ -34,6 +34,7 @@
>  #include <net/pkt_cls.h>
>  #include <net/tc_act/tc_gact.h>
>  #include <net/tc_act/tc_mirred.h>
> +#include <net/xdp_sock.h>
>  #include "i40e_type.h"
>  #include "i40e_prototype.h"
>  #include "i40e_client.h"
> @@ -786,11 +787,6 @@ struct i40e_vsi {
>
>         /* VSI specific handlers */
>         irqreturn_t (*irq_handler)(int irq, void *data);
> -
> -       /* AF_XDP zero-copy */
> -       struct xdp_umem **xsk_umems;
> -       u16 num_xsk_umems_used;
> -       u16 num_xsk_umems;
>  } ____cacheline_internodealigned_in_smp;
>
>  struct i40e_netdev_priv {
> @@ -1103,10 +1099,10 @@ static inline struct xdp_umem *i40e_xsk_umem(struct i40e_ring *ring)
>         if (ring_is_xdp(ring))
>                 qid -= ring->vsi->alloc_queue_pairs;
>
> -       if (!ring->vsi->xsk_umems || !ring->vsi->xsk_umems[qid] || !xdp_on)
> +       if (!xdp_on)
>                 return NULL;
>
> -       return ring->vsi->xsk_umems[qid];
> +       return xdp_get_umem_from_qid(ring->vsi->netdev, qid);
>  }
>
>  int i40e_create_queue_channel(struct i40e_vsi *vsi, struct i40e_channel *ch);
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> index 433c8e688c78..2980997e74b5 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> @@ -9,69 +9,6 @@
>  #include "i40e_txrx_common.h"
>  #include "i40e_xsk.h"
>
> -/**
> - * i40e_alloc_xsk_umems - Allocate an array to store per ring UMEMs
> - * @vsi: Current VSI
> - *
> - * Returns 0 on success, <0 on failure
> - **/
> -static int i40e_alloc_xsk_umems(struct i40e_vsi *vsi)
> -{
> -       if (vsi->xsk_umems)
> -               return 0;
> -
> -       vsi->num_xsk_umems_used = 0;
> -       vsi->num_xsk_umems = vsi->alloc_queue_pairs;
> -       vsi->xsk_umems = kcalloc(vsi->num_xsk_umems, sizeof(*vsi->xsk_umems),
> -                                GFP_KERNEL);
> -       if (!vsi->xsk_umems) {
> -               vsi->num_xsk_umems = 0;
> -               return -ENOMEM;
> -       }
> -
> -       return 0;
> -}
> -
> -/**
> - * i40e_add_xsk_umem - Store a UMEM for a certain ring/qid
> - * @vsi: Current VSI
> - * @umem: UMEM to store
> - * @qid: Ring/qid to associate with the UMEM
> - *
> - * Returns 0 on success, <0 on failure
> - **/
> -static int i40e_add_xsk_umem(struct i40e_vsi *vsi, struct xdp_umem *umem,
> -                            u16 qid)
> -{
> -       int err;
> -
> -       err = i40e_alloc_xsk_umems(vsi);
> -       if (err)
> -               return err;
> -
> -       vsi->xsk_umems[qid] = umem;
> -       vsi->num_xsk_umems_used++;
> -
> -       return 0;
> -}
> -
> -/**
> - * i40e_remove_xsk_umem - Remove a UMEM for a certain ring/qid
> - * @vsi: Current VSI
> - * @qid: Ring/qid associated with the UMEM
> - **/
> -static void i40e_remove_xsk_umem(struct i40e_vsi *vsi, u16 qid)
> -{
> -       vsi->xsk_umems[qid] = NULL;
> -       vsi->num_xsk_umems_used--;
> -
> -       if (vsi->num_xsk_umems == 0) {
> -               kfree(vsi->xsk_umems);
> -               vsi->xsk_umems = NULL;
> -               vsi->num_xsk_umems = 0;
> -       }
> -}
> -
>  /**
>   * i40e_xsk_umem_dma_map - DMA maps all UMEM memory for the netdev
>   * @vsi: Current VSI
> @@ -140,6 +77,7 @@ static void i40e_xsk_umem_dma_unmap(struct i40e_vsi *vsi, struct xdp_umem *umem)
>  static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
>                                 u16 qid)
>  {
> +       struct net_device *netdev = vsi->netdev;
>         struct xdp_umem_fq_reuse *reuseq;
>         bool if_running;
>         int err;
> @@ -150,12 +88,9 @@ static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
>         if (qid >= vsi->num_queue_pairs)
>                 return -EINVAL;
>
> -       if (vsi->xsk_umems) {
> -               if (qid >= vsi->num_xsk_umems)
> -                       return -EINVAL;
> -               if (vsi->xsk_umems[qid])
> -                       return -EBUSY;
> -       }
> +       if (qid >= netdev->real_num_rx_queues ||
> +           qid >= netdev->real_num_tx_queues)
> +               return -EINVAL;
>
>         reuseq = xsk_reuseq_prepare(vsi->rx_rings[0]->count);
>         if (!reuseq)
> @@ -173,13 +108,7 @@ static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
>                 err = i40e_queue_pair_disable(vsi, qid);
>                 if (err)
>                         return err;
> -       }
> -
> -       err = i40e_add_xsk_umem(vsi, umem, qid);
> -       if (err)
> -               return err;
>
> -       if (if_running) {
>                 err = i40e_queue_pair_enable(vsi, qid);
>                 if (err)
>                         return err;
> @@ -197,11 +126,13 @@ static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
>   **/
>  static int i40e_xsk_umem_disable(struct i40e_vsi *vsi, u16 qid)
>  {
> +       struct net_device *netdev = vsi->netdev;
> +       struct xdp_umem *umem;
>         bool if_running;
>         int err;
>
> -       if (!vsi->xsk_umems || qid >= vsi->num_xsk_umems ||
> -           !vsi->xsk_umems[qid])
> +       umem = xdp_get_umem_from_qid(netdev, qid);
> +       if (!umem)
>                 return -EINVAL;
>
>         if_running = netif_running(vsi->netdev) && i40e_enabled_xdp_vsi(vsi);
> @@ -212,8 +143,7 @@ static int i40e_xsk_umem_disable(struct i40e_vsi *vsi, u16 qid)
>                         return err;
>         }
>
> -       i40e_xsk_umem_dma_unmap(vsi, vsi->xsk_umems[qid]);
> -       i40e_remove_xsk_umem(vsi, qid);
> +       i40e_xsk_umem_dma_unmap(vsi, umem);
>
>         if (if_running) {
>                 err = i40e_queue_pair_enable(vsi, qid);
> @@ -237,20 +167,18 @@ static int i40e_xsk_umem_disable(struct i40e_vsi *vsi, u16 qid)
>  int i40e_xsk_umem_query(struct i40e_vsi *vsi, struct xdp_umem **umem,
>                         u16 qid)
>  {
> +       struct net_device *netdev = vsi->netdev;
> +       struct xdp_umem *queried_umem;
> +
>         if (vsi->type != I40E_VSI_MAIN)
>                 return -EINVAL;
>
> -       if (qid >= vsi->num_queue_pairs)
> -               return -EINVAL;
> +       queried_umem = xdp_get_umem_from_qid(netdev, qid);
>
> -       if (vsi->xsk_umems) {
> -               if (qid >= vsi->num_xsk_umems)
> -                       return -EINVAL;
> -               *umem = vsi->xsk_umems[qid];
> -               return 0;
> -       }
> +       if (!queried_umem)
> +               return -EINVAL;
>
> -       *umem = NULL;
> +       *umem = queried_umem;
>         return 0;
>  }
>
> @@ -953,13 +881,11 @@ void i40e_xsk_clean_tx_ring(struct i40e_ring *tx_ring)
>   **/
>  bool i40e_xsk_any_rx_ring_enabled(struct i40e_vsi *vsi)
>  {
> +       struct net_device *netdev = vsi->netdev;
>         int i;
>
> -       if (!vsi->xsk_umems)
> -               return false;
> -
>         for (i = 0; i < vsi->num_queue_pairs; i++) {
> -               if (vsi->xsk_umems[i])
> +               if (xdp_get_umem_from_qid(netdev, i))
>                         return true;
>         }
>
> --
> 2.18.1
>
> _______________________________________________
> Intel-wired-lan mailing list
> Intel-wired-lan@...osl.org
> https://lists.osuosl.org/mailman/listinfo/intel-wired-lan

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ