Skip to content

Commit

Permalink
net: convert /proc/net/rt_acct to seq_file
Browse files Browse the repository at this point in the history
Rewrite statistics accumulation to be in terms of structure fields,
not raw u32 additions. Keep them in same order, though.

This is the last user of create_proc_read_entry() in net/,
please NAK all new ones as well as all new ->write_proc, ->read_proc and
create_proc_entry() users. Cc me if there are problems. :-)

Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Alexey Dobriyan authored and David S. Miller committed Nov 25, 2009
1 parent 09ad9bc commit a661c41
Showing 1 changed file with 33 additions and 35 deletions.
68 changes: 33 additions & 35 deletions net/ipv4/route.c
Original file line number Diff line number Diff line change
Expand Up @@ -513,43 +513,42 @@ static const struct file_operations rt_cpu_seq_fops = {
};

#ifdef CONFIG_NET_CLS_ROUTE
static int ip_rt_acct_read(char *buffer, char **start, off_t offset,
int length, int *eof, void *data)
{
unsigned int i;

if ((offset & 3) || (length & 3))
return -EIO;

if (offset >= sizeof(struct ip_rt_acct) * 256) {
*eof = 1;
return 0;
}

if (offset + length >= sizeof(struct ip_rt_acct) * 256) {
length = sizeof(struct ip_rt_acct) * 256 - offset;
*eof = 1;
static int rt_acct_proc_show(struct seq_file *m, void *v)
{
struct ip_rt_acct *dst, *src;
unsigned int i, j;

dst = kcalloc(256, sizeof(struct ip_rt_acct), GFP_KERNEL);
if (!dst)
return -ENOMEM;

for_each_possible_cpu(i) {
src = (struct ip_rt_acct *)per_cpu_ptr(ip_rt_acct, i);
for (j = 0; j < 256; j++) {
dst[j].o_bytes += src[j].o_bytes;
dst[j].o_packets += src[j].o_packets;
dst[j].i_bytes += src[j].i_bytes;
dst[j].i_packets += src[j].i_packets;
}
}

offset /= sizeof(u32);

if (length > 0) {
u32 *dst = (u32 *) buffer;

*start = buffer;
memset(dst, 0, length);

for_each_possible_cpu(i) {
unsigned int j;
u32 *src;
seq_write(m, dst, 256 * sizeof(struct ip_rt_acct));
kfree(dst);
return 0;
}

src = ((u32 *) per_cpu_ptr(ip_rt_acct, i)) + offset;
for (j = 0; j < length/4; j++)
dst[j] += src[j];
}
}
return length;
static int rt_acct_proc_open(struct inode *inode, struct file *file)
{
return single_open(file, rt_acct_proc_show, NULL);
}

static const struct file_operations rt_acct_proc_fops = {
.owner = THIS_MODULE,
.open = rt_acct_proc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
#endif

static int __net_init ip_rt_do_proc_init(struct net *net)
Expand All @@ -567,8 +566,7 @@ static int __net_init ip_rt_do_proc_init(struct net *net)
goto err2;

#ifdef CONFIG_NET_CLS_ROUTE
pde = create_proc_read_entry("rt_acct", 0, net->proc_net,
ip_rt_acct_read, NULL);
pde = proc_create("rt_acct", 0, net->proc_net, &rt_acct_proc_fops);
if (!pde)
goto err3;
#endif
Expand Down

0 comments on commit a661c41

Please sign in to comment.