Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eea9e3a4 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'net-mlx5-use-indirect-call-wrappers'



Paolo Abeni says:

====================
net/mlx5: use indirect call wrappers

The mlx5_core driver uses several indirect calls in fast-path, some of them
are invoked on each ingress packet, even for the XDP-only traffic.

This series leverage the indirect call wrappers infrastructure the avoid
the expansive RETPOLINE overhead for 2 indirect calls in fast-path.

Each call is addressed on a different patch, plus we need to introduce a couple
of additional helpers to cope with the higher number of possible direct-call
alternatives.

v2 -> v3:
 - do not add more INDIRECT_CALL_* macros
 - use only the direct calls always available regardless of
   the mlx5 build options in the last patch

v1 -> v2:
 - update the direct call list and use a macro to define it,
   as per Saeed suggestion. An intermediated additional
   macro is needed to allow arg list expansion
 - patch 2/3 is unchanged, as the generated code looks better this way than
   with possible alternative (dropping BP hits)
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents d96ec975 55f96872
Loading
Loading
Loading
Loading
+19 −6
Original line number Original line Diff line number Diff line
@@ -34,6 +34,7 @@
#include <linux/ip.h>
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <linux/ipv6.h>
#include <linux/tcp.h>
#include <linux/tcp.h>
#include <linux/indirect_call_wrapper.h>
#include <net/ip6_checksum.h>
#include <net/ip6_checksum.h>
#include <net/page_pool.h>
#include <net/page_pool.h>
#include <net/inet_ecn.h>
#include <net/inet_ecn.h>
@@ -1092,7 +1093,10 @@ void mlx5e_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
	wi       = get_frag(rq, ci);
	wi       = get_frag(rq, ci);
	cqe_bcnt = be32_to_cpu(cqe->byte_cnt);
	cqe_bcnt = be32_to_cpu(cqe->byte_cnt);


	skb = rq->wqe.skb_from_cqe(rq, cqe, wi, cqe_bcnt);
	skb = INDIRECT_CALL_2(rq->wqe.skb_from_cqe,
			      mlx5e_skb_from_cqe_linear,
			      mlx5e_skb_from_cqe_nonlinear,
			      rq, cqe, wi, cqe_bcnt);
	if (!skb) {
	if (!skb) {
		/* probably for XDP */
		/* probably for XDP */
		if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) {
		if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) {
@@ -1279,8 +1283,10 @@ void mlx5e_handle_rx_cqe_mpwrq(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)


	cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe);
	cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe);


	skb = rq->mpwqe.skb_from_cqe_mpwrq(rq, wi, cqe_bcnt, head_offset,
	skb = INDIRECT_CALL_2(rq->mpwqe.skb_from_cqe_mpwrq,
					   page_idx);
			      mlx5e_skb_from_cqe_mpwrq_linear,
			      mlx5e_skb_from_cqe_mpwrq_nonlinear,
			      rq, wi, cqe_bcnt, head_offset, page_idx);
	if (!skb)
	if (!skb)
		goto mpwrq_cqe_out;
		goto mpwrq_cqe_out;


@@ -1327,7 +1333,8 @@ int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget)


		mlx5_cqwq_pop(cqwq);
		mlx5_cqwq_pop(cqwq);


		rq->handle_rx_cqe(rq, cqe);
		INDIRECT_CALL_2(rq->handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq,
				mlx5e_handle_rx_cqe, rq, cqe);
	} while ((++work_done < budget) && (cqe = mlx5_cqwq_get_cqe(cqwq)));
	} while ((++work_done < budget) && (cqe = mlx5_cqwq_get_cqe(cqwq)));


out:
out:
@@ -1437,7 +1444,10 @@ void mlx5i_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
	wi       = get_frag(rq, ci);
	wi       = get_frag(rq, ci);
	cqe_bcnt = be32_to_cpu(cqe->byte_cnt);
	cqe_bcnt = be32_to_cpu(cqe->byte_cnt);


	skb = rq->wqe.skb_from_cqe(rq, cqe, wi, cqe_bcnt);
	skb = INDIRECT_CALL_2(rq->wqe.skb_from_cqe,
			      mlx5e_skb_from_cqe_linear,
			      mlx5e_skb_from_cqe_nonlinear,
			      rq, cqe, wi, cqe_bcnt);
	if (!skb)
	if (!skb)
		goto wq_free_wqe;
		goto wq_free_wqe;


@@ -1469,7 +1479,10 @@ void mlx5e_ipsec_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
	wi       = get_frag(rq, ci);
	wi       = get_frag(rq, ci);
	cqe_bcnt = be32_to_cpu(cqe->byte_cnt);
	cqe_bcnt = be32_to_cpu(cqe->byte_cnt);


	skb = rq->wqe.skb_from_cqe(rq, cqe, wi, cqe_bcnt);
	skb = INDIRECT_CALL_2(rq->wqe.skb_from_cqe,
			      mlx5e_skb_from_cqe_linear,
			      mlx5e_skb_from_cqe_nonlinear,
			      rq, cqe, wi, cqe_bcnt);
	if (unlikely(!skb)) {
	if (unlikely(!skb)) {
		/* a DROP, save the page-reuse checks */
		/* a DROP, save the page-reuse checks */
		mlx5e_free_rx_wqe(rq, wi, true);
		mlx5e_free_rx_wqe(rq, wi, true);