xdp: export xdp_rxq_info_unreg_mem_model
authorBjörn Töpel <bjorn.topel@intel.com>
Tue, 28 Aug 2018 12:44:26 +0000 (14:44 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 29 Aug 2018 19:25:53 +0000 (12:25 -0700)
Export __xdp_rxq_info_unreg_mem_model as xdp_rxq_info_unreg_mem_model,
so it can be used from netdev drivers. Also, add additional checks for
the memory type.

Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/net/xdp.h
net/core/xdp.c

index 0d5c6fb4b2e266f84c706df2d9c3f6e10fe8a6bc..0f25b3675c5cdb051c41b6d118bd5211c196a2a2 100644 (file)
@@ -136,6 +136,7 @@ void xdp_rxq_info_unused(struct xdp_rxq_info *xdp_rxq);
 bool xdp_rxq_info_is_reg(struct xdp_rxq_info *xdp_rxq);
 int xdp_rxq_info_reg_mem_model(struct xdp_rxq_info *xdp_rxq,
                               enum xdp_mem_type type, void *allocator);
+void xdp_rxq_info_unreg_mem_model(struct xdp_rxq_info *xdp_rxq);
 
 /* Drivers not supporting XDP metadata can use this helper, which
  * rejects any room expansion for metadata as a result.
index be6cb2f0e7222a254cd3d8c896038c2c18a8f739..654dbb19707e7c81cd37868b2badc270e4301896 100644 (file)
@@ -94,11 +94,21 @@ static void __xdp_mem_allocator_rcu_free(struct rcu_head *rcu)
        kfree(xa);
 }
 
-static void __xdp_rxq_info_unreg_mem_model(struct xdp_rxq_info *xdp_rxq)
+void xdp_rxq_info_unreg_mem_model(struct xdp_rxq_info *xdp_rxq)
 {
        struct xdp_mem_allocator *xa;
        int id = xdp_rxq->mem.id;
 
+       if (xdp_rxq->reg_state != REG_STATE_REGISTERED) {
+               WARN(1, "Missing register, driver bug");
+               return;
+       }
+
+       if (xdp_rxq->mem.type != MEM_TYPE_PAGE_POOL &&
+           xdp_rxq->mem.type != MEM_TYPE_ZERO_COPY) {
+               return;
+       }
+
        if (id == 0)
                return;
 
@@ -110,6 +120,7 @@ static void __xdp_rxq_info_unreg_mem_model(struct xdp_rxq_info *xdp_rxq)
 
        mutex_unlock(&mem_id_lock);
 }
+EXPORT_SYMBOL_GPL(xdp_rxq_info_unreg_mem_model);
 
 void xdp_rxq_info_unreg(struct xdp_rxq_info *xdp_rxq)
 {
@@ -119,7 +130,7 @@ void xdp_rxq_info_unreg(struct xdp_rxq_info *xdp_rxq)
 
        WARN(!(xdp_rxq->reg_state == REG_STATE_REGISTERED), "Driver BUG");
 
-       __xdp_rxq_info_unreg_mem_model(xdp_rxq);
+       xdp_rxq_info_unreg_mem_model(xdp_rxq);
 
        xdp_rxq->reg_state = REG_STATE_UNREGISTERED;
        xdp_rxq->dev = NULL;