Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
authorDavid S. Miller <davem@davemloft.net>
Mon, 28 Jun 2021 22:28:03 +0000 (15:28 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jun 2021 22:28:03 +0000 (15:28 -0700)
Daniel Borkmann says:

====================
pull-request: bpf-next 2021-06-28

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

We've added 37 non-merge commits during the last 12 day(s) which contain
a total of 56 files changed, 394 insertions(+), 380 deletions(-).

The main changes are:

1) XDP driver RCU cleanups, from Toke Høiland-Jørgensen and Paul E. McKenney.

2) Fix bpf_skb_change_proto() IPv4/v6 GSO handling, from Maciej Żenczykowski.

3) Fix false positive kmemleak report for BPF ringbuf alloc, from Rustam Kovhaev.

4) Fix x86 JIT's extable offset calculation for PROBE_LDX NULL, from Ravi Bangoria.

5) Enable libbpf fallback probing with tracing under RHEL7, from Jonathan Edwards.

6) Clean up x86 JIT to remove unused cnt tracking from EMIT macro, from Jiri Olsa.

7) Netlink cleanups for libbpf to please Coverity, from Kumar Kartikeya Dwivedi.

8) Allow to retrieve ancestor cgroup id in tracing programs, from Namhyung Kim.

9) Fix lirc BPF program query to use user-provided prog_cnt, from Sean Young.

10) Add initial libbpf doc including generated kdoc for its API, from Grant Seltzer.

11) Make xdp_rxq_info_unreg_mem_model() more robust, from Jakub Kicinski.

12) Fix up bpfilter startup log-level to info level, from Gary Lin.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
1  2 
drivers/net/ethernet/amazon/ena/ena_netdev.c
drivers/net/ethernet/intel/ice/ice_txrx.c
drivers/net/ethernet/intel/ice/ice_xsk.c
drivers/net/ethernet/marvell/mvneta.c
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c

@@@ -239,48 -239,36 +239,48 @@@ static int ena_xdp_io_poll(struct napi_
  static int ena_xdp_tx_map_frame(struct ena_ring *xdp_ring,
                                struct ena_tx_buffer *tx_info,
                                struct xdp_frame *xdpf,
 -                              void **push_hdr,
 -                              u32 *push_len)
 +                              struct ena_com_tx_ctx *ena_tx_ctx)
  {
        struct ena_adapter *adapter = xdp_ring->adapter;
        struct ena_com_buf *ena_buf;
 -      dma_addr_t dma = 0;
 +      int push_len = 0;
 +      dma_addr_t dma;
 +      void *data;
        u32 size;
  
        tx_info->xdpf = xdpf;
 +      data = tx_info->xdpf->data;
        size = tx_info->xdpf->len;
 -      ena_buf = tx_info->bufs;
  
 -      /* llq push buffer */
 -      *push_len = min_t(u32, size, xdp_ring->tx_max_header_size);
 -      *push_hdr = tx_info->xdpf->data;
 +      if (xdp_ring->tx_mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_DEV) {
 +              /* Designate part of the packet for LLQ */
 +              push_len = min_t(u32, size, xdp_ring->tx_max_header_size);
  
 -      if (size - *push_len > 0) {
 +              ena_tx_ctx->push_header = data;
 +
 +              size -= push_len;
 +              data += push_len;
 +      }
 +
 +      ena_tx_ctx->header_len = push_len;
 +
 +      if (size > 0) {
                dma = dma_map_single(xdp_ring->dev,
 -                                   *push_hdr + *push_len,
 -                                   size - *push_len,
 +                                   data,
 +                                   size,
                                     DMA_TO_DEVICE);
                if (unlikely(dma_mapping_error(xdp_ring->dev, dma)))
                        goto error_report_dma_error;
  
 -              tx_info->map_linear_data = 1;
 -              tx_info->num_of_bufs = 1;
 -      }
 +              tx_info->map_linear_data = 0;
  
 -      ena_buf->paddr = dma;
 -      ena_buf->len = size;
 +              ena_buf = tx_info->bufs;
 +              ena_buf->paddr = dma;
 +              ena_buf->len = size;
 +
 +              ena_tx_ctx->ena_bufs = ena_buf;
 +              ena_tx_ctx->num_bufs = tx_info->num_of_bufs = 1;
 +      }
  
        return 0;
  
@@@ -289,6 -277,10 +289,6 @@@ error_report_dma_error
                          &xdp_ring->syncp);
        netif_warn(adapter, tx_queued, adapter->netdev, "Failed to map xdp buff\n");
  
 -      xdp_return_frame_rx_napi(tx_info->xdpf);
 -      tx_info->xdpf = NULL;
 -      tx_info->num_of_bufs = 0;
 -
        return -EINVAL;
  }
  
