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: Andre Guedes <andre.guedes@intel.com> Signed-off-by: Vedang Patel <vedang.patel@intel.com> Signed-off-by: Jithu Joseph <jithu.joseph@intel.com> Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> Tested-by: Dvora Fuxbrumer <dvorax.fuxbrumer@linux.intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
committed by
Tony Nguyen
parent
0c20f2d29f
commit
73a6e37212
@@ -2020,12 +2020,38 @@ static int igc_xdp_xmit_back(struct igc_adapter *adapter, struct xdp_buff *xdp)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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)
|
||||||
|
{
|
||||||
|
u32 act = bpf_prog_run_xdp(prog, xdp);
|
||||||
|
|
||||||
|
switch (act) {
|
||||||
|
case XDP_PASS:
|
||||||
|
return IGC_XDP_PASS;
|
||||||
|
case XDP_TX:
|
||||||
|
return igc_xdp_xmit_back(adapter, xdp) < 0 ?
|
||||||
|
IGC_XDP_CONSUMED : IGC_XDP_TX;
|
||||||
|
case XDP_REDIRECT:
|
||||||
|
return xdp_do_redirect(adapter->netdev, xdp, prog) < 0 ?
|
||||||
|
IGC_XDP_CONSUMED : IGC_XDP_REDIRECT;
|
||||||
|
default:
|
||||||
|
bpf_warn_invalid_xdp_action(act);
|
||||||
|
fallthrough;
|
||||||
|
case XDP_ABORTED:
|
||||||
|
trace_xdp_exception(adapter->netdev, prog, act);
|
||||||
|
fallthrough;
|
||||||
|
case XDP_DROP:
|
||||||
|
return IGC_XDP_CONSUMED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct sk_buff *igc_xdp_run_prog(struct igc_adapter *adapter,
|
static struct sk_buff *igc_xdp_run_prog(struct igc_adapter *adapter,
|
||||||
struct xdp_buff *xdp)
|
struct xdp_buff *xdp)
|
||||||
{
|
{
|
||||||
struct bpf_prog *prog;
|
struct bpf_prog *prog;
|
||||||
int res;
|
int res;
|
||||||
u32 act;
|
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
|
||||||
@@ -2035,33 +2061,7 @@ static struct sk_buff *igc_xdp_run_prog(struct igc_adapter *adapter,
|
|||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
act = bpf_prog_run_xdp(prog, xdp);
|
res = __igc_xdp_run_prog(adapter, prog, xdp);
|
||||||
switch (act) {
|
|
||||||
case XDP_PASS:
|
|
||||||
res = IGC_XDP_PASS;
|
|
||||||
break;
|
|
||||||
case XDP_TX:
|
|
||||||
if (igc_xdp_xmit_back(adapter, xdp) < 0)
|
|
||||||
res = IGC_XDP_CONSUMED;
|
|
||||||
else
|
|
||||||
res = IGC_XDP_TX;
|
|
||||||
break;
|
|
||||||
case XDP_REDIRECT:
|
|
||||||
if (xdp_do_redirect(adapter->netdev, xdp, prog) < 0)
|
|
||||||
res = IGC_XDP_CONSUMED;
|
|
||||||
else
|
|
||||||
res = IGC_XDP_REDIRECT;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
bpf_warn_invalid_xdp_action(act);
|
|
||||||
fallthrough;
|
|
||||||
case XDP_ABORTED:
|
|
||||||
trace_xdp_exception(adapter->netdev, prog, act);
|
|
||||||
fallthrough;
|
|
||||||
case XDP_DROP:
|
|
||||||
res = IGC_XDP_CONSUMED;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
unlock:
|
unlock:
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|||||||
Reference in New Issue
Block a user