Prepare stmmac_xdp_run_prog() for AF_XDP zero-copy support which will be
added by upcoming patches by splitting out the XDP verdict processing
into __stmmac_xdp_run_prog() and it callable for XDP ZC path which does
not need to verify bpf_prog is not NULL.

The stmmac_xdp_run_prog() is used for regular XDP Rx path which requires
bpf_prog to be verified.

Signed-off-by: Ong Boon Leong <boon.leong....@intel.com>
---
 .../net/ethernet/stmicro/stmmac/stmmac_main.c | 35 ++++++++++++-------
 1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c 
b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 0804674e628e..329a3abbac76 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -4408,20 +4408,13 @@ static int stmmac_xdp_xmit_back(struct stmmac_priv 
*priv,
        return res;
 }
 
-static struct sk_buff *stmmac_xdp_run_prog(struct stmmac_priv *priv,
-                                          struct xdp_buff *xdp)
+/* This function assumes rcu_read_lock() is held by the caller. */
+static int __stmmac_xdp_run_prog(struct stmmac_priv *priv,
+                                struct bpf_prog *prog,
+                                struct xdp_buff *xdp)
 {
-       struct bpf_prog *prog;
-       int res;
        u32 act;
-
-       rcu_read_lock();
-
-       prog = READ_ONCE(priv->xdp_prog);
-       if (!prog) {
-               res = STMMAC_XDP_PASS;
-               goto unlock;
-       }
+       int res;
 
        act = bpf_prog_run_xdp(prog, xdp);
        switch (act) {
@@ -4448,6 +4441,24 @@ static struct sk_buff *stmmac_xdp_run_prog(struct 
stmmac_priv *priv,
                break;
        }
 
+       return res;
+}
+
+static struct sk_buff *stmmac_xdp_run_prog(struct stmmac_priv *priv,
+                                          struct xdp_buff *xdp)
+{
+       struct bpf_prog *prog;
+       int res;
+
+       rcu_read_lock();
+
+       prog = READ_ONCE(priv->xdp_prog);
+       if (!prog) {
+               res = STMMAC_XDP_PASS;
+               goto unlock;
+       }
+
+       res = __stmmac_xdp_run_prog(priv, prog, xdp);
 unlock:
        rcu_read_unlock();
        return ERR_PTR(-res);
-- 
2.25.1

Reply via email to