@@@ -300,6 -292,8 +300,6 @@@ static int ena_xdp_xmit_frame(struct en
        struct ena_com_tx_ctx ena_tx_ctx = {};
        struct ena_tx_buffer *tx_info;
        u16 next_to_use, req_id;
 -      void *push_hdr;
 -      u32 push_len;
        int rc;
  
        next_to_use = xdp_ring->next_to_use;
        tx_info = &xdp_ring->tx_buffer_info[req_id];
        tx_info->num_of_bufs = 0;
  
 -      rc = ena_xdp_tx_map_frame(xdp_ring, tx_info, xdpf, &push_hdr, &push_len);
 +      rc = ena_xdp_tx_map_frame(xdp_ring, tx_info, xdpf, &ena_tx_ctx);
        if (unlikely(rc))
                return rc;
  
 -      ena_tx_ctx.ena_bufs = tx_info->bufs;
 -      ena_tx_ctx.push_header = push_hdr;
 -      ena_tx_ctx.num_bufs = tx_info->num_of_bufs;
        ena_tx_ctx.req_id = req_id;
 -      ena_tx_ctx.header_len = push_len;
  
        rc = ena_xmit_common(dev,
                             xdp_ring,
@@@ -384,7 -382,6 +384,6 @@@ static int ena_xdp_execute(struct ena_r
        struct xdp_frame *xdpf;
        u64 *xdp_stat;
  
-       rcu_read_lock();
        xdp_prog = READ_ONCE(rx_ring->xdp_bpf_prog);
  
        if (!xdp_prog)
  
        ena_increase_stat(xdp_stat, 1, &rx_ring->syncp);
  out:
-       rcu_read_unlock();
        return verdict;
  }
  
@@@ -10,7 -10,6 +10,7 @@@
  #include "ice_txrx_lib.h"
  #include "ice_lib.h"
  #include "ice.h"
 +#include "ice_trace.h"
  #include "ice_dcb_lib.h"
  #include "ice_xsk.h"
  
@@@ -225,7 -224,6 +225,7 @@@ static bool ice_clean_tx_irq(struct ice
  
                smp_rmb();      /* prevent any other reads prior to eop_desc */
  
 +              ice_trace(clean_tx_irq, tx_ring, tx_desc, tx_buf);
                /* if the descriptor isn't done, no work yet to do */
                if (!(eop_desc->cmd_type_offset_bsz &
                      cpu_to_le64(ICE_TX_DESC_DTYPE_DESC_DONE)))
  
                /* unmap remaining buffers */
                while (tx_desc != eop_desc) {
 +                      ice_trace(clean_tx_irq_unmap, tx_ring, tx_desc, tx_buf);
                        tx_buf++;
                        tx_desc++;
                        i++;
                                dma_unmap_len_set(tx_buf, len, 0);
                        }
                }
 +              ice_trace(clean_tx_irq_unmap_eop, tx_ring, tx_desc, tx_buf);
  
                /* move us one more past the eop_desc for start of next pkt */
                tx_buf++;
@@@ -1086,7 -1082,7 +1086,7 @@@ int ice_clean_rx_irq(struct ice_ring *r
                u16 stat_err_bits;
                int rx_buf_pgcnt;
                u16 vlan_tag = 0;
 -              u8 rx_ptype;
 +              u16 rx_ptype;
  
                /* get the Rx desc from Rx ring based on 'next_to_clean' */
                rx_desc = ICE_RX_DESC(rx_ring, rx_ring->next_to_clean);
                 */
                dma_rmb();
  
 +              ice_trace(clean_rx_irq, rx_ring, rx_desc);
                if (rx_desc->wb.rxdid == FDIR_DESC_RXDID || !rx_ring->netdev) {
                        struct ice_vsi *ctrl_vsi = rx_ring->vsi;
  
                xdp.frame_sz = ice_rx_frame_truesize(rx_ring, size);
  #endif
  
-               rcu_read_lock();
                xdp_prog = READ_ONCE(rx_ring->xdp_prog);
-               if (!xdp_prog) {
-                       rcu_read_unlock();
+               if (!xdp_prog)
                        goto construct_skb;
-               }
  
                xdp_res = ice_run_xdp(rx_ring, &xdp, xdp_prog);
-               rcu_read_unlock();
                if (!xdp_res)
                        goto construct_skb;
                if (xdp_res & (ICE_XDP_TX | ICE_XDP_REDIR)) {
@@@ -1212,7 -1203,6 +1208,7 @@@ construct_skb
  
                ice_process_skb_fields(rx_ring, rx_desc, skb, rx_ptype);
  
 +              ice_trace(clean_rx_irq_indicate, rx_ring, rx_desc, skb);
                /* send completed skb up the stack */
                ice_receive_skb(rx_ring, skb, vlan_tag);
                skb = NULL;
@@@ -2194,8 -2184,6 +2190,8 @@@ ice_xmit_frame_ring(struct sk_buff *skb
        unsigned int count;
        int tso, csum;
  
 +      ice_trace(xmit_frame_ring, tx_ring, skb);
 +
        count = ice_xmit_desc_count(skb);
        if (ice_chk_linearize(skb, count)) {
                if (__skb_linearize(skb))
        return NETDEV_TX_OK;
  
  out_drop:
 +      ice_trace(xmit_frame_ring_drop, tx_ring, skb);
        dev_kfree_skb_any(skb);
        return NETDEV_TX_OK;
  }
@@@ -466,7 -466,6 +466,6 @@@ ice_run_xdp_zc(struct ice_ring *rx_ring
        struct ice_ring *xdp_ring;
        u32 act;
  
-       rcu_read_lock();
        /* ZC patch is enabled only when XDP program is set,
         * so here it can not be NULL
         */
                err = xdp_do_redirect(rx_ring->netdev, xdp, xdp_prog);
                if (err)
                        goto out_failure;
-               rcu_read_unlock();
                return ICE_XDP_REDIR;
        }
  
@@@ -503,7 -501,6 +501,6 @@@ out_failure
                break;
        }
  
-       rcu_read_unlock();
        return result;
  }
  
@@@ -528,7 -525,7 +525,7 @@@ int ice_clean_rx_irq_zc(struct ice_rin
                struct sk_buff *skb;
                u16 stat_err_bits;
                u16 vlan_tag = 0;
 -              u8 rx_ptype;
 +              u16 rx_ptype;
  
                rx_desc = ICE_RX_DESC(rx_ring, rx_ring->next_to_clean);
  
@@@ -1805,14 -1805,18 +1805,14 @@@ static void mvneta_rx_error(struct mvne
  }
  
  /* Handle RX checksum offload based on the descriptor's status */
 -static void mvneta_rx_csum(struct mvneta_port *pp, u32 status,
 -                         struct sk_buff *skb)
 +static int mvneta_rx_csum(struct mvneta_port *pp, u32 status)
  {
        if ((pp->dev->features & NETIF_F_RXCSUM) &&
            (status & MVNETA_RXD_L3_IP4) &&
 -          (status & MVNETA_RXD_L4_CSUM_OK)) {
 -              skb->csum = 0;
 -              skb->ip_summed = CHECKSUM_UNNECESSARY;
 -              return;
 -      }
 +          (status & MVNETA_RXD_L4_CSUM_OK))
 +              return CHECKSUM_UNNECESSARY;
  
 -      skb->ip_summed = CHECKSUM_NONE;
 +      return CHECKSUM_NONE;
  }
  
  /* Return tx queue pointer (find last set bit) according to <cause> returned
@@@ -2331,7 -2335,7 +2331,7 @@@ mvneta_swbm_build_skb(struct mvneta_por
  
        skb_reserve(skb, xdp->data - xdp->data_hard_start);
        skb_put(skb, xdp->data_end - xdp->data);
 -      mvneta_rx_csum(pp, desc_status, skb);
 +      skb->ip_summed = mvneta_rx_csum(pp, desc_status);
  
        for (i = 0; i < num_frags; i++) {
                skb_frag_t *frag = &sinfo->frags[i];
@@@ -2369,7 -2373,6 +2369,6 @@@ static int mvneta_rx_swbm(struct napi_s
        /* Get number of received packets */
        rx_todo = mvneta_rxq_busy_desc_num_get(pp, rxq);
  
-       rcu_read_lock();
        xdp_prog = READ_ONCE(pp->xdp_prog);
  
        /* Fairness NAPI loop */
@@@ -2447,7 -2450,6 +2446,6 @@@ next
                xdp_buf.data_hard_start = NULL;
                sinfo.nr_frags = 0;
        }
-       rcu_read_unlock();
  
        if (xdp_buf.data_hard_start)
                mvneta_xdp_put_buff(pp, rxq, &xdp_buf, &sinfo, -1);
@@@ -2531,7 -2533,7 +2529,7 @@@ err_drop_frame
                                     rx_bytes);
  
                        skb->protocol = eth_type_trans(skb, dev);
 -                      mvneta_rx_csum(pp, rx_status, skb);
 +                      skb->ip_summed = mvneta_rx_csum(pp, rx_status);
                        napi_gro_receive(napi, skb);
  
                        rcvd_pkts++;
                skb_put(skb, rx_bytes);
  
                skb->protocol = eth_type_trans(skb, dev);
 -
 -              mvneta_rx_csum(pp, rx_status, skb);
 +              skb->ip_summed = mvneta_rx_csum(pp, rx_status);
  
                napi_gro_receive(napi, skb);
        }
@@@ -3543,17 -3543,21 +3543,17 @@@ static void mvpp2_rx_error(struct mvpp2
  }
  
  /* Handle RX checksum offload */
 -static void mvpp2_rx_csum(struct mvpp2_port *port, u32 status,
 -                        struct sk_buff *skb)
 +static int mvpp2_rx_csum(struct mvpp2_port *port, u32 status)
  {
        if (((status & MVPP2_RXD_L3_IP4) &&
             !(status & MVPP2_RXD_IP4_HEADER_ERR)) ||
            (status & MVPP2_RXD_L3_IP6))
                if (((status & MVPP2_RXD_L4_UDP) ||
                     (status & MVPP2_RXD_L4_TCP)) &&
 -                   (status & MVPP2_RXD_L4_CSUM_OK)) {
 -                      skb->csum = 0;
 -                      skb->ip_summed = CHECKSUM_UNNECESSARY;
 -                      return;
 -              }
 +                   (status & MVPP2_RXD_L4_CSUM_OK))
 +                      return CHECKSUM_UNNECESSARY;
  
 -      skb->ip_summed = CHECKSUM_NONE;
 +      return CHECKSUM_NONE;
  }
  
  /* Allocate a new skb and add it to BM pool */
