Commit 73a6e372 authored by Andre Guedes's avatar Andre Guedes Committed by Tony Nguyen
Browse files

igc: Refactor __igc_xdp_run_prog()



Refactor __igc_xdp_run_prog() helper from igc_xdp_run_prog(),
preparing the code for AF_XDP zero-copy support which is added
by upcoming patches.

The existing igc_xdp_run_prog() caters to regular XDP rx path
which has to verify if bpf_prog is not NULL. Zero-copy
path assumes that bpf_prog is not NULL and hence this check is
not required. Therefore it makes sense to refactor the common
code into a helper function, to avoid code duplication.

Signed-off-by: default avatarAndre Guedes <andre.guedes@intel.com>
Signed-off-by: default avatarVedang Patel <vedang.patel@intel.com>
Signed-off-by: default avatarJithu Joseph <jithu.joseph@intel.com>
Reviewed-by: default avatarMaciej Fijalkowski <maciej.fijalkowski@intel.com>
Tested-by: default avatarDvora Fuxbrumer <dvorax.fuxbrumer@linux.intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 0c20f2d2
Loading
Loading
Loading
Loading
+28 −28
Original line number Diff line number Diff line
@@ -2020,38 +2020,22 @@ static int igc_xdp_xmit_back(struct igc_adapter *adapter, struct xdp_buff *xdp)
	return res;
}

static struct sk_buff *igc_xdp_run_prog(struct igc_adapter *adapter,
/* This function assumes rcu_read_lock() is held by the caller. */
static int __igc_xdp_run_prog(struct igc_adapter *adapter,
			      struct bpf_prog *prog,
			      struct xdp_buff *xdp)
{
	struct bpf_prog *prog;
	int res;
	u32 act;

	rcu_read_lock();
	u32 act = bpf_prog_run_xdp(prog, xdp);

	prog = READ_ONCE(adapter->xdp_prog);
	if (!prog) {
		res = IGC_XDP_PASS;
		goto unlock;
	}

	act = bpf_prog_run_xdp(prog, xdp);
	switch (act) {
	case XDP_PASS:
		res = IGC_XDP_PASS;
		break;
		return IGC_XDP_PASS;
	case XDP_TX:
		if (igc_xdp_xmit_back(adapter, xdp) < 0)
			res = IGC_XDP_CONSUMED;
		else
			res = IGC_XDP_TX;
		break;
		return igc_xdp_xmit_back(adapter, xdp) < 0 ?
			IGC_XDP_CONSUMED : IGC_XDP_TX;
	case XDP_REDIRECT:
		if (xdp_do_redirect(adapter->netdev, xdp, prog) < 0)
			res = IGC_XDP_CONSUMED;
		else
			res = IGC_XDP_REDIRECT;
		break;
		return xdp_do_redirect(adapter->netdev, xdp, prog) < 0 ?
			IGC_XDP_CONSUMED : IGC_XDP_REDIRECT;
	default:
		bpf_warn_invalid_xdp_action(act);
		fallthrough;
@@ -2059,10 +2043,26 @@ static struct sk_buff *igc_xdp_run_prog(struct igc_adapter *adapter,
		trace_xdp_exception(adapter->netdev, prog, act);
		fallthrough;
	case XDP_DROP:
		res = IGC_XDP_CONSUMED;
		break;
		return IGC_XDP_CONSUMED;
	}
}

static struct sk_buff *igc_xdp_run_prog(struct igc_adapter *adapter,
					struct xdp_buff *xdp)
{
	struct bpf_prog *prog;
	int res;

	rcu_read_lock();

	prog = READ_ONCE(adapter->xdp_prog);
	if (!prog) {
		res = IGC_XDP_PASS;
		goto unlock;
	}

	res = __igc_xdp_run_prog(adapter, prog, xdp);

unlock:
	rcu_read_unlock();
	return ERR_PTR(-res);