To improve hardware offload debuggability extend struct netns_nftables with 'count_wq_del' counter and expose it to userspace as 'nf_flowtable_count_wq_del' sysctl entry. Increment the counter when allocating new workqueue task and decrement it after flow_offload_work_del() is finished. Signed-off-by: Vlad Buslov <vladbu@xxxxxxxxxx> Signed-off-by: Oz Shlomo <ozsh@xxxxxxxxxx> Reviewed-by: Paul Blakey <paulb@xxxxxxxxxx> --- include/net/netns/nftables.h | 1 + net/netfilter/nf_conntrack_standalone.c | 8 ++++++++ net/netfilter/nf_flow_table_offload.c | 3 +++ 3 files changed, 12 insertions(+) diff --git a/include/net/netns/nftables.h b/include/net/netns/nftables.h index ce270803ef27..ad6058d2b5f9 100644 --- a/include/net/netns/nftables.h +++ b/include/net/netns/nftables.h @@ -10,6 +10,7 @@ struct netns_nftables { int max_hw; atomic_t count_wq_add; int max_wq_add; + atomic_t count_wq_del; }; #endif diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index 26e2b86eb060..cebdf389f7eb 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c @@ -623,6 +623,7 @@ enum nf_ct_sysctl_index { NF_SYSCTL_CT_MAX_HW, NF_SYSCTL_CT_COUNT_WQ_ADD, NF_SYSCTL_CT_MAX_WQ_ADD, + NF_SYSCTL_CT_COUNT_WQ_DEL, #endif __NF_SYSCTL_CT_LAST_SYSCTL, @@ -1005,6 +1006,12 @@ static struct ctl_table nf_ct_sysctl_table[] = { .mode = 0644, .proc_handler = proc_dointvec, }, + [NF_SYSCTL_CT_COUNT_WQ_DEL] = { + .procname = "nf_flowtable_count_wq_del", + .maxlen = sizeof(int), + .mode = 0444, + .proc_handler = proc_dointvec, + }, #endif {} }; @@ -1147,6 +1154,7 @@ static int nf_conntrack_standalone_init_sysctl(struct net *net) table[NF_SYSCTL_CT_MAX_HW].data = &net->nft.max_hw; table[NF_SYSCTL_CT_COUNT_WQ_ADD].data = &net->nft.count_wq_add; table[NF_SYSCTL_CT_MAX_WQ_ADD].data = &net->nft.max_wq_add; + table[NF_SYSCTL_CT_COUNT_WQ_DEL].data = &net->nft.count_wq_del; #endif nf_conntrack_standalone_init_tcp_sysctl(net, table); diff --git a/net/netfilter/nf_flow_table_offload.c b/net/netfilter/nf_flow_table_offload.c index e29aa51696f5..82cd78c8eb25 100644 --- a/net/netfilter/nf_flow_table_offload.c +++ b/net/netfilter/nf_flow_table_offload.c @@ -965,6 +965,7 @@ static void flow_offload_work_handler(struct work_struct *work) break; case FLOW_CLS_DESTROY: flow_offload_work_del(offload); + atomic_dec(&net->nft.count_wq_del); break; case FLOW_CLS_STATS: flow_offload_work_stats(offload); @@ -1038,12 +1039,14 @@ void nf_flow_offload_add(struct nf_flowtable *flowtable, void nf_flow_offload_del(struct nf_flowtable *flowtable, struct flow_offload *flow) { + struct net *net = read_pnet(&flowtable->net); struct flow_offload_work *offload; offload = nf_flow_offload_work_alloc(flowtable, flow, FLOW_CLS_DESTROY); if (!offload) return; + atomic_inc(&net->nft.count_wq_del); set_bit(NF_FLOW_HW_DYING, &flow->flags); flow_offload_queue_work(offload); } -- 2.31.1