@@@ -3877,8 -3881,6 +3877,6 @@@ static int mvpp2_rx(struct mvpp2_port *
        int rx_done = 0;
        u32 xdp_ret = 0;
  
-       rcu_read_lock();
        xdp_prog = READ_ONCE(port->xdp_prog);
  
        /* Get number of received packets and clamp the to-do */
  
                skb_reserve(skb, MVPP2_MH_SIZE + MVPP2_SKB_HEADROOM);
                skb_put(skb, rx_bytes);
 -              mvpp2_rx_csum(port, rx_status, skb);
 +              skb->ip_summed = mvpp2_rx_csum(port, rx_status);
                skb->protocol = eth_type_trans(skb, dev);
  
                napi_gro_receive(napi, skb);
@@@ -4024,8 -4026,6 +4022,6 @@@ err_drop_frame
                        mvpp2_bm_pool_put(port, pool, dma_addr, phys_addr);
        }
  
-       rcu_read_unlock();
        if (xdp_ret & MVPP2_XDP_REDIR)
                xdp_do_flush_map();
  
@@@ -4789,8 -4789,9 +4785,8 @@@ static int mvpp2_open(struct net_devic
                goto err_cleanup_txqs;
        }
  
 -      /* Phylink isn't supported yet in ACPI mode */
 -      if (port->of_node) {
 -              err = phylink_of_phy_connect(port->phylink, port->of_node, 0);
 +      if (port->phylink) {
 +              err = phylink_fwnode_phy_connect(port->phylink, port->fwnode, 0);
                if (err) {
                        netdev_err(port->dev, "could not attach PHY (%d)\n",
                                   err);
@@@ -6698,19 -6699,6 +6694,19 @@@ static void mvpp2_acpi_start(struct mvp
                          SPEED_UNKNOWN, DUPLEX_UNKNOWN, false, false);
  }
  
 +/* In order to ensure backward compatibility for ACPI, check if the port
 + * firmware node comprises the necessary description allowing to use phylink.
 + */
 +static bool mvpp2_use_acpi_compat_mode(struct fwnode_handle *port_fwnode)
 +{
 +      if (!is_acpi_node(port_fwnode))
 +              return false;
 +
 +      return (!fwnode_property_present(port_fwnode, "phy-handle") &&
 +              !fwnode_property_present(port_fwnode, "managed") &&
 +              !fwnode_get_named_child_node(port_fwnode, "fixed-link"));
 +}
 +
  /* Ports initialization */
  static int mvpp2_port_probe(struct platform_device *pdev,
                            struct fwnode_handle *port_fwnode,
        port = netdev_priv(dev);
        port->dev = dev;
        port->fwnode = port_fwnode;
 -      port->has_phy = !!of_find_property(port_node, "phy", NULL);
        port->ntxqs = ntxqs;
        port->nrxqs = nrxqs;
        port->priv = priv;
        dev->max_mtu = MVPP2_BM_JUMBO_PKT_SIZE;
        dev->dev.of_node = port_node;
  
 -      /* Phylink isn't used w/ ACPI as of now */
 -      if (port_node) {
 +      if (!mvpp2_use_acpi_compat_mode(port_fwnode)) {
                port->phylink_config.dev = &dev->dev;
                port->phylink_config.type = PHYLINK_NETDEV;
  
                }
                port->phylink = phylink;
        } else {
 +              dev_warn(&pdev->dev, "Use link irqs for port#%d. FW update required\n", port->id);
                port->phylink = NULL;
        }