netfilter: flowtable: add nf_flow_offload_work_alloc()
authorPablo Neira Ayuso <pablo@netfilter.org>
Sun, 5 Jan 2020 19:48:51 +0000 (20:48 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 16 Jan 2020 14:51:48 +0000 (15:51 +0100)
Add helper function to allocate and initialize flow offload work and use
it to consolidate existing code.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_flow_table_offload.c

index b879e673953f9534a83fcf6c38da8b58c0d0bac8..d161623107a18279413b7bd2f5d42da15f1e479c 100644 (file)
@@ -748,21 +748,35 @@ static void flow_offload_queue_work(struct flow_offload_work *offload)
        schedule_work(&nf_flow_offload_work);
 }
 
-void nf_flow_offload_add(struct nf_flowtable *flowtable,
-                        struct flow_offload *flow)
+static struct flow_offload_work *
+nf_flow_offload_work_alloc(struct nf_flowtable *flowtable,
+                          struct flow_offload *flow, unsigned int cmd)
 {
        struct flow_offload_work *offload;
 
        offload = kmalloc(sizeof(struct flow_offload_work), GFP_ATOMIC);
        if (!offload)
-               return;
+               return NULL;
 
-       offload->cmd = FLOW_CLS_REPLACE;
+       offload->cmd = cmd;
        offload->flow = flow;
        offload->priority = flowtable->priority;
        offload->flowtable = flowtable;
-       flow->flags |= FLOW_OFFLOAD_HW;
 
+       return offload;
+}
+
+
+void nf_flow_offload_add(struct nf_flowtable *flowtable,
+                        struct flow_offload *flow)
+{
+       struct flow_offload_work *offload;
+
+       offload = nf_flow_offload_work_alloc(flowtable, flow, FLOW_CLS_REPLACE);
+       if (!offload)
+               return;
+
+       flow->flags |= FLOW_OFFLOAD_HW;
        flow_offload_queue_work(offload);
 }
 
@@ -771,15 +785,11 @@ void nf_flow_offload_del(struct nf_flowtable *flowtable,
 {
        struct flow_offload_work *offload;
 
-       offload = kzalloc(sizeof(struct flow_offload_work), GFP_ATOMIC);
+       offload = nf_flow_offload_work_alloc(flowtable, flow, FLOW_CLS_DESTROY);
        if (!offload)
                return;
 
-       offload->cmd = FLOW_CLS_DESTROY;
-       offload->flow = flow;
-       offload->flow->flags |= FLOW_OFFLOAD_HW_DYING;
-       offload->flowtable = flowtable;
-
+       flow->flags |= FLOW_OFFLOAD_HW_DYING;
        flow_offload_queue_work(offload);
 }
 
@@ -793,14 +803,10 @@ void nf_flow_offload_stats(struct nf_flowtable *flowtable,
        if ((delta >= (9 * NF_FLOW_TIMEOUT) / 10))
                return;
 
-       offload = kzalloc(sizeof(struct flow_offload_work), GFP_ATOMIC);
+       offload = nf_flow_offload_work_alloc(flowtable, flow, FLOW_CLS_STATS);
        if (!offload)
                return;
 
-       offload->cmd = FLOW_CLS_STATS;
-       offload->flow = flow;
-       offload->flowtable = flowtable;
-
        flow_offload_queue_work(offload);
 }