[PATCH v2 00/68] reduce use of rte_memcpy

Stephen Hemminger <[email protected]>
Newsgroups org.dpdk.dev
Message-ID <[email protected]>
The DPDK function rte_memcpy() only exists as an optimization
for shortcomings in performance of libc memcpy() on some platforms.
Many platforms have no special rte_memcpy() and just use memcpy().

But many analysis and test tools know that memcpy() is a special
case and check for overwrite, bounds errors etc. Therefore memcpy()
should be preferred where ever possible.

This patch series introduces a coccinelle script to find
calls to rte_memcpy() where size is fixed, and change them to
regular memcpy(). Many of the patch series is just the results
of that script.

There is also some cleanups to include rte_memcpy.h where it
was not being done before; the include was happening by some other header.
And also removal of rte_memcpy.h where no longer needed.

The result is a 45% reduction in use of rte_memcpy (1008 call
sites down to 551). The leftover cases are places where rte_memcpy
is used in data path; and test code for rte_memcpy.

v2:
  - reorder the series so it bisects cleanly: the patches adding
    the missing includes of rte_memcpy.h now come first, before
    any patch that removes an include or replaces a call. In v1
    those were at the end of the series, so intermediate commits
    could fail to build.
  - move the documentation patch describing when to use
    rte_memcpy() to the front of the series, so the rationale for
    the rest of the changes is established first.

