dm-crypt: use __bio_add_page to add single page to clone bio
[linux-block.git] / net / netfilter / nf_flow_table_procfs.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 #include <linux/kernel.h>
3 #include <linux/proc_fs.h>
4 #include <net/netfilter/nf_flow_table.h>
5
6 static void *nf_flow_table_cpu_seq_start(struct seq_file *seq, loff_t *pos)
7 {
8         struct net *net = seq_file_net(seq);
9         int cpu;
10
11         if (*pos == 0)
12                 return SEQ_START_TOKEN;
13
14         for (cpu = *pos - 1; cpu < nr_cpu_ids; ++cpu) {
15                 if (!cpu_possible(cpu))
16                         continue;
17                 *pos = cpu + 1;
18                 return per_cpu_ptr(net->ft.stat, cpu);
19         }
20
21         return NULL;
22 }
23
24 static void *nf_flow_table_cpu_seq_next(struct seq_file *seq, void *v, loff_t *pos)
25 {
26         struct net *net = seq_file_net(seq);
27         int cpu;
28
29         for (cpu = *pos; cpu < nr_cpu_ids; ++cpu) {
30                 if (!cpu_possible(cpu))
31                         continue;
32                 *pos = cpu + 1;
33                 return per_cpu_ptr(net->ft.stat, cpu);
34         }
35         (*pos)++;
36         return NULL;
37 }
38
39 static void nf_flow_table_cpu_seq_stop(struct seq_file *seq, void *v)
40 {
41 }
42
43 static int nf_flow_table_cpu_seq_show(struct seq_file *seq, void *v)
44 {
45         const struct nf_flow_table_stat *st = v;
46
47         if (v == SEQ_START_TOKEN) {
48                 seq_puts(seq, "wq_add   wq_del   wq_stats\n");
49                 return 0;
50         }
51
52         seq_printf(seq, "%8d %8d %8d\n",
53                    st->count_wq_add,
54                    st->count_wq_del,
55                    st->count_wq_stats
56                 );
57         return 0;
58 }
59
60 static const struct seq_operations nf_flow_table_cpu_seq_ops = {
61         .start  = nf_flow_table_cpu_seq_start,
62         .next   = nf_flow_table_cpu_seq_next,
63         .stop   = nf_flow_table_cpu_seq_stop,
64         .show   = nf_flow_table_cpu_seq_show,
65 };
66
67 int nf_flow_table_init_proc(struct net *net)
68 {
69         struct proc_dir_entry *pde;
70
71         pde = proc_create_net("nf_flowtable", 0444, net->proc_net_stat,
72                               &nf_flow_table_cpu_seq_ops,
73                               sizeof(struct seq_net_private));
74         return pde ? 0 : -ENOMEM;
75 }
76
77 void nf_flow_table_fini_proc(struct net *net)
78 {
79         remove_proc_entry("nf_flowtable", net->proc_net_stat);
80 }