Stephen Hemminger (68):
  devtools/cocci: add script to replace fixed size rte_memcpy
  lib: add missing include of rte_memcpy.h
  net: add missing include of rte_memcpy.h
  crypto: add missing include of rte_memcpy.h
  drivers: add missing include of rte_memcpy.h
  app: add missing include of rte_memcpy.h
  examples: add missing include of rte_memcpy.h
  eal: document when to use rte_memcpy
  app/testpmd: replace rte_memcpy with memcpy
  test: use memcpy instead of rte_memcpy
  app/graph: replace rte_memcpy with memcpy
  lpm: remove unnecessary include of rte_memcpy.h
  acl: remove unnecessary include of rte_memcpy.h
  drivers/bus: remove unnecessary include of rte_memcpy.h
  security: replace fixed size rte_memcpy
  ethdev: replace use of rte_memcpy
  net: replace use of rte_memcpy
  pdcp: replace use of rte_memcpy
  eventdev: replace fixed size rte_memcpy
  eal: replace rte_memcpy of cpuset
  cryptodev: replace use of rte_memcpy
  drivers/raw: use memcpy for fixed size data
  test-pipeline: replace use of rte_memcpy
  net/af_xdp: replace use of rte_memcpy
  net/avp: replace use of rte_memcpy
  net/axgbe: replace use of rte_memcpy
  net/bnx2x: replace use of rte_memcpy
  net/bnxt: replace use of rte_memcpy
  net/bonding: replace use of rte_memcpy
  net/cnxk: replace use of rte_memcpy
  net/cxgbe: replace use of rte_memcpy
  net/dpaa2: replace use of rte_memcpy
  net/enic: replace use of rte_memcpy
  net/failsafe: replace use of rte_memcpy
  net/gve: replace use of rte_memcpy
  net/hinic: replace use of rte_memcpy
  net/hns3: replace use of rte_memcpy
  net/mlx5: replace use of rte_memcpy
  net/mvpp2: replace use of rte_memcpy
  net/netvsc: replace use of rte_memcpy
  net/nfp: replace use of rte_memcpy
  net/ngbe: replace use of rte_memcpy
  net/ntnic: replace use of rte_memcpy
  net/null: replace use of rte_memcpy
  net/qede: replace use of rte_memcpy
  net/ring: replace use of rte_memcpy
  net/sfc: replace use of rte_memcpy
  net/txgbe: replace use of rte_memcpy
  net/vhost: replace use of rte_memcpy
  net/virtio: replace use of rte_memcpy
  net/sxe2: replace use of rte_memcpy
  net/zxdh: replace use of rte_memcpy
  net/memif: use memcpy for fixed size data
  net/ice: use memcpy for fixed size data
  test-bbdev: remove unnecessary include rte_memcpy.h
  drivers/mempool: use memcpy for fixed size data
  ml/cnxk: use memcpy for fixed size data
  drivers/event: use memcpy for fixed size data
  baseband/la12xx: use memcpy for fixed size data
  baseband/acc: replace use of rte_memcpy
  drivers/*/qat: use memcpy for fixed size data
  hash: replace use of rte_memcpy
  rib: remove rte_memcpy include
  pcapng: replace use of rte_memcpy
  efd: replace use of rte_memcpy
  net/xsc: replace use of rte_memcpy
  net/pcap: replace use of rte_memcpy
  power: replace use of rte_memcpy

 app/graph/ip4_output_hook.c                   |   1 +
 app/graph/neigh.c                             |   8 +-
 app/test-bbdev/test_bbdev.c                   |   1 -
 app/test-bbdev/test_bbdev_perf.c              |   1 +
 .../comp_perf_test_common.c                   |   1 +
 .../comp_perf_test_verify.c                   |   1 +
 app/test-dma-perf/benchmark.c                 |   1 +
 app/test-eventdev/test_pipeline_common.c      |   8 +-
 app/test-mldev/test_common.c                  |   1 +
 app/test-mldev/test_inference_common.c        |   1 +
 app/test-pipeline/config.c                    |   1 -
 app/test-pipeline/init.c                      |   1 -
 app/test-pipeline/main.c                      |   1 -
 app/test-pipeline/runtime.c                   |   1 -
 app/test-pmd/cmdline.c                        |  28 ++---
 app/test-pmd/cmdline_flow.c                   |  34 +++---
 app/test-pmd/config.c                         |  13 +--
 app/test-pmd/csumonly.c                       |   1 -
 app/test-pmd/flowgen.c                        |   1 -
 app/test-pmd/iofwd.c                          |   1 -
 app/test-pmd/macfwd.c                         |   1 -
 app/test-pmd/macswap.c                        |   1 -
 app/test-pmd/noisy_vnf.c                      |   1 -
 app/test-pmd/rxonly.c                         |   1 -
 app/test-pmd/testpmd.c                        |   1 -
 app/test-pmd/txonly.c                         |   7 +-
 app/test/commands.c                           |   1 -
 app/test/packet_burst_generator.c             |  10 +-
 app/test/test_bpf.c                           |   1 +
 app/test/test_compressdev.c                   |   1 +
 app/test/test_crc.c                           |   7 +-
 app/test/test_cryptodev.c                     |  14 +--
 app/test/test_cryptodev.h                     |   1 +
 app/test/test_cryptodev_asym.c                |   1 -
 app/test/test_cryptodev_crosscheck.c          |   1 +
 app/test/test_cryptodev_security_pdcp.c       |   1 -
 app/test/test_efd.c                           |   1 -
 app/test/test_efd_perf.c                      |   1 -
 app/test/test_event_crypto_adapter.c          |  13 ++-
 app/test/test_eventdev.c                      |   1 -
 app/test/test_link_bonding_mode4.c            |   8 +-
 app/test/test_mbuf.c                          |   1 -
 app/test/test_member.c                        |   1 -
 app/test/test_member_perf.c                   |   1 -
 app/test/test_rawdev.c                        |   1 -
 app/test/test_ring.h                          |  17 ++-
 app/test/test_security_inline_macsec.c        |   2 +-
 app/test/test_security_inline_proto.c         |  42 +++----
 app/test/test_security_proto.c                |   2 +-
 app/test/test_service_cores.c                 |   1 -
 app/test/test_thash.c                         |   4 +-
 app/test/virtual_pmd.c                        |   5 +-
 devtools/cocci/rte_memcpy_fixed.cocci         |  15 +++
 drivers/baseband/acc/rte_acc100_pmd.c         |   7 +-
 drivers/baseband/acc/rte_vrb_pmd.c            |  21 ++--
 drivers/baseband/la12xx/bbdev_la12xx.c        |   4 +-
 .../baseband/turbo_sw/bbdev_turbo_software.c  |   1 +
 drivers/bus/auxiliary/linux/auxiliary.c       |   1 -
 drivers/bus/fslmc/fslmc_bus.c                 |   1 -
 drivers/bus/fslmc/fslmc_vfio.c                |   1 -
 drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c      |   1 -
 drivers/bus/fslmc/portal/dpaa2_hw_dpci.c      |   1 -
 drivers/bus/fslmc/portal/dpaa2_hw_dpcon.c     |   1 -
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c      |   1 -
 drivers/bus/pci/linux/pci.c                   |   1 -
 drivers/common/mlx5/mlx5_common_mr.c          |   1 +
 drivers/common/qat/qat_qp.c                   |  10 +-
 drivers/compress/qat/qat_comp.c               |   8 +-
 drivers/crypto/armv8/rte_armv8_pmd.c          |   1 +
 drivers/crypto/caam_jr/caam_jr.c              |   1 +
 drivers/crypto/ccp/ccp_crypto.c               |  15 +--
 drivers/crypto/cnxk/cn10k_tls_ops.h           |   1 +
 drivers/crypto/cnxk/cn20k_tls_ops.h           |   1 +
 drivers/crypto/cnxk/cnxk_ae.h                 |   1 +
 drivers/crypto/cnxk/cnxk_se.h                 |   3 +-
 drivers/crypto/dpaa2_sec/dpaa2_sec_raw_dp.c   |   1 +
 drivers/crypto/dpaa_sec/dpaa_sec_raw_dp.c     |   1 +
 drivers/crypto/ipsec_mb/pmd_aesni_mb.c        |   1 +
 drivers/crypto/ipsec_mb/pmd_snow3g.c          |   5 +-
 drivers/crypto/mlx5/mlx5_crypto_gcm.c         |  11 +-
 drivers/crypto/mvsam/rte_mrvl_pmd.c           |   1 +
 drivers/crypto/openssl/rte_openssl_pmd.c      |   1 +
 drivers/crypto/qat/asym/qat_asym.c            |   1 +
 drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c  |   1 +
 .../crypto/qat/dev/qat_crypto_pmd_gen_lce.c   |   1 +
 drivers/crypto/qat/dev/qat_crypto_pmd_gens.h  |   1 +
 drivers/crypto/qat/qat_sym_session.c          |  33 +++---
 .../scheduler/rte_cryptodev_scheduler.c       |   7 +-
 drivers/crypto/scheduler/scheduler_failover.c |  12 +-
 drivers/crypto/virtio/virtio_cryptodev.c      |   1 +
 drivers/crypto/virtio/virtio_rxtx.c           |   1 +
 drivers/crypto/zsda/zsda_crypto_session.c     |   6 +-
 drivers/dma/dpaa2/dpaa2_qdma.c                |   1 +
 drivers/event/cnxk/cnxk_eventdev_selftest.c   |   1 -
 drivers/event/cnxk/cnxk_tim_evdev.c           |   4 +-
 drivers/event/dlb2/dlb2.c                     |   4 +-
 drivers/event/dpaa/dpaa_eventdev.c            |   1 -
 drivers/event/dpaa2/dpaa2_eventdev.c          |   3 +-
 drivers/event/dpaa2/dpaa2_eventdev_selftest.c |   1 -
 drivers/event/octeontx/ssovf_evdev_selftest.c |   1 -
 drivers/event/octeontx/timvf_evdev.c          |   4 +-
 drivers/mempool/dpaa/dpaa_mempool.c           |   4 +-
 drivers/mempool/dpaa2/dpaa2_hw_mempool.c      |   5 +-
 drivers/ml/cnxk/cn10k_ml_dev.c                |   1 +
 drivers/ml/cnxk/cn10k_ml_model.c              |   9 +-
 drivers/ml/cnxk/cn10k_ml_ops.c                |   9 +-
 drivers/ml/cnxk/cnxk_ml_io.c                  |   1 +
 drivers/ml/cnxk/tvmrt_ml_model.c              |   9 +-
 drivers/ml/cnxk/tvmrt_ml_ops.c                |   7 +-
 drivers/net/af_xdp/rte_eth_af_xdp.c           |   3 +-
 .../net/atlantic/hw_atl/hw_atl_utils_fw2x.c   |   1 +
 drivers/net/avp/avp_ethdev.c                  |   4 +-
 drivers/net/axgbe/axgbe_ethdev.c              |   4 +-
 drivers/net/bnx2x/bnx2x.c                     |  32 +++---
 drivers/net/bnx2x/bnx2x.h                     |   1 +
 drivers/net/bnx2x/ecore_sp.c                  |   1 +
 drivers/net/bnx2x/ecore_sp.h                  |   1 +
 drivers/net/bnxt/bnxt_flow.c                  |  34 +++---
 drivers/net/bonding/rte_eth_bond_8023ad.c     |   4 +-
 drivers/net/bonding/rte_eth_bond_flow.c       |   2 +-
 drivers/net/cnxk/cn10k_ethdev_sec.c           |   1 +
 drivers/net/cnxk/cn10k_rx.h                   |   1 +
 drivers/net/cnxk/cn20k_ethdev_sec.c           |   1 +
 drivers/net/cnxk/cn20k_rx.h                   |   1 +
 drivers/net/cnxk/cnxk_eswitch_devargs.c       |   3 +-
 drivers/net/cnxk/cnxk_ethdev_ops.c            |   3 +-
 drivers/net/cnxk/cnxk_rep.c                   |   3 +-
 drivers/net/cnxk/cnxk_rep_flow.c              |   7 +-
 drivers/net/cnxk/cnxk_rep_msg.c               |   9 +-
 drivers/net/cnxk/cnxk_rep_ops.c               |   3 +-
 drivers/net/cnxk/cnxk_tm.c                    |   5 +-
 drivers/net/cxgbe/clip_tbl.c                  |   2 +-
 drivers/net/cxgbe/cxgbe_ethdev.c              |   1 +
 drivers/net/cxgbe/cxgbe_filter.c              |   8 +-
 drivers/net/cxgbe/l2t.c                       |   4 +-
 drivers/net/cxgbe/sge.c                       |   1 +
 drivers/net/cxgbe/smt.c                       |  20 ++--
 drivers/net/dpaa/dpaa_rxtx.c                  |   1 +
 drivers/net/dpaa2/base/dpaa2_hw_dpni.c        |   1 -
 drivers/net/dpaa2/dpaa2_ethdev.c              |   1 -
 drivers/net/dpaa2/dpaa2_mux.c                 |  37 ++++---
 drivers/net/dpaa2/dpaa2_recycle.c             |   1 -
 drivers/net/dpaa2/dpaa2_rxtx.c                |   1 -
 drivers/net/dpaa2/dpaa2_sparser.c             |   1 -
 drivers/net/dpaa2/dpaa2_tm.c                  |   2 +-
 drivers/net/ena/ena_ethdev.c                  |   1 +
 drivers/net/ena/ena_rss.c                     |   1 +
 drivers/net/enic/enic_main.c                  |   6 +-
 drivers/net/failsafe/failsafe_ops.c           |  10 +-
 drivers/net/gve/base/gve_adminq.c             |   2 +-
 drivers/net/gve/gve_rx.c                      |   1 +
 drivers/net/gve/gve_tx.c                      |   1 +
 drivers/net/hinic/hinic_pmd_ethdev.c          |   1 -
 drivers/net/hinic/hinic_pmd_flow.c            |  41 ++++---
 drivers/net/hinic/hinic_pmd_tx.c              |   1 +
 drivers/net/hns3/hns3_fdir.c                  |   2 +-
 drivers/net/hns3/hns3_flow.c                  |   4 +-
 drivers/net/intel/ice/ice_fdir_filter.c       |   4 +-
 .../net/intel/idpf/idpf_common_rxtx_avx512.c  |   1 +
 drivers/net/ionic/ionic_rxtx.h                |   1 +
 drivers/net/memif/memif_socket.c              |   4 +-
 drivers/net/memif/rte_eth_memif.c             |   1 +
 drivers/net/mlx4/mlx4_rxtx.c                  |   1 +
 drivers/net/mlx5/linux/mlx5_ethdev_os.c       |   1 +
 drivers/net/mlx5/mlx5_devx.c                  |   4 +-
 drivers/net/mlx5/mlx5_flow.c                  |  39 +++----
 drivers/net/mlx5/mlx5_flow_aso.c              |   6 +-
 drivers/net/mlx5/mlx5_flow_dv.c               |   1 +
 drivers/net/mlx5/mlx5_flow_flex.c             |   1 +
 drivers/net/mlx5/mlx5_flow_hw.c               |  32 +++---
 drivers/net/mlx5/mlx5_rx.c                    |   6 +-
 drivers/net/mlx5/mlx5_rx.h                    |   1 +
 drivers/net/mlx5/mlx5_rxq.c                   |   1 +
 drivers/net/mlx5/mlx5_rxtx_vec.c              |   8 +-
 drivers/net/mlx5/mlx5_tx.h                    |   1 +
 drivers/net/mlx5/mlx5_txpp.c                  |   1 +
 drivers/net/mvpp2/mrvl_tm.c                   |   2 +-
 drivers/net/netvsc/hn_ethdev.c                |   1 -
 drivers/net/nfb/nfb_rx.h                      |   1 +
 drivers/net/nfb/nfb_tx.h                      |   1 +
 drivers/net/nfp/flower/nfp_conntrack.c        |   3 +-
 drivers/net/nfp/flower/nfp_flower_cmsg.c      |   1 +
 drivers/net/nfp/flower/nfp_flower_flow.c      |  16 +--
 drivers/net/nfp/nfp_mtr.c                     |  10 +-
 drivers/net/nfp/nfp_net_flow.c                |   1 +
 drivers/net/nfp/nfpcore/nfp_nsp.c             |   1 +
 drivers/net/ngbe/ngbe_pf.c                    |   4 +-
 drivers/net/ntnic/ntnic_ethdev.c              |  12 +-
 drivers/net/null/rte_eth_null.c               |  12 +-
 drivers/net/octeon_ep/otx_ep_rxtx.c           |   1 +
 drivers/net/pcap/pcap_ethdev.c                |   9 +-
 drivers/net/qede/qede_main.c                  |   2 +-
 drivers/net/ring/rte_eth_ring.c               |   1 -
 drivers/net/sfc/sfc.c                         |   2 +-
 drivers/net/sfc/sfc_ef10_tx.c                 |   2 +-
 drivers/net/sfc/sfc_ethdev.c                  |  12 +-
 drivers/net/sfc/sfc_flow.c                    |  20 ++--
 drivers/net/sfc/sfc_flow_rss.c                |   2 +-
 drivers/net/sfc/sfc_mae.c                     |   3 +-
 drivers/net/sfc/sfc_rx.c                      |   2 +-
 drivers/net/sfc/sfc_tbl_meta_cache.c          |   1 +
 drivers/net/sfc/sfc_tso.c                     |   3 +-
 drivers/net/sfc/sfc_tso.h                     |   9 +-
 drivers/net/sxe2/sxe2_cmd_chnl.c              |   6 +-
 drivers/net/sxe2/sxe2_flow.c                  |  11 +-
 drivers/net/sxe2/sxe2_flow_parse_pattern.c    |  36 +++---
 drivers/net/sxe2/sxe2_ipsec.c                 |   2 +-
 drivers/net/sxe2/sxe2_rss.c                   |  10 +-
 drivers/net/sxe2/sxe2_rx.c                    |   4 +-
 drivers/net/sxe2/sxe2_stats.c                 |  25 +++--
 drivers/net/sxe2/sxe2_tm.c                    |   4 +-
 drivers/net/txgbe/txgbe_ethdev.c              |   9 +-
 drivers/net/txgbe/txgbe_fdir.c                |  11 +-
 drivers/net/txgbe/txgbe_flow.c                |  73 ++++++------
 drivers/net/txgbe/txgbe_ipsec.c               |   8 +-
 drivers/net/txgbe/txgbe_pf.c                  |   6 +-
 drivers/net/txgbe/txgbe_tm.c                  |  11 +-
 drivers/net/vhost/rte_eth_vhost.c             |   1 -
 drivers/net/virtio/virtio_ethdev.c            |   1 -
 drivers/net/vmxnet3/vmxnet3_rxtx.c            |   1 +
 drivers/net/xsc/xsc_dev.c                     |   2 +-
 drivers/net/xsc/xsc_tx.c                      |   1 +
 drivers/net/zxdh/zxdh_common.c                |   7 +-
 drivers/net/zxdh/zxdh_flow.c                  |  67 ++++++-----
 drivers/net/zxdh/zxdh_msg.c                   |  15 +--
 drivers/net/zxdh/zxdh_mtr.c                   |  10 +-
 drivers/net/zxdh/zxdh_np.c                    |   1 -
 drivers/net/zxdh/zxdh_queue.c                 |   8 +-
 drivers/net/zxdh/zxdh_rxtx.c                  |   1 +
 drivers/net/zxdh/zxdh_tables.c                |  21 ++--
 drivers/power/acpi/acpi_cpufreq.c             |   4 +-
 drivers/power/amd_pstate/amd_pstate_cpufreq.c |   4 +-
 drivers/power/amd_uncore/amd_uncore.c         |   5 +-
 drivers/power/cppc/cppc_cpufreq.c             |   4 +-
 .../power/intel_pstate/intel_pstate_cpufreq.c |   3 +-
 drivers/power/intel_uncore/intel_uncore.c     |   5 +-
 drivers/raw/ifpga/afu_pmd_he_hssi.c           |   4 +-
 drivers/raw/ifpga/afu_pmd_he_lpbk.c           |   4 +-
 drivers/raw/ifpga/afu_pmd_he_mem.c            |   4 +-
 drivers/raw/ifpga/afu_pmd_n3000.c             |   8 +-
 drivers/raw/ifpga/ifpga_rawdev.c              |  11 +-
 drivers/raw/skeleton/skeleton_rawdev.c        |   8 +-
 drivers/raw/skeleton/skeleton_rawdev_test.c   |   1 -
 drivers/regex/mlx5/mlx5_rxp.c                 |   1 +
 examples/bbdev_app/main.c                     |   1 +
 examples/dma/dmafwd.c                         |   1 +
 examples/ipsec-secgw/esp.c                    |   1 +
 lib/acl/rte_acl_osdep.h                       |   1 -
 lib/cryptodev/rte_cryptodev.c                 |  12 +-
 lib/eal/common/eal_common_options.c           |   6 +-
 lib/eal/include/generic/rte_memcpy.h          |  18 +++
 lib/eal/x86/include/rte_memcpy.h              |   1 +
 lib/efd/rte_efd.c                             |   3 +-
 lib/ethdev/rte_ethdev.c                       |   3 +-
 lib/ethdev/rte_flow.c                         | 104 ++++++++----------
 lib/eventdev/rte_event_crypto_adapter.c       |   2 +-
 lib/graph/rte_graph_model_mcore_dispatch.c    |   1 +
 lib/hash/rte_thash.c                          |   4 +-
 lib/ipsec/esp_inb.c                           |   1 +
 lib/ipsec/esp_outb.c                          |   1 +
 lib/lpm/rte_lpm6.c                            |   1 -
 lib/net/rte_ether.c                           |   2 +-
 lib/node/interface_tx_feature.c               |   1 +
 lib/node/ip4_local.c                          |   1 +
 lib/node/ip4_lookup.c                         |   1 +
 lib/node/ip4_lookup_fib.c                     |   1 +
 lib/node/ip4_reassembly.c                     |   1 +
 lib/node/ip4_rewrite.c                        |   1 +
 lib/node/ip6_lookup.c                         |   1 +
 lib/node/ip6_lookup_fib.c                     |   1 +
 lib/node/ip6_rewrite.c                        |   1 +
 lib/node/pkt_cls.c                            |   1 +
 lib/node/udp4_input.c                         |   1 +
 lib/pcapng/rte_pcapng.c                       |   2 +-
 lib/pdcp/pdcp_process.c                       |  51 +++++----
 lib/port/rte_swx_port_source_sink.c           |   1 +
 lib/rib/rte_rib6.h                            |   1 -
 lib/security/rte_security.c                   |   4 +-
 lib/vhost/vhost.c                             |   1 +
 lib/vhost/vhost_crypto.c                      |   1 +
 280 files changed, 875 insertions(+), 807 deletions(-)
 create mode 100644 devtools/cocci/rte_memcpy_fixed.cocci

-- 
2.53.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.